【Java】分岐と繰り返し

# if文
:sunny: 分岐を行うことができる
:sunny: if のうしろの （） には分岐条件を記入
:sunny: 条件式とブロックから成り立つ

分岐を行うことができるっていうのは、たとえば・・・

家に食パンある？
　→ ある
　　じゃあトーストにして食べよう！
　→ ない
　　パン屋へ買いに行こう！

のように条件によってプログラミングの処理が変更できるようにすることです。

```例.java
public class Main {
	public static void main(String[] args) {
	    boolean bread = true;
	    if (bread == true) {
	        System.out.println("じゃあトーストにして食べよう！");
	    } else {
	        System.out.println("パン屋へ買いに行こう！");
	    }
	}
}
```

３行目の 真偽値をあらわすboolean型の変数 bread に true（falseでもＯＫ） を記入します。

４行目の if のうしろの (bread == true) は分岐するための条件を記入します。
今回であれば、変数 bread に true が代入されていたら・・・ということです。

５行目は trueだったら、こういう処理をしてくださいね〜ということです。

6行目の else はそれ以外だったら（今回でいえば true 以外だったら）
７行目で こういう処理をしてくださいね〜ということです。

```コンソール.
じゃあトーストにして食べよう！
```

今回は 3行目で true を代入しているので上記になります:smile:
３行目を true から false に変更すると・・・

```コンソール.
パン屋へ買いに行こう！
```

と表示されます:smile:

### if のみの構文
:sunny: もし条件が満たされたら指定の処理を行い、満たされない場合はなにもしない。

```例.java
public class Main {
	public static void main(String[] args) {
		int number = 5;
		if (number == 5) {
		    System.out.println("ごりら!");
		}
    }
}
```

この場合、変数 number に 5 が代入されていれば、

ごりら！

と表示され、それ以外の数字が代入されていれば、何も処理は行いません。

### if-else if-else構文
:sunny: 1 つの if 文で 3つ以上のルートに分岐できる。

```例.java
public class Main {
	public static void main(String[] args) {
		int number = 1;
		if (number == 1) {
		    System.out.println("いちご!");
		} else if (number == 2) {
		    System.out.println("にんじん!");
		} else if (number == 3) {
		    System.out.println("サンダル!");
		} else {
		    System.out.println("わかんな〜い");
		}
    }
}
```

変数 number に 1 が代入されていれば、 いちご！ と出力され、 2 なら にんじん！ 3 なら サンダル! それ以外の数字は わかんな〜い と表示されます。
else if を使うことで 3つ以上のルートに分岐できました:smile:

# switch 文
:sunny: すべての条件式が 変数 == 値 , 変数 == 変数 のように左辺と右辺が一致するかを比較する式
:sunny: switch のあとの (　) の中身は式ではなく変数名を記入
:sunny: case 値 : の　：　はコロンなので　；　セミコロンと間違わないように注意する。
:sunny: case 以降の処理の一番最後に break を記入する
:sunny: default は if 文の else と同じ意味で条件にあわないときの処理をどうするか。 else と一緒で処理が不要な場合は省略できる。 break も省略できる。


さっきの if-else if-else構文 で使用したプログラミングを switch 文に書き換えることができます:smile:

```例.java
public class Main {
	public static void main(String[] args) {
		int number = 1;
		switch(number) {
		    case 1:
    		    System.out.println("いちご!");
    		    break;
		    case 2:
    		    System.out.println("にんじん!");
    		    break;
		    case 3:
    		    System.out.println("サンダル!");
    		    break;
    		default:
    		    System.out.println("わかんな〜い");
		}
    }
}
```

if 文と比べて {　} が減ったし、else if のあとの (　) も減ったので非常に見やすくなりました:smile:

各々の case の最後に必ず break がありますが記入を忘れるとどうなるのでしょうか？:thinking: 

```例.java
public class Main {
	public static void main(String[] args) {
		int number = 1;
		switch(number) {
		    case 1:
    		    System.out.println("いちご!");
		    case 2:
    		    System.out.println("にんじん!");
    		    break;
		    case 3:
    		    System.out.println("サンダル!");
    		    break;
    		default:
    		    System.out.println("わかんな〜い");
		}
    }
}
```

7 行目にあった case 1 の break をあえて消してみました。
どうなるでしょうか？

```コンソール.
いちご!
にんじん!
```

case 1 だけが表示されるのではなく、 case 2 まで表示されてしまいました。。

switch 文というのは (　) のなかの変数と一致する case ラベルまで処理をジャンプする命令なのです。
そのためコンパイルエラーも出ません。
break を記入して処理を止めてあげないと次の case のプログラムまで実行されてしまうのです。


### break をあえて書かない

この break を記入しないと処理が止まらないという性質を逆に利用することもできます。

