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


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

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

![triangles.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520805/bdc76cda-f0f2-1153-4c7d-c06295ef4278.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520805/d7a5025b-dbed-f48a-3e89-749dfaf979eb.png)

##解説

・一つ目のfor文(i)で三角形の高さを定義する（今回は事前に変数max = 5としています。）
・2つ目のfor文(j)で空白("")を定義。
　三角形のため、最初は空欄が最大、＊の数と反比例して徐々に空欄を少なくするので
　条件式はj < max-i;となります。
・3つ目のfor文(k)で＊を出力。
・最後に１ループが終わる毎に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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520805/b3d4439a-1af7-2093-fc8e-52ac16632425.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520805/4d12376d-a3d8-8fe8-1447-976f824a28d6.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520805/c1daab54-9ce1-a721-764f-ccda25ef4158.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520805/00f3cd2e-fb50-10f0-9e30-f49ec9359109.png)

## 解説

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

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

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

##まとめ

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