ネスト

2重の繰り返し

繰り返しのブロックの中で繰り返すこともできます。このようにブロックの中にブロックをおくことを「ネスト」といいます。javaだけでなく、プログラミング言語では一般に使われる用語です。

ファイル名 Nest.java

public class Nest {
    public static void main( String[] args ) {
       int n = 9;
       for( int line=1; line<=n; line++ ) {
           for( int colm=1; colm<=n; colm++ ) {
              System.out.print(" l");
              System.out.print(line);
              System.out.print("-c" );
              System.out.print(colm);
           }
           System.out.println(); 
       }
    } 
}

これで、次のように表示されます。

 l1-c1 l1-c2 l1-c3 l1-c4 l1-c5 l1-c6 l1-c7 l1-c8 l1-c9 ← line が1の行
 l2-c1 l2-c2 l2-c3 l2-c4 l2-c5 l2-c6 l2-c7 l2-c8 l2-c9 ← line が2の行
 l3-c1 l3-c2 l3-c3 l3-c4 l3-c5 l3-c6 l3-c7 l3-c8 l3-c9
 l4-c1 l4-c2 l4-c3 l4-c4 l4-c5 l4-c6 l4-c7 l4-c8 l4-c9
 l5-c1 l5-c2 l5-c3 l5-c4 l5-c5 l5-c6 l5-c7 l5-c8 l5-c9
 l6-c1 l6-c2 l6-c3 l6-c4 l6-c5 l6-c6 l6-c7 l6-c8 l6-c9
 l7-c1 l7-c2 l7-c3 l7-c4 l7-c5 l7-c6 l7-c7 l7-c8 l7-c9
 l8-c1 l8-c2 l8-c3 l8-c4 l8-c5 l8-c6 l8-c7 l8-c8 l8-c9
 l9-c1 l9-c2 l9-c3 l9-c4 l9-c5 l9-c6 l9-c7 l9-c8 l9-c9
   ↑    ↑    ↑
 colm=1 colm=2 colm=3
 

l2-c3 は2行目の3列目ということです。外側のforで変数 line が2のときで内側のforで colm が3の時に表示されました。

次のように for と対応する } の位置を合わせ、その間を字下げして for の範囲をわかりやすくします。(これは人間のためです)

for( int line=1; line<=n; line++ ) {
     for( int colm=1; colm<=n; colm++ ) {
字下      System.out.print(" l");
字下 System.out.print(line);
     System.out.print("-c" );
          System.out.print(colm);
     }
     System.out.println(); 
}

初期化に注意

nの階乗 n!=n×(n-1)×(n-2)×…×3×2×1 の計算をひとつの n について計算するのでなく、n=1から10までおこなって表にすることを考えます。内側の for が n の階乗を計算する部分で、その n を 1 から 10 まで外側の for で繰り返しています。

(実は階乗の場合はもっといい方法があるのですが、変数 s を何回も使い回しをする時、使うたびに初期化(ここでは1にする)を忘れないようにするという例として紹介しています)

  long s;
  for (int n=1; n<=10; n++) {
  
       s = 1;                        // ひとつの
       for (int i=n; i>1; i--) {     // n の
             s = s * i;              // 階乗を
       }                             // 計算
       System.out.print( n );        // して
       System.out.print("! = ");     // 表示
       System.out.println( s );      // する部分
  
  }

結果は以下の通り。

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800

一度宣言した変数をもう一度宣言するとエラーになります。long s; は、for の外側になければいけません。

i も何度も宣言しているように見えますが、これは内側の繰り返しのブロック内でのみ有効な変数で、処理がこのブロックを抜けると i は破棄されるので、そのたびに宣言しても問題ありません。むしろそうすべきです。

課題

1.

上記の Nest.java を作りなさい。

ファイル名 Nest.java

2.

九九の表を作るプログラムを作りりなさい。Nest.java で line と colm を掛け合わせるとできます。次のように表示されるよう工夫しなさい。

ファイル名 Kuku.java

 1  2  3  4  5  6  7  8  9 
 2  4  6  8  10  12  14  16  18 
 3  6  9  12  15  18  21  24  27 
 4  8  12  16  20  24  28  32  36 
 5  10  15  20  25  30  35  40  45 
 6  12  18  24  30  36  42  48  54 
 7  14  21  28  35  42  49  56  63 
 8  16  24  32  40  48  56  64  72 
 9  18  27  36  45  54  63  72  81 

一桁と二桁が混ざっているので縦の線がそろいません。でも気にしないことにします。

3.

九九の表を作るプログラムをほんのちょっと変えると次のように表示されるようになります。

ファイル名 Kuku2.java

 1  
 2  4  
 3  6  9  
 4  8  12  16   
 5  10  15  20  25  
 6  12  18  24  30  36  
 7  14  21  28  35  42  49  
 8  16  24  32  40  48  56  64  
 9  18  27  36  45  54  63  72  81 
 

いままで全部の行を9列まで表示していましたが、今度は1行目は1列まで、2行目は2列まで、3行目は3列まで、… と考えればわかります。

4.

1の1乗、2の2乗、3の3乗と計算していき、10の10乗までの表をつくるプログラムをつくれ。下記は n の n 乗を求めて表示する部分の例である。これを n=1 から 10 まで繰り返せばよい。ただし、s は double または long で適当な場所で宣言する必要がある。

ファイル名 Njou.java

System.out.print( n );
System.out.print( "の" );
System.out.print( n );
System.out.print( "乗は " );
s = 1;
for (int i=1; i<=n; i++) {
          s = s * n;
}
System.out.println( s );

以下の通りに出れば正解。 s を double で宣言したときも s を long で宣言したときも表示方法が異なるだけで同じである。この問題では、どちらを使用してもよいが、結果が大きな値になるときは double が無難である。

 s を double で宣言したとき  s を long で宣言したとき
1の1乗は 1.0
2の2乗は 4.0
3の3乗は 27.0
4の4乗は 256.0
5の5乗は 3125.0
6の6乗は 46656.0
7の7乗は 823543.0
8の8乗は 1.6777216E7
9の9乗は 3.87420489E8
10の10乗は 1.0E10
1の1乗は 1
2の2乗は 4
3の3乗は 27
4の4乗は 256
5の5乗は 3125
6の6乗は 46656
7の7乗は 823543
8の8乗は 16777216
9の9乗は 387420489
10の10乗は 10000000000

ちなみに、この問題で、float と宣言すると計算精度が落ち、int だと正しい答にならない。

もくじ

聖愛中学高等学校
http://www.seiai.ed.jp/
Last Modified