```例.java
public class Main {
	public static void main(String[] args) {
		int rank = 1;
		switch(rank) {
		    case 1:
    		    System.out.println("優秀！");
    		    break;
		    case 2:
		    case 3:
    		case 4:
    		    System.out.println("ふつう");
    		    break;
    		case 5:
    		    System.out.println("がんばって！");
    		    break;
		}
    }
}
```

rank が 1 のときは 優秀! と表示されますが
rank が 2 〜 4 は内容が全て同じで ふつう という文字を出力します。
あえて case 2 と case 3 の break も命令文も消してしまい、 case 4 まで処理がジャンプするようにしました。

そうすることで逆に可読性が高まり、コードが見やすくなりました:smile:


# while文
:sunny: 繰り返し（ループ）の処理を行うことができる
:sunny: while のうしろの（）には繰り返し続ける条件を記入
:sunny: 条件式とブロックから成り立つ

```例.java
public class Main {
	public static void main(String[] args) {
		int day = 1;
        while (day <= 7) {
            System.out.println(day + "日目");
            day++;
        }
        System.out.println("１週間が経ちました");
    }
}
```

3行目の変数 day に 1 を代入します。

４行目の while のうしろの (day <= 7) は繰り返しを続ける条件を記入します。
今回であれば、変数 day の値が ７ になるまで 5行目〜６行目の処理を繰り返してくださいっていうことです。
現在は 1 が代入されています。

５行目は変数 day に 1 が代入されているので 1日目と表示されます。
６行目の day++; で 変数 day に 1 をプラスして 2 にします。
４行目の while まで戻ります。

さきほど変数 day に 1 を足したので変数 day には 2 が代入されています。
(day <= 7) すなわち 2 <= 7 で条件式にあてはまっているので5行目〜６行目の処理を繰り返します。

５行目の変数 day に 2 が代入されているので ２日目と表示されます。
６行目の day++; で 変数 day に 1 をプラスして ３ にします。
４行目の while まで戻ります・・・というのを変数 day が 7 になるまで繰り返します。

変数 day に 7 になったときどうなるかというと、いままでどおり繰り返し処理が行われ、最後に day++; で変数 day には 8 が代入されました。
そして 4行目の while に戻ります。

現在変数 day には 8 が代入されています。
(day <= 7)すなわち 8 <= 7 になりますが条件式に合いません。
ここで繰り返し処理が終わります。
繰り返し処理が終わると 5行目〜6行目の処理は行われずに 8行目の処理までとびます。

そして 8行目の処理を行ってプログラムが終了します。

```コンソール.
1日目
2日目
3日目
4日目
5日目
6日目
7日目
１週間が経ちました
```

### do-while 文

:sunny: While文は条件が変わるまで処理を続けます。do-while の場合は、一度処理を行ってから条件が変わるまで処理を続けます。

```例.java
public class Main {
    public static void main(String[] args) {
        int day = 1;
        do {
            System.out.println(day + "日目");
            day++;
        } while (day <= 7) ;
        System.out.println("１週間が経ちました");
    }
}
```

3 行目の変数 day に 1 を代入します。

while 文ではつぎに while が来てたので条件を確認していました。
しかし今回の do-while 文では、さきに処理をします。

５ 行目で 1 日目の文字を表示します。
６ 行目で変数 day に 1 がプラスされるので 1 + 1 で 2 が代入されます。

７ 行目で while (day <= 7) で条件が満たされているかを判断します。
変数 day には 2 が代入されているので 2 <= 7 で条件を満たしているので
4行目の do まで戻り処理を繰り返します。

while (day <= 7) で変数 day に 8 が入ると条件を満たさないので繰り返し処理を終わります。

８行目の １週間が経ちました と文字を表示してプログラム終了です:smile:

# for 文
:sunny: 回数を指定して繰り返す

```例.java
public class Main {
    public static void main(String[] args) {
        for (int cake = 0; cake < 5; cake++) {
            System.out.println("パンケーキ食べたい！");
        }
    }
}
```

３行目が for 文です。
なんだかすごくややこしそう・・・と思いましたが
ひとつひとつの意味を知っていけば、そう難しくはありませんでした:smile:
説明していきますね:smile:

for 文のなかの

int cake = 0;

これは初期値に何を入れますか？ってことです。
上記の文で言えば変数 cake に 0 を代入します。
ってことです。

そして次の

cake < 5;

これは処理を何回繰り返しますか？ってことです。
ちなみに何回繰り返すかわかります？？:thinking: 
じつは処理は 5 回繰り返します。

さきほど初期値を int cake = 0; って設定しました。
つまり・・・

０　　１　　２　　３　　４

と 0 を含んで合計 5 回繰り返し処理がされてるのです。

最後に

cake++

これは処理を繰り返すためのカウントの役割をしています。
１つの処理が終わるたびに 1 回 とカウントしてくれています。

順番としては・・・

int cake = 0; で変数 cake に 0 が代入される。

↓

cake < 5; つまり 0 < 5; なので条件が一致するため
パンケーキ食べたい！　と出力される。

