【Java基礎】for文で三角形を作ろう


会社の先輩から新米のぼくに出された、Javaでfor文を使い色んな三角形を作る問題です。
こちらはJavaですが、単純なfor文で作れるので他の言語でも挑戦してみてください。

扱う形は以下の画像のとおり。

対象読者

・プログラミングを勉強中の方
・最近エンジニアになった方
・Javaを勉強したい方

問題① 正三角形 ▲

public class Main {
    public static void main(String[] args) {
        int max = 5;
        String star = "*";

        for (int i = 0; i < max; i++) {
            for(int j = 0; j < max-i; j++) {
                System.out.print(" ");
            }
            for(int k = 0; k <= (i*2); k++) {
                System.out.print(star);
            }
            System.out.println("\n");
       }
    }
}

出力結果

解説

・一つ目のfor文(i)で三角形の高さを定義する(今回は事前に変数max = 5としています。)
・2つ目のfor文(j)で空白("")を定義。
 三角形のため、最初は空欄が最大、*の数と反比例して徐々に空欄を少なくするので
 条件式はj < max-i;となります。
・3つ目のfor文(k)で*を出力。
・最後に1ループが終わる毎にprintlnで改行してあげる。(改行しないとずっと横に出力される)

問題② 逆三角形 ▼

public class Main {
    public static void main(String[] args) {
        int max = 5;
        String star = "*";

        for (int i = 0; i < max; i++) {
            for(int j = 0; j < i; j++) {
                System.out.print(" ");
            }
            for(int k = 0; k <= max*2-(i*2)-2; k++){
                System.out.print(star);
            }
            System.out.println("\n");
        }
    }
}

出力結果

解説

・一つ目のfor文(i)で三角形の高さを定義する
・2つ目のfor文(j)で空白("")を定義。
 ①とは異なり、今回は単純に1ずつ増やしてあげる。
・3つ目のfor文(k)で*を出力。
 ※ごり押しで解いてます・・・ もっといい手があれば教えてください・・orz

問題③ 直角三角形ver.1  ◣

public class Main {
    public static void main(String[] args) {
     int max = 5;
        String star = "*";

        for (int i = 0; i < max; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print(star);
            }
            System.out.println("\n");
        }
    }
}

出力結果

解説

恐らくこれが一番単純でしょう。

・一つ目のfor文(i)で三角形の高さを定義する
・2つ目のfor文(j)で一つずつ増えるよう*を出力。

問題④ 直角三角形ver.2 ◢

public class Main {
    public static void main(String[] args) {
        int max = 5;
        String star = "*";

        for (int i = 0; i < max; i++) {
            for (int j = 0; j < max-i; j++) {
                System.out.print(" ");
            }
            for (int k = 0; k <= i; k++){
                System.out.print(star);
            }
            System.out.println("\n");
        }
    }
}

出力結果

解説

これは②逆三角形ができれば簡単だとおもいます。

・一つ目のfor文(i)で三角形の高さを定義する
・2つ目のfor文(j)で空白("")を定義。
 最初は空欄が最大、*の数と反比例して徐々に空欄を少なくするので
 条件式はj < max-i;となります。
・3つ目のfor文(k)で*を出力。ひとつずつ増やすのでk <= iとなります。

問題⑤ ひし形 ◇

public class Main {
    public static void main(String[] args) {
        int max = 5;
        String star = "*";

        for (int i = 0; i < max; i++) {
            for (int j = 0; j < max-i; j++) {
                System.out.print(" ");
            }
            for (int k = 0; k <= ((i-1)*2); k++) {
                System.out.print(star);
            }
            System.out.println("\n");
            if (i == 4){
                for (int a = 0; a < max; a++) {
                    for(int b = 0; b < a; b++) {
                        System.out.print(" ");
                    }
                    for(int c = 0; c <= max*2-(a*2)-2; c++){
                        System.out.print(star);
                    }
                    System.out.println("\n");
                }
            }
        }
    }
}

出力結果

解説

これはしばらく解くのに考えました。結果としてはif文を使って、正三角形と逆三角形の両方を
出力するという手を使いましたが、恐らくもっといい方法がある気がします・・・

まずは、*が1~7個の間は正三角形の方法で出力し、*が9~1個にかけて逆三角形で表します。
if (i == 4)とし、iのループが4回回ったタイミングで▲と▼を切り替えましょう。

あとは、①~④のコードを再利用すれば解けます。

まとめ

for文を使って色んな形を出力する方法をまとめました。
for文は実務でも頻出ですし、コードの構造を考える練習になるのでぜひやってみてください (^^)/