【C言語】第2章第8回:ネストされたループの記述方法と注意点
ネストされたループ(入れ子構造のループ)は、多次元データの処理や表形式の出力などに欠かせない技法です。この章では、基本的な記述方法と注意点を詳しく解説します。
1. ネストされたループとは?
ネストされたループは、1つのループの中に別のループが入った構造です。主に多次元の繰り返し処理に使用されます。
基本構造
for (外側のループ条件) {
for (内側のループ条件) {
// 内側のループ処理
}
// 外側のループ処理
}
例:外側のループが行を管理し、内側のループが列を管理します。
2. 基本的な例:九九の掛け算表
以下のプログラムは、九九の掛け算表を生成します。
#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) { // 行を管理
for (int j = 1; j <= 9; j++) { // 列を管理
printf("%2d ", i * j); // 掛け算の結果を出力
}
printf("\n"); // 行の終了時に改行
}
return 0;
}
解説:
i
:行(1から9まで)を管理。j
:列(1から9まで)を管理。printf("%2d ", i * j)
:i
とj
の掛け算結果を出力します。
3. 実用例:2次元配列の出力
ネストされたループは、2次元配列のデータ処理にも利用されます。
#include <stdio.h>
int main() {
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < 3; i++) { // 行を管理
for (int j = 0; j < 3; j++) { // 列を管理
printf("%d ", matrix[i][j]); // 各要素を出力
}
printf("\n"); // 行の終了時に改行
}
return 0;
}
解説:2次元配列matrix
の全要素を出力します。
4. 注意点:効率的なネスト構造の設計
ネストされたループの設計には以下の点に注意しましょう:
- ループ回数を最小限に抑える(必要以上の計算を避ける)。
- 処理対象のサイズ(配列の大きさなど)を動的に設定する場合、
#define
や定数を活用。 - 深いネスト(3重以上)を避ける。複雑な処理は関数に分割。
5. 練習問題
以下の課題に挑戦し、ネストされたループの使い方を練習してください。
- 5行5列の星(
*
)パターンを出力するプログラムを作成してください。 - ユーザーに行数と列数を入力させ、そのサイズの長方形を
*
で描画するプログラムを作成してください。 - 2次元配列のすべての要素を1ずつ増加させて出力するプログラムを作成してください。
6. 練習問題の解答と解説
問1の解答
#include <stdio.h>
int main() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("* "); // 星を出力
}
printf("\n"); // 行の終了時に改行
}
return 0;
}
問2の解答
#include <stdio.h>
int main() {
int rows, cols;
printf("Enter rows and columns: ");
scanf("%d %d", &rows, &cols);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("* "); // 星を出力
}
printf("\n"); // 行の終了時に改行
}
return 0;
}
問3の解答
#include <stdio.h>
int main() {
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
matrix[i][j] += 1; // 各要素を1増加
printf("%d ", matrix[i][j]); // 新しい値を出力
}
printf("\n"); // 行の終了時に改行
}
return 0;
}
7. まとめ
ネストされたループは、データ処理や表形式の出力で強力なツールです。ただし、設計時にはループの効率性や深さに注意しましょう。練習問題を通じて、その使い方を習得してください!