基本制御文(反復構造:ネスト2)★


前回、何かの命令の{}の中に別の命令を書くことをネストという、と書きました。

whileの中にwhileを書くこともネストなのですが、繰り返し(ループ)の中に繰り返しを書くという意味で、多重ループといいます。

前回のプログラムは「*」を5個表示するプログラムを「5回繰り返す」ので、二重ループとなります。

今後は、「二重ループ」という名前を使っていきます。

※繰り返しも「ループ」という呼び方にします。


さらにもう1つ、

これまで、繰り返しのカウント用に「counter」という変数を用いてきました。

「数を数える」という意味でこのような変数名をつけていましたが、少し変えていきましょう。

変数名は、その変数の役割を表す名前を付けることが重要ですが、「慣例」として使われている名称もあります。

その1つが、繰り返し用のカウンタ「」や「」という名前です。

これは、入門書やネット上のプログラムでもよく見かけると思います。

例として、「二重ループ」ではなく、単純なループを使ったプログラムを書き換えてみます。

「0〜9まで表示するプログラム」<sample program 030-01>を「i」を使って書き換えます。


<sample program 052-01>

#include <stdio.h>

int main( void )
{
    int i;

    i = 0;

    while( i < 10 ) {

        printf( "%2d", i );

        i++;
    }

    printf( "\n" );

    return 0;
}

<実行結果 VC++ Express Edition>

0 1 2 3 4 5 6 7 8 9
続行するには何かキーを押してください・・・

「counter」の代わりに「i」を使っています。

ループが1つしかない場合、「i」を使います。

「%2d」という部分については、<sample program 036-04>で書きましたが、「10進整数2桁」で表示しています。

次に、前回の「二重ループ」のプログラムを「i」「j」を使って書くと以下のようになります。


<sample program 052-02>

#include <stdio.h>

int main( void )
{
    int i;
    int j;

    i = 0;

    while( i < 5 ) {

        j = 0;

        while( j < 5 ) {
            printf( "*" );
            j++;
        }
        printf( "\n" );

        i++;
    }

    return 0;
}

<実行結果 VC++ Express Edition>

*****
*****
*****
*****
*****
続行するには何かキーを押してください・・・

< sample program 051-04 >を「i」「j」を使って書き換えました。

「counter1」を「j」に、「counter2」を「i」に変更しています。

これは、「慣例」として「i」を外側のループ、「j」を内側のループに適用することが多いからです。

※慣れている人にとって、「i」と「j」が逆の位置にあるだけで、見づらいと感じることがあります。

これらを踏まえた上で、次のプログラムを考えてみましょう。


上に書いた、<sample program 052-01>を10回繰り返すプログラムを作ってみてください。









































解答例です。


<sample program 052-03>

#include <stdio.h>

int main( void )
{
    int i;
    int j;

    i = 0;

    while( i < 10 ) {

        j = 0;

        while( j < 10 ) {

            printf( "%2d", j );

            j++;
        }

        printf( "\n" );

        i++;
    }

    return 0;
}

<実行結果 VC++ Express Edition>

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
続行するには何かキーを押してください・・・

「i」と「j」の位置に注意してください。

「i」は外側、「j」は内側のループで使用しています。


しっかりとイメージを持ってもらうために、このプログラムでの「i」と「j」の関係について書きます。

まず、外側のループ用カウンタである「i」が0で初期化されています。

その後、内側のループ用カウンタ「j」が0になります。

「i」が0の時、「j」は0〜9まで繰り返され「10になったらループを抜けます」。

次に「i」が1になります。

「i」が1の時、「j」は0〜9まで繰り返され「10になったらループを抜けます」。

次に「i」が2になります。

「i」が1の時、「j」は0〜9まで繰り返され「10になったらループを抜けます」。



以降、「i」が「10になってループを抜けるまで繰り返されます」。

※途中までで構いませんので、トレースしてみてください。


「i」が1増えるごとに、「j」は10回ループしていますから、次の行

 printf( "%2d", j );

は、100回実行されていることになります。

本当に100回実行されているかどうか、試してみましょう。


<sample program 052-04>

#include <stdio.h>

int main( void )
{
    int i;
    int j;

    int counter;

    counter = 0;

    i = 0;

    while( i < 10 ) {

        j = 0;

        while( j < 10 ) {

            printf( "%2d", j );

            counter++;

            j++;
        }

        printf( "\n" );

        i++;
    }

    printf( "counter = %d\n", counter );

    return 0;
}

<実行結果 VC++ Express Edition>

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
counter = 100
続行するには何かキーを押してください・・・

何回実行されているか調べるために「counter」という変数を追加しました。

実際に実行してみると、結果は「counter = 100」と表示されます。


では、「i」と「j」の関係を表にしたものを載せておきます。

i j i j i j i j i j i j i j i j i j i j
0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0
0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1
0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2
0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 3
0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4
0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 5
0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 6
0 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 7
0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 8
0 9 1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9 9

左から、「i」が0の時、「j」は「0〜9」まで変化し、

次に「i」が1増加して1になり、「j」はまた「0〜9」まで変化し・・・これを繰り返します。


当然、繰り返しの回数によってこの値は変化しますが、この表のイメージをしっかりと持っておいてください。

当分の間、これを使って練習していきます。

※思ったより表が小さいので、作り直します・・・


次へ

戻る

目次へ