C言語

【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)ijの掛け算結果を出力します。

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. 練習問題

以下の課題に挑戦し、ネストされたループの使い方を練習してください。

  1. 5行5列の星(*)パターンを出力するプログラムを作成してください。
  2. ユーザーに行数と列数を入力させ、そのサイズの長方形を*で描画するプログラムを作成してください。
  3. 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. まとめ

ネストされたループは、データ処理や表形式の出力で強力なツールです。ただし、設計時にはループの効率性や深さに注意しましょう。練習問題を通じて、その使い方を習得してください!