LoginSignup
5
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-22

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

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

triangles.PNG

対象読者

・プログラミングを勉強中の方
・最近エンジニアになった方
・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");
       }
    }
}

出力結果

image.png

解説

・一つ目の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");
        }
    }
}

出力結果

image.png

解説

・一つ目の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");
        }
    }
}

出力結果

image.png

解説

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

・一つ目の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");
        }
    }
}

出力結果

image.png

解説

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

・一つ目の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");
                }
            }
        }
    }
}

出力結果

image.png

解説

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

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

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

まとめ

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

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7