ループの中のループ(ループの入れ子)

C言語初級カテゴリのロゴ画像 C言語初級

for文の中にfor文を入れるなどして、ループの入れ子状態を作ることができます。
ループの入れ子とは、ループ処理の中に別のループ処理が存在する状態です。
ループの入れ子の基本的なプログラム利用例をみていきます。

ループの入れ子基本的なプログラム

for_ireko.c

/* ループの中のループ */
#include <stdio.h>

int main(void)
{
	int i, j;

	for(i=0; i<2; i++){
		for(j=0; j<3; j++){
			printf("i: %d\tj: %d\n", i, j);
		}
	}

	printf("最終的な値\ni: %d\tj: %d\n", i, j);

	return 0;
}

実行結果

i: 0 j: 0
i: 0 j: 1
i: 0 j: 2
i: 1 j: 0
i: 1 j: 1
i: 1 j: 2
最終的な値
i: 2 j: 3

解説

このプログラムは、カウンタ変数 i を使った外側のループとカウンタ変数 j を使った内側のループで成り立っています。

イメージ図

外側の i のループは、2回繰り返す条件になっています。(for文の i=0; i<2; i++ の部分)
外側ループの処理である j の内側ループは2度繰り返されることになります。実行結果をみて下さい。j: 0, j: 1, j:2 の表示が2度連続していることが分かります。

i: 0 j: 0
i: 0 j: 1
i: 0 j: 2
i: 1 j: 0
i: 1 j: 1
i: 1 j: 2
最終的な値
i: 2 j: 3

内側ループの処理であるprintf関数

printf(“i: %d\tj: %d\n”, i, j);

の部分は 外側ループ繰り返し回数 × 内側ループ繰り返し回数 の数だけ、すなわち 2 × 3 = 6回 実行されることになります。

次はループの入れ子を使った利用例を見ていきます。

ループの入れ子で九九を表示する

先ほどの基本例では i が0の時、j は 0~2と繰り返され、i が1の時も j は0~2と繰り返しました。
このような法則を持つ身近なものに九九があります。

九九は1の段から9の段までそれぞれに1~9を掛けて表現するものです。

プログラムで表してみます。

kuku.c

/* 入れ子で九九を表現する */
#include <stdio.h>

int main(void)
{
	int i, j;

	for(i=1; i<=9; i++){
		for(j=1; j<=9; j++){
			printf("%3d", 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

1~9の段までそれぞれに1~9を掛けるため、外側ループと内側ループの条件は基本的に同じです。

for(i=1; i<=9; i++){
	for(j=1; j<=9; j++){
		/* 処理 */
	}
}

九九の表示はカウンタ変数同士を掛けているだけです。(printfの書式で %3d としているのは表示の際に隙間を空けるため)

printf(“%3d”, i * j );

段ごとに改行をする必要があるので、内側のfor文が終了したらprintf関数で改行を実行するようにしています。

for(i=1; i<=9; i++){
	for(j=1; j<=9; j++){
		printf("%3d", i*j);
	}
	printf("\n");	/* 段ごとの改行 */
}

一応これで九九の表示ができましたが、もう少し見た目を分かりやすくしてみました。

kuku_hyo.c

/* 九九一覧表 */
#include <stdio.h>

int main(void)
{
	int i, j;

	for(i=1; i<=9; i++){
		printf("%dの段\t", i);	/* 段数表示 */
		for(j=1; j<=9; j++){
			printf("%3d", i*j);	/* 九九の表示 */
		}
		printf("\n");	/* 段ごとの改行 */
	}

	return 0;
}

実行結果

1の段    1  2  3  4  5  6  7  8  9
2の段    2  4  6  8 10 12 14 16 18
3の段    3  6  9 12 15 18 21 24 27
4の段    4  8 12 16 20 24 28 32 36
5の段    5 10 15 20 25 30 35 40 45
6の段    6 12 18 24 30 36 42 48 54
7の段    7 14 21 28 35 42 49 56 63
8の段    8 16 24 32 40 48 56 64 72
9の段    9 18 27 36 45 54 63 72 81

小学校で習った九九の表らしくなりました。

以上、ループの入れ子の基本的なプログラムと利用例でした。

コメント

タイトルとURLをコピーしました