繰り返しのブロックの中で繰り返すこともできます。このようにブロックの中にブロックをおくことを「ネスト」といいます。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 は破棄されるので、そのたびに宣言しても問題ありません。むしろそうすべきです。
上記の Nest.java を作りなさい。
九九の表を作るプログラムを作りりなさい。Nest.java で line と colm を掛け合わせるとできます。次のように表示されるよう工夫しなさい。
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
一桁と二桁が混ざっているので縦の線がそろいません。でも気にしないことにします。
九九の表を作るプログラムをほんのちょっと変えると次のように表示されるようになります。
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列まで、… と考えればわかります。
1の1乗、2の2乗、3の3乗と計算していき、10の10乗までの表をつくるプログラムをつくれ。下記は n の n 乗を求めて表示する部分の例である。これを n=1 から 10 まで繰り返せばよい。ただし、s は double または long で適当な場所で宣言する必要がある。
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 だと正しい答にならない。