Javaのfor文の課題を行いました。本当は、抽象クラスとインターフェイスについて学習したのですが、まとめる時間がなかったです。
package traiangle; public class Main { public static void main(String[] args) { // int outer_max = 5; int inner_max = (outer_max * 2) -1; Main main = new Main(); main.trian(outer_max, inner_max); } public void trian(int outer_max, int inner_max) { // 上段 for(int e = 1; e <= outer_max +1; e++) { for(int f = 0; f < inner_max; f++) { // 開始位置まで空白 System.out.print(" "); // 描画開始 if(f == inner_max -e) { System.out.print(" "); for(int g = 1; g <= 2 * e -1; g++) { System.out.print("*"); } System.out.println(); break; } } } // 下段 for(int i = 1; i <= outer_max; i++) { for(int j = 0; j < inner_max; j++) { // 開始位置までは空白 if(j < (outer_max -i)){ System.out.print(" "); } else { // 描画開始 System.out.print("*"); // どこで処理を抜けるか if(j >= (outer_max -1) + (i -1)) { // 2つ目の三角形 System.out.print(" "); for(int k = 0; k < inner_max; k++) { System.out.print("*"); if(k >= (inner_max -(2 * i -1))) { // 3つ目の三角形 System.out.print(" "); for(int l = 0; l < inner_max; l++) { System.out.print("*"); if(l + 1 >= 2 * i - 1) { // 3つ目の三角形の処理抜け break; } } // 2つ目の三角形の処理抜け break; } } // 1つ目の三角形の処理抜け break; } } } System.out.println(); } } }
シンプルにまとめることがなかなかできないですね。きれいな三角形ができたので良しとしますかね、ソースコードは汚いけど。(駄目だコリャ)
2017年7月8日 追記
講師の先生に、考え方について教えていただきました(目からウロコ!)
- 完成図を描く
- 必要な情報を洗い出す
- パターン化(表で表せるものは2重ループ)
1. 完成図を描く
for文で考えた場合、外側のfor文が『行』を、内側のfor文が『列』を扱うイメージですかね。ここで、変化していくのは『列』の描画(表で見るとA~I)です。
2.必要な情報を洗い出す
各『行』ごとの『列』に着目して、『空白』と『*』をどれだけ描画すればピラミッドができるか考えます。そうすると、規則性が見えてきます。
『行』 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
必要な『空白』の数 | 4 | 3 | 2 | 1 | 0 |
必要な『*』の数 | 1 | 3 | 5 | 7 | 9 |
各『行』ごとの『*』の数 = 5 - 現在の『行』数
各『行』ごとの『空白』の数 = 2 × 現在の『行』数 +1
と現せそうです。
3.パターン化
表で表せるものは、2重ループでいけるようです。『行』と『列』の2次元で考えられるということですかね。今回は、for文の2重ループを採用しているようです。
package forSample; public class Piramid { public static void main(String[] args) { int height = 5; for (int i = 0; i < height; i++) { // System.out.print("i = " + i + " "); // System.out.print(height - i - 1 + " "); // System.out.println(1 + 2 * i); for (int j = 0; j < height - i - 1; j++) { System.out.print(" "); } for (int j = 0; j < 1 + 2 * i; j++) { System.out.print("*"); } System.out.println(); } } }
こういった考え方を習得していきたいものです。
今回はこのへんで。