for文のブロック内に、さらにfor文を書くことをfor文のネスト(入れ子)といいます。
ここでは、for文の中で別のfor文を使う方法について説明します。
ネストとは
ネストとは、入れ物と中に入れ物を入れるようなイメージで、for文やif文などの文の中に、さらに文を入れるという意味です。
例えば、for文のブロック内にif文を書いたり、if文のブロック内にさらにif文を書いたり、さまざまな形のネストがあります。
今回は、その中でfor文のネストについて説明します。
for文のネストの仕組み
実際にプログラムを動かしてみると、ネストの動きを理解しやすいです。
次のプログラムを実行して結果を確認してみましょう。
#include <stdio.h>
int main(void)
{
int i;
int j;
for(i = 1; i <= 5; i++) {
for(j = 1; j <= 3; j++) {
printf("i=%d,j=%d ", i, j);
}
printf("\n");
}
return 0;
}次にプログラムの実行結果です。
i=1,j=1 i=1,j=2 i=1,j=3
i=2,j=1 i=2,j=2 i=2,j=3
i=3,j=1 i=3,j=2 i=3,j=3
i=4,j=1 i=4,j=2 i=4,j=3
i=5,j=1 i=5,j=2 i=5,j=3動作の流れ
- 外側の
for(i = 1; i <=5; i++)が実行されます。
このとき、iは1です。 - 次に内側の
for(j = 1; j <= 3; j++)が実行されます。jは1から3まで変化しながら、printf("i=%d,j=%d ", i, j);が3回実行されます。 jが4になると条件が偽になり、内側のfor文を抜けます。
その後、printf("\n");の実行により、改行されます。- 外側のfor文に戻り、
iが1増えて(2になる)、再び内側のfor文が実行されます。 - これを5回まで繰り返します。
つまり、外側のfor文は、「行(i)」を制御(1行ずつ進める)し、内側のfor文は「列(j)」を制御(1列ずつ進める)しています。
このように、for文をネストすると2重の繰り返し処理(行毎に例を繰り返すような処理)が実現します。
例えば、九九を表示したりすると分かりやすいかもしれません。
九九の結果を表示するプログラムです。
#include <stdio.h>
int main(void)
{
int i;
int j;
for(i = 1; i <= 9; i++) {
for(j = 1; j <= 9; j++) {
printf("%d ", i*j);
}
printf("\n");
}
return 0;
}実行結果
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81まとめ
- ネストとは、文の中に別の文を入れることをいう
- for文の中でさらにfor文を書くことを、for文のネストという
- 外側のfor文が1回実行されるごとに、内側のfor文はすべての回数を繰り返す
- 外側のfor文は「大きな繰り返し」、内側のfor文は「その中の細かい繰り返し」を担当する
- for文をネストすると、「行ごとに列を処理する」「組み合わせを順に処理する」ようなプログラムを作れる