C言語のきほん|多重ループの基本

繰り返しの中で、さらに繰り返す。多重ループが分かると「表」も「図形」も一気に作れるようになる。

多重ループは“2次元の発想”をコードにする近道

ループに慣れてくると、次にやりたくなるのが「表みたいに並べる」「行と列を扱う」「図形を描く」みたいな処理です。
こういう“縦×横”の処理をそのまま書こうとすると、同じコードを何度もコピペしがちです。

そこで登場するのが 多重ループ
これは 1つのループの中に、別のループを入れる書き方です。

  • 外側のループ:行(縦方向)を担当
  • 内側のループ:列(横方向)を担当

と役割分担できるので、2次元的な処理がスッと書けるようになります。

多重ループと二重ループの関係

  • 二重ループ:ループが2段(外側+内側)
  • 多重ループ:3段以上も含めた総称(入れ子のループ全部)

学習の最初は二重ループが中心になります。ここが理解できれば、3重も考え方は同じです。

for文の二重ループ基本形

文書の形を、意味が見えるように整理します。

for (初期設定1; 継続条件1; 再設定1) {
    for (初期設定2; 継続条件2; 再設定2) {
        文;
    }
}

役割のイメージ(外側と内側)

ループよくある役割典型例
外側縦(行)を回す3行ぶん繰り返す
内側横(列)を回す1行に10個並べる

実行の流れ(ここが超大事)

外側が1回回るたびに、内側は最初から最後まで全部回ります。

この関係が分かると、多重ループの読み方が安定します。

多重ループを使わないと何がつらい?

文書の例と同じ発想で、横に同じものを並べる処理を「行数ぶんコピペ」すると、こうなります。

  • 行数を増やしたくなったら、同じブロックをさらに追加
  • 横幅を変えたくなったら、全部のブロックを修正

つまり、変更に弱いです。
だから「縦方向の繰り返し」と「横方向の繰り返し」を分けて書ける二重ループが効いてきます。

サンプルプログラム

元の例は * を横10個×縦3行でしたね。
ここでは内容と表示メッセージを変えて、より“表っぽさ”が分かる例にします。

例:数字の表を作る(3行×5列)

  • 1行に 1 2 3 4 5 を表示
  • それを3行表示する
  • これなら「行」と「列」の役割分担が見えやすいです

多重ループなし版(わざと冗長に)

ファイル名:9_7_1.c

// 多重ループを使わずに、同じ行を3回表示するプログラム
#include <stdio.h>

int main(void)
{
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");

    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");

    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");

    return 0;
}

この書き方でも動きますが、「同じことを3回書いている」のがもったいないですよね。

二重ループ版(スッキリ)

ファイル名:9_7_2.c

// for文の二重ループで、数字を横5個×縦3行で表示するプログラム
#include <stdio.h>

int main(void)
{
    for (int row = 1; row <= 3; row++) {       // 縦方向(行)を3回
        for (int col = 1; col <= 5; col++) {   // 横方向(列)を5回
            printf("%d ", col);
        }
        printf("\n");                          // 1行分が終わったら改行
    }

    return 0;
}

実行イメージ

1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

rowとcolで考えると一気に理解しやすい

二重ループは「行と列」で考えるとスッと腹落ちします。

変数意味どこで増える?
row今何行目か外側ループの最後で増える
col今何列目か内側ループの最後で増える

だから、rowが1の間に col は1→5まで全部回り、rowが2になったらまた col が1→5まで回ります。

図で見る:二重ループが作る“マス目”

この「マス目を埋める感じ」が、多重ループの正体です。

1行に何を書くかで“図形”も作れる

内側ループは「1行の中身」を作って、外側ループは「行数」を作ります。
つまり、内側のprintfを少し変えるだけで、表や図形が作れます。

例:行番号を含めた表示にする

ファイル名:9_7_3.c

// 行番号と列番号を表示して、表っぽくする例
#include <stdio.h>

int main(void)
{
    for (int row = 1; row <= 3; row++) {
        for (int col = 1; col <= 5; col++) {
            printf("(%d,%d) ", row, col);
        }
        printf("\n");
    }
    return 0;
}

実行イメージ

(1,1) (1,2) (1,3) (1,4) (1,5)
(2,1) (2,2) (2,3) (2,4) (2,5)
(3,1) (3,2) (3,3) (3,4) (3,5)

この形が理解できると、次は「九九表」「座標の描画」「2次元配列の走査」に自然につながります。

while文でも多重ループは作れる(発想は同じ)

文書ではこのあと for と while を比較していく流れでした。
ポイントはシンプルで、構文が違うだけで考え方は同じです。

  • 外側while:行
  • 内側while:列
  • 内側が終わったら外側の1回が終わる

forで慣れてからwhileで書き直すと、理解が一気に固まります。