前回、何かの命令の{}の中に別の命令を書くことをネストという、と書きました。
whileの中にwhileを書くこともネストなのですが、繰り返し(ループ)の中に繰り返しを書くという意味で、多重ループといいます。
前回のプログラムは「*」を5個表示するプログラムを「5回繰り返す」ので、二重ループとなります。
今後は、「二重ループ」という名前を使っていきます。
※繰り返しも「ループ」という呼び方にします。
さらにもう1つ、
これまで、繰り返しのカウント用に「counter」という変数を用いてきました。
「数を数える」という意味でこのような変数名をつけていましたが、少し変えていきましょう。
変数名は、その変数の役割を表す名前を付けることが重要ですが、「慣例」として使われている名称もあります。
その1つが、繰り返し用のカウンタ「i」や「j」という名前です。
これは、入門書やネット上のプログラムでもよく見かけると思います。
例として、「二重ループ」ではなく、単純なループを使ったプログラムを書き換えてみます。
「0〜9まで表示するプログラム」<sample program 030-01>を「i」を使って書き換えます。
#include <stdio.h> int main(void) { int i; i = 0; while (i < 10) { printf("%2d", i); i++; } printf("\n"); return 0; } |
<実行結果>
0 1 2 3 4 5 6 7 8 9 続行するには何かキーを押してください・・・
「counter」の代わりに「i」を使っています。
ループが1つしかない場合、「i」を使います。
「%2d」という部分については、<sample program 036-04>で書きましたが、「10進整数2桁」で表示しています。
次に、前回の「二重ループ」のプログラムを「i」「j」を使って書くと以下のようになります。
#include <stdio.h> int main(void) { int i; int j; i = 0; while (i < 5) { j = 0; while (j < 5) { printf("*"); j++; } printf("\n"); i++; } return 0; } |
<実行結果>
***** ***** ***** ***** ***** 続行するには何かキーを押してください・・・
<sample program 051-04>を「i」「j」を使って書き換えました。
「counter1」を「j」に、「counter2」を「i」に変更しています。
これは、「慣例」として「i」を外側のループ、「j」を内側のループに適用することが多いからです。
※慣れている人にとって、「i」と「j」が逆の位置にあるだけで、見づらいと感じることがあります。
これらを踏まえた上で、次のプログラムを考えてみましょう。
上に書いた、<sample program 052-01>を10回繰り返すプログラムを作ってみてください。
解答例です。
#include <stdio.h> int main(void) { int i; int j; i = 0; while (i < 10) { j = 0; while (j < 10) { printf("%2d", j); j++; } printf("\n"); i++; } return 0; } |
<実行結果>
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 続行するには何かキーを押してください・・・
「i」と「j」の位置に注意してください。
「i」は外側、「j」は内側のループで使用しています。
しっかりとイメージを持ってもらうために、このプログラムでの「i」と「j」の関係について書きます。
まず、外側のループ用カウンタである「i」が0で初期化されています。
その後、内側のループ用カウンタ「j」が0になります。
「i」が0の時、「j」は0〜9まで繰り返され「10になったらループを抜けます」。
次に「i」が1になります。
「i」が1の時、「j」は0〜9まで繰り返され「10になったらループを抜けます」。
次に「i」が2になります。
「i」が2の時、「j」は0〜9まで繰り返され「10になったらループを抜けます」。
・
・
・
以降、「i」が「10になってループを抜けるまで繰り返されます」。
※途中までで構いませんので、トレースしてみてください。
「i」が1増えるごとに、「j」は10回ループしていますから、次の行
printf("%2d", j);
は、100回実行されていることになります。
本当に100回実行されているかどうか、試してみましょう。
<sample program 052-04>
#include <stdio.h> int main(void) { int i; int j; int counter; counter = 0; i = 0; while (i < 10) { j = 0; while (j < 10) { printf("%2d", j); counter++; j++; } printf("\n"); i++; } printf("counter = %d\n", counter); return 0; } |
<実行結果>
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 counter = 100 続行するには何かキーを押してください・・・
何回実行されているか調べるために「counter」という変数を追加しました。
実際に実行してみると、結果は「counter = 100」と表示されます。
では、「i」と「j」の関係を表にしたものを載せておきます。
左から、「i」が0の時、「j」は「0〜9」まで変化し、
次に「i」が1増加して1になり、「j」はまた「0〜9」まで変化し・・・これを繰り返します。
当然、繰り返しの回数によってこの値は変化しますが、この表のイメージをしっかりと持っておいてください。
当分の間、これを使って練習していきます。