★基本制御文(反復構造:ネスト2)★
前回、何かの命令の{}の中に別の命令を書くことをネストという、と書きました。
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;
}
|
<実行結果 VC++ Express Edition>
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;
}
|
<実行結果 VC++ Express Edition>
*****
*****
*****
*****
*****
続行するには何かキーを押してください・・・
< 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;
}
|
<実行結果 VC++ Express Edition>
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」が1の時、「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;
}
|
<実行結果 VC++ Express Edition>
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 | j | i | j | i | j | i | j | i | j | i | j | i | j | i | j | i | j | i | j | |||||||||
| 0 | 0 | 1 | 0 | 2 | 0 | 3 | 0 | 4 | 0 | 5 | 0 | 6 | 0 | 7 | 0 | 8 | 0 | 9 | 0 | |||||||||
| 0 | 1 | 1 | 1 | 2 | 1 | 3 | 1 | 4 | 1 | 5 | 1 | 6 | 1 | 7 | 1 | 8 | 1 | 9 | 1 | |||||||||
| 0 | 2 | 1 | 2 | 2 | 2 | 3 | 2 | 4 | 2 | 5 | 2 | 6 | 2 | 7 | 2 | 8 | 2 | 9 | 2 | |||||||||
| 0 | 3 | 1 | 3 | 2 | 3 | 3 | 3 | 4 | 3 | 5 | 3 | 6 | 3 | 7 | 3 | 8 | 3 | 9 | 3 | |||||||||
| 0 | 4 | 1 | 4 | 2 | 4 | 3 | 4 | 4 | 4 | 5 | 4 | 6 | 4 | 7 | 4 | 8 | 4 | 9 | 4 | |||||||||
| 0 | 5 | 1 | 5 | 2 | 5 | 3 | 5 | 4 | 5 | 5 | 5 | 6 | 5 | 7 | 5 | 8 | 5 | 9 | 5 | |||||||||
| 0 | 6 | 1 | 6 | 2 | 6 | 3 | 6 | 4 | 6 | 5 | 6 | 6 | 6 | 7 | 6 | 8 | 6 | 9 | 6 | |||||||||
| 0 | 7 | 1 | 7 | 2 | 7 | 3 | 7 | 4 | 7 | 5 | 7 | 6 | 7 | 7 | 7 | 8 | 7 | 9 | 7 | |||||||||
| 0 | 8 | 1 | 8 | 2 | 8 | 3 | 8 | 4 | 8 | 5 | 8 | 6 | 8 | 7 | 8 | 8 | 8 | 9 | 8 | |||||||||
| 0 | 9 | 1 | 9 | 2 | 9 | 3 | 9 | 4 | 9 | 5 | 9 | 6 | 9 | 7 | 9 | 8 | 9 | 9 | 9 |
左から、「i」が0の時、「j」は「0〜9」まで変化し、
次に「i」が1増加して1になり、「j」はまた「0〜9」まで変化し・・・これを繰り返します。
当然、繰り返しの回数によってこの値は変化しますが、この表のイメージをしっかりと持っておいてください。
当分の間、これを使って練習していきます。
※思ったより表が小さいので、作り直します・・・