疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【Java】for文を入れ子にして九九をつくる

こちらはかなり序盤の方に出てきそうな問題ですね。
for文やif文、switch文なんかを一通りやった上で出題されたような記憶があります。
初めて考えさせられる問題でもあるかなと。

ありがちな例で言えばそうですね。
実行結果を見せられた上で処理を記述するパターンでしょうか。
今回はその形式で進めてみます。

実行結果

 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 

Java学びたての頭だとfor文1つでいいじゃんと思っていた気がします。
print文の中で「1 * 1 + " " + 1 * 2 + " " + ...」でいいと思うじゃないですか。

ですがfor文を2つ使わなければならないので工夫が必要です。
さらに単独で使うわけではなく、入れ子で使います。
入れ子というのは文字通りですが、for文で言えばこんな感じです。
ちなみに入れ子はネストとも言います。

ソース

for (int i = 0; i < 5; i++) {
	for (int j = 2; j <= 10; j++) {
	}
}

繰り返しの中に繰り返しがあるということはなんとなく九九に適していそうですよね。
入れ子を使えば簡単そうだと思うはずです。
そうと分かると、違いそうだけどとりあえず次のように記述して実行したくなると思います。

ソース

for (int x = 1; x <= 9; x++) {
	for (int y = 1; y <= 9; y++) {
		System.out.println(x * y);
	}
}

はい。私は最初これで実行しました。
結果を見て別に驚きはしませんでした。
むしろ安心したような記憶もあります。
表示こそ違うけど値は合ってるなって。

実行結果としては九九こそ表示出来ているものの1つの値ごとに改行されています。
printlnメソッドを使っているので当然と言えば当然です。


言語を学ぶ上で初めにやることって「HelloWorld」の表示だと思います。
その際のprint文は、記憶が曖昧ですが私はprintlnメソッドで表示させていました。
そのせいもあってか、自分の中では表示するならprintlnメソッドを使う意識がありました。

でも表示をするメソッドは他にもあります。
printlnメソッドでは引数に入れた値を表示して改行を行います。
printメソッドでは改行しないこと以外はprintlnメソッドと同じです。
改行するしないを上手く使えば目的の出力が行えそうです。

そしてもう1つ、printfメソッドがあります。
書式を指定して出力することが可能なものです。
今回のように1桁と2桁の数字を出力する際、1桁であっても2桁分のスペースで出力したい場合。
そんな時はこのprintfメソッドを使用すると体裁が良くなります。
第一引数に「"%2d"」を指定することで、一桁でも二桁分の幅で出力してくれます。
ちなみに改行も指定しない限りはされません。

ということでこちらが解答例です。

ソース

for (int x = 1; x <= 9; x++) {
	for (int y = 1; y <= 9; y++) {
		System.out.printf("%2d",x * y);
		System.out.print(" ");
	}
	System.out.println();
}

こうやって見てみると確かになって思いますよね。
当時の私は思いました。
値はネストさせたfor文で出力し、もう一方のfor文でネストさせたfor文と改行の処理を行っているだけ。
考えさせられる問題ですが解けるとスッキリですね。

今回は以上になります。