↓

cake++ なので 0 + 1 で変数 cake に 1 が代入される。

↓

cake < 5; つまり 1 < 5; なので条件が一致するため
パンケーキ食べたい！　と出力される。

↓

cake++ なので 1 + 1 で変数 cake に 2 が代入される。

↓

cake < 5; つまり 2 < 5; なので条件が一致するため
パンケーキ食べたい！　と出力される。

↓

cake++ なので 2 + 1 で変数 cake に 3 が代入される。

↓

cake < 5; つまり 3 < 5; なので条件が一致するため
パンケーキ食べたい！　と出力される。

↓

cake++ なので 3 + 1 で変数 cake に 4 が代入される。

↓

cake < 5; つまり 4 < 5; なので条件が一致するため
パンケーキ食べたい！　と出力される。

↓

cake++ なので 4 + 1 で変数 cake に 5 が代入される。

↓

cake < 5; つまり 5 < 5; なので条件が一致しません。
ここで処理が終了となります。


お気づきのかたもいらっしゃるかと思いますが
int cake = 0; の部分は 1 回しか処理されていません。
この部分は最初の１回のみの処理なのです。

もしここも繰り返し処理になってしまうと

cake++ で 1 を足したのに int cake = 0; でもう一度 0 が代入され
cake++ で 1 を足して、int cake = 0; でもう一度 0 が代入され・・・と
永遠に処理が終わらない無限ループというものが発生してしまいます:scream:

```コンソール.
パンケーキ食べたい！
パンケーキ食べたい！
パンケーキ食べたい！
パンケーキ食べたい！
パンケーキ食べたい！
```

ちなみに初期値だからといって必ずしも 0 で始める必要はないです。

```例.java
for (int cake = １; cake < ６; cake++) 
```

５回繰り返したいのなら回数の部分を cake < ６; とするか cake <= 5; とするかです。
逆パターンも可能です:smile:

```例.java
for (int cake = 5; cake > 0; cake--)
```

これだと初期値に 5 を代入し、cake-- なので変数 cake の値は 1 ずつ減っていきます。
cake > 0; つまり　1 > 0 になるまで処理を続けるということです。

# continue 文
:sunny: 指定した周だけ処理をスキップし次の周へ。

```例.java
public class Main {
    public static void main(String[] args) {
        for (int cake = 0; cake < 5; cake++) {
            if (cake == 3) {
                continue;
            }
            System.out.println("パンケーキ食べたい！");
        }
    }
}
```

どういうことかというと

if (cake == 3) {
                continue;
            }

変数 cake に 3が代入されたら、処理（パンケーキ食べたい！）はせずに
次の処理に移ってください。
ということです:smile:

そのため実行すると

```コンソール.
パンケーキ食べたい！
パンケーキ食べたい！
パンケーキ食べたい！
パンケーキ食べたい！
```

の４回しか実行されていません:smile:
switch 文のときに break で処理を止めたかと思います。

break → 処理を中断する。
continue → 指定した周だけ処理をスキップし次の周へ。

この 2 つは似ているようで違います。
ちなみに上記の continue の部分を break に変更すると
処理は ３ 回で中断されるので
パンケーキ食べたい！　は 3 回しか処理されません。

# ブロック と 条件式
## ブロック
:sunny: 分岐や繰り返しで実行する一連の文の集まり

```例.java
public class Main {
	public static void main(String[] args) {
	    boolean bread = true;
	    if (bread == true) {
	        System.out.println("じゃあトーストにして食べよう！");
	    } else {
	        System.out.println("パン屋へ買いに行こう！");
	    }
	}
}
```

さっき if 文で説明したコードを例にしますね:smile:
ブロックはどの部分になるのか？というと 5行目 と 7行目 です。
もうちょい詳しくいうと

```例.java
{
System.out.println("じゃあトーストにして食べよう！");
}
```

4 行目の if (bread == true) のあとにある　{　から
６ 行目の else の前にある　｝　までがブロックです。

```例.java
{
System.out.println("パン屋へ買いに行こう！");
}
```

6 行目の else のあとにある　｛　から
８ 行目の　｝　までがブロックです。

```例.java
public class Main {
	public static void main(String[] args) {
		int day = 1;
        while (day <= 7) {
            System.out.println(day + "日目");
            day++;
        }
        System.out.println("１週間が経ちました");
    }
}
```

さっきの while 文でも説明しますね:smile:

```例.java
{
System.out.println(day + "日目");
day++;
}
```

４ 行目の while (day <= 7) のあとにある　｛　から
７ 行目の　｝　までです。


## 条件式
:sunny: if や while のあとに（）内に記入された式
:sunny: （）の中身は if 文なら処理を分岐する条件、while 文なら繰り返しを続ける条件を記入

```例.java
if (bread == true)
```

の (bread == true) とか

```例.java
while (day <= 7)
```

の (day <= 7) とかのことです。