Java for文の練習

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();
    }
  }
}

f:id:ts0818:20170705223247j:plain

シンプルにまとめることがなかなかできないですね。きれいな三角形ができたので良しとしますかね、ソースコードは汚いけど。(駄目だコリャ)

 

2017年7月8日 追記

講師の先生に、考え方について教えていただきました(目からウロコ!)

  1. 完成図を描く
  2. 必要な情報を洗い出す
  3. パターン化(表で表せるものは2重ループ)

1. 完成図を描く

f:id:ts0818:20170708110646j:plain

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();
		}

	}
}

こういった考え方を習得していきたいものです。