C プログラミング (C Programming)

[2017/10/3, H.Aman]
[← 演習のページへ戻る]

サンプルプログラム 2 の内容

整数を繰り返し読み込み,読み込んだ整数の個数と合計値を表示する.
読み込みの終了は 0 を入力した時とする.ただし,最後に入力された 0 は個数に含めない.
 1:   #include <stdio.h>
 2:  	
 3:   int main(void){
 4: 	 int x, sum, cnt;
 5:
 6:      sum = 0;
 7:      cnt = 0;
 8:
 9:      do {
10:         printf("整数を一つ入力してください:");
11:         scanf("%d", &x);
12:         if ( x != 0 ){
13:            sum = sum + x;
14:            cnt = cnt + 1;
15:         }
16:      } while( x != 0 );
17:
18:      printf("入力を終了します\n");
19:
20:      printf("%d 個の数字の合計は %d です\n", cnt, sum);
21:
22:      return 0;
23:   }

9-16 行目:do{ ... } while ( x != 0 );

 8:
 9:      do {
10:         printf("整数を一つ入力してください:");
11:         scanf("%d", &x);
12:         if ( x != 0 ){
13:            sum = sum + x;
14:            cnt = cnt + 1;
15:         }
16:      } while( x != 0 );
17:

まず,基本的な流れとして,読み込んだ整数(ここでは x の値)が 0 でないならば繰り返す(終わらずに,次の整数を読み込む)ことになるので,その繰り返し構造を do - while 文で作っています.

6 行目,13 行目:sum = 0; sum = sum + x;

 5:
 6:      sum = 0;
 7:      cnt = 0;
 8:
 9:      do {
10:         printf("整数を一つ入力してください:");
11:         scanf("%d", &x);
12:         if ( x != 0 ){
13:            sum = sum + x;
14:            cnt = cnt + 1;
15:         }
16:      } while( x != 0 );
17:

まず,
13:            sum = sum + x;
ですが,sum という変数には合計値を記録させようとしています.

どうすればよいかと言うと,
  • x にはその直前に読み込んだ整数
  • sum にはそれまで読み込んだ整数(直前の x を除く)の合計値
が入っていると考えてみてください.
13 行目の式は,合計値 sum を更新しているのです:
新しい合計値 それまでの合計値 直前に読み込んだ整数
sum = sum + x

もちろん,1 回目の時点では「それまでの合計値」と言われても該当するものがありません
それゆえ,do - while の繰り返しが始まる前に,
 6:            sum = 0;
として,sum を 0 に設定しているのです.
sum に初期値を与えている」とか「sum を初期化している」などといいます.

7 行目,14 行目:cnt = 0; cnt = cnt + 1;

 5:
 6:      sum = 0;
 7:      cnt = 0;
 8:
 9:      do {
10:         printf("整数を一つ入力してください:");
11:         scanf("%d", &x);
12:         if ( x != 0 ){
13:            sum = sum + x;
14:            cnt = cnt + 1;
15:         }
16:      } while( x != 0 );
17:

もう一つの変数 cnt では,読み込んだ整数の個数を数えています.

上の sum よりもこちらの方が単純で,
新しい回数 それまでの回数
cnt = cnt + 1
という構造になっていますので,cnt の値はこの命令を実行するたびに +1 されます.

もちろん,1 回目の場合,「それまでの回数」というのは 0 ですので, 7 行目で cnt を 0 に初期化しているわけです.