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

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

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

自然数 n を読み込み,* 印を n 個表示する.
 1:   #include <stdio.h>
 2:  	
 3:   int main(void){
 4:      int k, n;
 5: 
 6:      printf("自然数を一つ入力してください:");
 7:      scanf("%d", &n);
 8:
 9:      for ( k = 1; k <= n; k++ ){
10:         printf("*");
11:      }
12:  
13:      printf("\n");
14:  
15:      return 0;
16:   }

前回学んだ while 文で書けば良いのでは?

このサンプルプログラムでやろうとしていること(目的)を達成するには,
* 印を出力する printf 文を n 回繰り返せばよいです.

ということは, 前回学んだ while 文を使って printf を繰り返すようにプログラムを書けばよいということになります.
しかしここではあえて,for 文という別の構造を使っています.

実のところ,while 文と(これから説明する) for 文は,書き方の違いだけで本質的には同じものです.

それゆえ,無理に for 文を使う必要はなく,while 文だけでも十分ではあるのですが,目的によっては for 文の方がスッキリ書けることが多いので, 両者をうまく使い分ける方がよいでしょう.

使い分けの代表的な基準としては,ひとまずは
  • 繰り返しの回数が決まっている場合: for 文を使う
  • 繰り返しの回数が決まっていない場合:while 文を使う
と考えてもらえればよいかと思います.

例えば,このサンプルプログラムのように,「処理を n 回繰り返す」という場合ならば for 文を使うのが一般的ですが,
「計算結果が 0 になるまで(0 でない限り)繰り返す」という場合では,事前に何回繰り返すかは分からないので while 文を使うのが一般的です.

9-11 行目: for ( k = 1; k <= n; k++ ){ ... }

 7:      scanf("%d", &n);
 8: 
 9:      for ( k = 1; k <= n; k++ ){
10:         printf("*");
11:      }
12:  
13:      printf("\n");

上では,for 文と while 文は本質的に同じものだと述べました.
そこでまずは,この for 文と全く同じ動作をする while 文を示します.
   k = 1;
   while ( k <= n ){
      printf("*");
      k++;
   }
両者がどのように対応しているか,見比べて見て下さい:
   k = 1;
   while ( k <= n ){   
      printf("*");
      k++;
   }

   for ( k = 1; k <= n; k++ ){   
      printf("*");
   }

while 文も for 文も繰り返しの条件(k <= n)は同じです.
そして,while 文での繰り返しの前に行う初期化(k = 1)と 繰り返しブロック内の最後に(次の繰り返しに備えて)k の値をインクリメントしている部分(k++)が for 文では条件を前後に挟むかたちで(セミコロン;で区切って)まとめて書かれています.

このように繰り返しで使われる変数(この場合は k )のことを専門用語で制御変数といいます.

制御変数を使って繰り返しを行う場合,for 文の方がひとまとまりにスッキリと書けます.

もしも while 文の方で k++; を書き忘れてしまうと繰り返しが終わらない(専門用語で無限ループといいます)状態に陥ってしまいます.

13 行目: printf("\n");

 9:      for ( k = 1; k <= n; k++ ){
10:         printf("*");
11:      }
12:  
13:      printf("\n");
14:
15:      return 0;

for 文での繰り返しが終わった後に,再度,改行文字を出力していますが, 改行を行わないままプログラムの実行が終わってしまって表示が見にくくなるのを防ぐためのものです.