for 文は while 文で良く出てくるパターンをまとめた構文です。特定の回数だけ処理を繰返す要な場合によく用いられます。実際に、同じ処理を while 文と for 文で行う場合を見てみましょう。
while 文の場合 (擬似コード)
i = 0;
while (i < n){
[繰返される処理]
i++;
}
このコードは、[繰返される処理]の部分に書かれた処理を n 回繰返すコードです。行っている処理は次のとおりです。
最初の行の i = 0; でi を0に初期化します。
while 内の処理は i が n より小さい間は繰り返されます。つまり、 条件式 i < n が成り立つ間、ということです。
while のコードブロックの最後に i++; があることに注目して下さい。while のループが一回実行されるごとに i の値は 1 づつ大きくなります。(以前でてきた「インクリメント」です。)
この結果、ループが n 回実行されると i の値は n になり、while の条件式が満たされなくなり、繰返し処理は終了します。
これを for 文で書き直すと次のようになります。
for 文の場合(擬似コード)
for ( i = 0; i < n; i++){
[繰返される処理]
}
for の直後にあるある( ) の中に、セミコロン ( ; ) で区切って以下の 3 つがまとめて記述されています。
初期化 i = 0。 while の解説の 1 に相当します。
条件式 i < n。while の解説の 2 に相当します。
ループ一回ごとの i のインクリメント。 while の解説の 3 に相当します。
この様に、for 文を使うと、「指定回数繰返す」処理をわかりやすく(読みやすく)書くことができます。
以下のプログラムは、テキスト p. 90, List 4-11 です。まず、コードを読んでなにをするプログラムか考えてみてください。次に、実際に動かして、なにが起こるか確認してみましょう。
/* 読み込んだ正の整数値までカウントアップ(for文) */
#include <stdio.h>
int main (void)
{
int i, no;
printf("正の整数を入力してください:");
scanf("%d", &no);
for (i = 0; i <= no; i++)
printf("%d ", i);
putchar('\n');
return (0);
}
このプログラムの for 文の部分は以下のように while を使って書くことも出来ます。しかし for 文を用いることによって繰り返しに関する部分を1箇所にまとめることが出来るのでプログラムが読みやすくなります。
i = 0;
while(i <= no){
printf("%d ", i);
i++;
}
for 文や前回学習した do文、while 文はいずれも自由に入れ子にすることができます。例をみてみましょう。
/* for文の2重ループの例 縦横に*を並べて正方形を描画(テキストのList 4-17を参照) */
#include <stdio.h>
int main(void)
{
int i, j;
int width;
puts("正方形を作りましょう。");
printf("幅:");
scanf("%d", &width);
for (i = 0; i <= width; i++){
for (j = 0; j <= width; j++){
putchar('*'); /* 内側のループの処理 */
}
putchar('\n'); /* 外側のループの処理 */
}
return (0);
}
「内側のループの処理」と書かれた行と、「外側のループの処理」と書かれた行がそれぞれどのように、何回実行されるか考えながらソースコードを読んでみましょう。
Tips:
多重ループを作る際は、文頭に適切に tab (空白)を挿入して、どの閉じカッコ( } )がどの for に対応しているかわかるようにしましょう。for と } の行頭に同じ数の tab を挿入するということです。さらに、for ループの中の処理は、対応する for よりも tab の数を一個増やしておきます。これによって、その処理が for の「中」にあるということがわかりやすくなります。C 言語の使用上、この tab は無くても動きますが、プログラムを書く際には必ず適切に tab を挿入するようにしてください。(不適切な tab は期末試験では減点対象になります。いまからきちんと tab を入れる週間をつけておきましょう。)
この例のように外側のループを制御する変数が内側のループと関係しないこともありますが、次の例のように、外側の処理によって内側のループの回数を制御することもよくあります。使えるようにしておいて下さい。(テキストList 4-18)
/* for文の2重ループの例 その2 直角三角形(左下が直角)を表示 */
#include <stdio.h>
int main(void)
{
int i, j, ln;
printf("何段ですか:");
scanf("%d", &ln);
for (i = 0; i <= ln; i++){
for (j = 0; j <= i; j++)
putchar('*');
putchar('\n');
}
return (0);
}
テキストの List 4-16 (p. 96) を参考にして、下記のような九九の表を作成するプログラムを作成せよ。
実行例
1×1= 1 1×2= 2 1×3= 3 1×4= 4 1×5= 5 1×6= 6 1×7= 7 1×8= 8 1×9= 9
2×1= 2 2×2= 4 2×3= 6 2×4= 8 2×5=10 2×6=12 2×7=14 2×8=16 2×9=18
3×1= 3 3×2= 6 3×3= 9 3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27
4×1= 4…
5×1= 5…
6×1= …
7×1=…
8×1=…
9×1=…