多重ループ
7.5 多重ループ
ここまでで作成したプログラムは、単純な繰り返しを行うだけでしたが、少し複雑に、「繰り返しの中でさらに繰り返しを行う」こともできます。
このようなループ処理のネスト構造を、多重ループと言います。
多重ループは、ネストの深さに応じて、二重ループ、三重ループ、・・・と増やすことが出来ます。
本節では、この多重ループについて解説を行なっていきます。
7.5.1 多重ループの構造
多重ループの構造には、
・ for文内にfor文を書く
・ while文内にwhile文をを書く
・ do-while文内にdo-while文を書く
というふうに、同じ種類のループ文をネストすることもあれば、
・ for文内にwhile文を書く
・ while文内にfor文を書く
・ while文内にdo-while文を書く
といったように、違う種類のループ文をネストすることもできます。ここでは、for文内にfor文を書いた二重ループについて解説します。
for文の二重ループの基本構文は下記のようになります。
このfor文の二重ループの流れは、図 7.5.1のフローチャートで確認して下さい。
図 7.5.1 : 二重ループのフローチャート
それでは、実際にプログラムを作成して、動きを確認していきましょう。
7.5.2 for文の二重ループの動きを確認するプログラム
このプログラムでは、for文の処理が1回実行される毎にメッセージを表示します。プログラムを作成して、二重ループの動きを確認しましょう。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch7
③ 名前 :NestedLoop
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ NestedLoop.java
package jp.co.f1.intro.ch7; public class NestedLoop { public static void main(String[] args) { for (int i = 1; i <= 3; i++) { System.out.println("外側ループ" + i + "回目"); for (int j = 1; j <= 2; j++) { System.out.println("内側ループ" + j + "回目"); } System.out.println(); } } }
実行結果
解説
今回の記述のなかで、二重ループに当たる部分は、7~17行目です。
外側のループの処理内容
外側のループの内部処理に、内側のループが含まれています。つまり、内側のfor文は、外側のfor文の内部処理の一部であり、外側の内部処理が1回行われる毎に内側のfor文は繰り返し処理を行います。
図 7.5.2 : NestedLoopの二重ループの外側for文の内部処理
内側のループの処理内容
11行目で宣言した変数jのスコープは、11~13行目のみです。内側のループを抜ける度に無効となり、外側のループを繰り返す度に初期化しています。
図 7.5.3 : NestedLoopの二重ループの内側for文の内部処理
外側のループの繰り返し処理が一回行われた時、内側のループがどのような動きをしているかを考えながら、次の表でこのプログラムの処理の流れを追ってみて下さい。
先ほどの表の「内側のfor文」のカウンタ変数の初期化に注目して下さい。表で順序と書かれた列の○4、○16、○28では、内側のfor文のカウンタ変数が初期化されています。つまり、内側のfor文が最初から実行されているということです。
内側のループは、外側のループの内部処理が1回行なわれる間に全ての処理を終えています。内側のループ文は、外側のループ文の内部処理とも言えます。そのため、外側のループが処理を繰り返した回数分、内側のループの全体が実行されます。
図 7.5.4 : NestedLoopのfor文の二重ループのフローチャート
7.5.3 九九を表示するプログラム
二重ループの理解を深めるために、今度は九九(くく)の答えを表示するプログラムを作成してみましょう。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch7
③ 名前 :NestedLoopWithKuku
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ NestedLoopWithKuku.java
package jp.co.f1.intro.ch7; public class NestedLoopWithKuku { public static void main(String[] args) { for (int dan = 1; dan < 10; dan++) { System.out.print(dan + "の段 : "); for (int count = 1; count < 10; count++) { System.out.print(dan * count + " "); } System.out.println(); } } }
実行結果
解説
二重ループになっているのは、7~17行目です。外側のループは九九の「段」を表し、内側のループは各段の1~9までの「掛ける数」を示しています。それぞれのfor文と、表示される文字列の流れは、次のページの表を参考にして下さい。
外側のループの処理内容
外側のループは、九九の段数を制御しています。内部の処理で、段数の見出し表示、内側のループ(値の表示)、そして改行を行います。
図 7.5.5 : NestedLoopWithKukuの外側のfor文の内部処理
内側のループの処理内容
ここでは、外側のループのカウント変数dan(九九の段数)と内側のループのカウント変数count(九九の段数に掛ける数)を掛けて、毎回1つずつ値を表示しています。内側のループを抜けると、九九の段が1つ完成します。
図 7.5.6 : NestedLoopWithKukuの内側のfor文の内部処理
外側のループの1回目、つまり1の段を全て表示させるのが内側のループの役割です。1の段を全て表示させたということは、内側のループが終了したということであり、次に外側のループの内部処理の2回目(2の段)が始まります。
ポイント・ 外側のループの中に入った内側のループは、外側のループが1回の処理を行う度に繰り返し処理を行います。