繰り返し文の階層化

しばしば、繰り返し文の中に、別の繰り返し文を書くことがあります。このような多重階層の繰り返し処理は、応用的な情報処理には欠かせません。例えば、表のような2次元データを扱う場合には2階層の繰り返し文を書くことになるでしょう。

for ( i = 0 ; i < width ; i++ ) {
    for ( j = 0 ; j < height ; j++) {
        ...
    }
}

このような構造の繰り返し処理の場合、内側の繰り返し文の処理が終了すると、外側の繰り返し文の制御に戻り、再び内側の処理が繰り返されます。よって、上記のコードで考えると、内側のfor文の処理はwidth × height回、実行されることになります。

理屈上では、3階層、4階層にもできますが、制御文の階層構造が深くなりすぎると、プログラムの流れを読むことが困難になり、コードも汚くなります。深い多重階層になるような場合は、一部の計算や機能を他の関数に分離するなど、設計そのものを検討した方が良いかもしれません。

また、Steve McConnell著の 「CODE COMPLETE」では、2 階層以上の繰り返し文で用いられるカウンタ変数には、i や j といった簡易なものではなく、意味のある名前を付けることを推奨しています。そうすることで、繰り返し文の各階層で何を処理しているのか読みやすくなります。

サンプル 06

#include <stdio.h>

int main(void)
{
    int h, v;

    for (v = 1 ; v < 10 ; v++) {
        for (h = 1 ; h < 10 ; h++) {
            if (v * h < 10) printf(" %d ", v * h);
            else printf("%d ", v * h);
        }
        printf("\n");
    }

    return 0;
}

実行結果

サンプル06は、九九の表を出力するプログラムです。このような2次元の情報を処理する場合に2階層の繰り返し文を使います。九九の計算は、カウンタ変数の v と h を用いています。