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


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

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

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

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

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


さらにもう1つ、

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

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

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

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

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

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

「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;
}

<実行結果>

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;
}

<実行結果>

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

<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;
}

<実行結果>

 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」が2の時、「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;
}

<実行結果>

 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」が0の時、「j」は「0〜9」まで変化し、

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


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

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


次へ

戻る

目次へ