多重ループの基本


多重ループとは、繰り返しの中に繰り返しが入っている構造のことです。

繰り返しの中で更に繰り返しを行うので、多くのプログラミング初心者がつまづきやすいポイントになっています。

 

その一方で、多重ループは非常によく使われます。

例えば、ゲームの画面は2次元なのでよく2次元配列を扱うのですが、この処理では2重ループが必須となります。

10重ループほどまでの多重ループが必要になることは滅多にありませんが、2重・3重ループ程度は度々必要になります。

 

処理のイメージさえ理解できれば大丈夫なので、2重ループが理解できれば自然とそれ以上の多重ループも理解できると思います。

それでは、多重ループの基本である2重ループを学んでいきましょう。

1.2重ループの基本


2重ループは名前の通り、繰り返しが2重になっている構造で、外側のループの中に内側のループがあります。

ちなみに、2重ループでは外側のループのカウンタを「i」、内側のループのカウンタを「j」とすることが多いです。

 

まず、2重ループの基本である九九のプログラムで処理の手順を見ていきます。

下記は「九九の1~5の段の計算を出力する」プログラムです。

※9の段まで計算しないのは、外側の繰り返し回数と内側の繰り返し回数を違う値にすることで、区別しやすくするためです。


九九の計算(C)

#include <stdio.h>
int main(void){
    int i, j;

    for(i=1; i<=5; i++){
        for(j=1; j<=9; j++){
            printf("%d×%d=%d ",i,j,i*j);

        }
        printf("\n");
    }
    return 0;
}

九九の計算(Java)

public class Kuku {
    public static void main(String[] args) {
        
        
        for(int i=1; i<=5; i++){
            for(int j=1; j<=9; j++){
                System.out.print(
                i+"×"+j+"="+(i*j)+" ");
            }
            System.out.println();
        }
    }    
}


実行結果

1×1=1  1×2=2  1×3=3  1×4=4  1×5=5  1×6=6  1×7=7  1×8=8  1×9=9

2×1=2  2×2=4  2×3=6  2×4=8  2×5=10 2×6=12 2×7=14 2×8=16 2×9=18

3×1=3  3×2=6  3×3=9  3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27

4×1=4  4×2=8  4×3=12 4×4=16 4×5=20 4×6=24 4×7=28 4×8=32 4×9=36

5×1=5  5×2=10 5×3=15 5×4=20 5×5=25 5×6=30 5×7=35 5×8=40 5×9=45

 

外側のループ(i)では、九九の段が「1の段、2の段、・・・、5の段」と増えながら繰り返されます。

内側のループ(j)では、各段(外側のループ(i))の中で掛ける数が「×1、×2、・・・、×9」と増えながら繰り返されます。

これらをまとめると、普通の九九と同じく「1×1=1、1×2=2、・・・、5×9=45」の順で処理が行われています。 

2.2重ループと2次元配列


続いて、2重ループと2次元配列の関係を見ていきます。

 

まず初めに2次元配列の解説から。2次元配列は名前の通り、添え字が2種類ある配列のことです。

この時、1つ目の添え字は横方向(行)を表すことが多く、変数名には「i」がよく使われます。

2つ目の添え字は縦方向(列)を表すことが多く、変数名には「j」がよく使われます。

※絶対というわけではなく、そのような場合が多いという意味です。

 逆に列のループの中に行のループを入れる場合もあります。

 

例えば、2次元配列t[ i ][ j ]が右図のようになっている場合、

aの位置はt[0][1]、bの位置はt[2][3]と表せます。

   

2次元配列に限らず、2重ループでは行方向を外側のループで、列方向を内側のループで処理することが多いです。

先ほどの九九も、1行目に1の段を表示してから、2行目に2の段・・・となっていましたね。

 

処理の順番がさらに分かるように、2次元配列に順番を入れてみます。

下記は「2行5列の2次元配列に処理順を格納して出力する」プログラムです。


2次元配列(C)

#include <stdio.h>
int main(void){
    int i, j, cnt=1;
    int a[2][5];

    for(i=0; i<2; i++){
        for(j=0; j<5; j++){
            a[i][j] = cnt;
            printf("a[%d][%d]=%d, ",i,j,a[i][j]);
            
            cnt++;
        }
        printf("\n");
    }
    return 0;
}

2次元配列(Java)

public class MultiLoop {
    public static void main(String[] args) {
        int cnt=1;
        int[][] a = new int[2][5];        

        for(int i=0; i<a.length; i++){
            for(int j=0; j<a[i].length; j++){
                a[i][j] = cnt;
                System.out.print(
                "a["+i+"]["+j+"]="+a[i][j]+", ");
                cnt++;
            }
            System.out.println();
        }
    }    
}


実行結果

a[0][0]=1, a[0][1]=2, a[0][2]=3, a[0][3]=4, a[0][4]=5,

a[1][0]=6, a[1][1]=7, a[1][2]=8, a[1][3]=9, a[1][4]=10,

 

イコールの後が処理順です。

2重ループと2次元配列の関係がイメージできたでしょうか。

以上が多重ループの基本事項になります。

フローチャートやプログラムで多重ループを見た時、処理のイメージを浮かべることができればOKです。

多重ループの理解は”慣れ”なので、多重ループの問題を何回も解いてみることが重要ですよ。