プログラムを作成するときに複数のループ構文を組み合わせることがよくあります。そのようなときはループの中でさらにループさせる入れ子構造(ネスト)が使用されます。
ループ処理のネスト
▶ループ処理の中にループ処理を入れることができる
- ①の命令文は3回実行される
- ②の命令文は9回実行される
一番外側の赤い部分の for 文は a が1で3回以下の繰り返しなので、a が1,2,3回繰り返されます。
命令文は a = 〇 ⇐ ループさせるたびに繰り返して出力されます。
その中にさらに for 文を入れ子構造構造で入れます。青い方の for 文も赤と同様に変数 b を3回繰り返して出力させます。命令文も同様で b の値を出力させる内容になります。
このように内側も外側も同じ for 文の内容となりますが、記述する場所によってかなり内容が異なってきます。
どのような挙動になるかというと
a が1のとき b が1,2,3回出力されます。
次に a が2になると b は再度1から戻って1,2,3回実行されます。
最後に a が3のときも b は3回実行されます。
実質 a は3回だけ実行されます。
そしてそれぞれ a が実行されるたびに b は3回ずつ実行されます。
つまり b は合計9回実行されることになります。
for 文に関してはこちらを参考にしてください。
コードは次のようになります。
- class NestLoop {
- public static void main ( String [ ] args ) {
- for ( int a = 1 ; a <= 3 ; a ++ ) {
- System . out . println ( ” a = “ + a ) ;
- for ( int b = 1 ; b <= 3 ; b ++ ) {
- System . out . println ( ” b = “ + b ) ;
- }
- }
- }
- }
出力結果は
a = 1
b = 1
b = 2
b = 3
a = 2
b = 1
b = 2
b = 3
a = 3
b = 1
b = 2
b = 3
となります。
a が1,2,3回のとき、それぞれ b が1,2,3回繰り返されていることがわかると思います。
練習(九九表作成)
九九の表を出力するプログラムを作ってみましょう。
考え方としては掛け算の2つのオペランド(数字)のうちの前者( 1 × 1 = 1)は行で1~9まで変わります。(1×1=1 , 2×1=2,・・・・)そして行が変わるとまた1~9まで変わります。これを9回繰り返すので合計81回変わることになります。
後者(1×1=1)は列の中で1~9まで変わります。(1×1=1,1×2=2,1×3=3・・・・)行が変わっても1~9までは変わりません。前述のネストの図でいうと、この後者のオペランドは赤い部分で記述されたプログラムに近いです。
前者のオペランドは青い部分で記述されたプログラムに近いです。
- class MultiplicationTable {
- public static void main ( String [ ] args ) {
- for ( int i = 1 ; i <= 9 ; i ++ ) {
- for ( int j = 1 ; j <= 9 ; j ++ ) {
- 命令文
- }
- System . out . println ( ) ; // 改行
- }
- }
- }
ネストの図でいうと、変数 i は変数 a に変数 j は変数 b に相当します。
変数 i は9回しか回りませんが j は9×9回も回るという挙動になります。
したがって 変数 i は9回しか回らないので後者のオペランドとし、変数 j を前者のオペランドとします。
そして中の for 文が1回まわったら改行をいれます。
System . out . println ( ) ; と空の命令文を記述することで改行となります。
コードは次のようになります。
- class MultiplicationTable {
- public static void main ( String [ ] args ) {
- for ( int i = 1 ; i <= 9 ; i ++ ) {
- for ( int j = 1 ; j <= 9 ; j ++ ) {
- System . out . print ( j + ” × ” + i ” = “ + j * i + ” “ ) ;
- }
- System . out . println ( ) ;
- }
- }
- }
命令文はまず1×1=1 , 2×1=2,・・・・を改行せずに1行で出力させたいので System . out . print で記述します。
println と print についてはこちらを参考にしてください。
そして前者のオペランドが変数 j に値するので先に記述します。×と=は文字列として記述します。
1×1=1 と 2×1=2 の間にスペースをはさみたいので空の文字列 ” ” を記述しておきます。
このようにループ処理のネストを利用することによって、九九表のような繰り返しの入れ子構造のプログラムを記述することができます。
まとめ
ループ処理のネストは考え方が少し複雑ですが、何に何を入れ込みたいのかを考えてプログラム組めるようになると複雑な処理をコンピューター一瞬でしてくれることに感謝できるようになると思います。
まずは九九の考え方を理解して慣れていきましょう。