Hello Worldからの復習 ～分岐処理編～

たまには前置きをせずに復習を始めてみよう。




##### お品書き
+ 構造化プログラミング
+ if文
+ else if文
+ switch文
+ if文とseitch文の使い分け

-----


**◆構造化プログラミング**
-
下記の構造を組み合わせてプログラムを書くこと。
プログラムがわかりやすくなる。

##### ①順次進行
処理を上から順々に実行していく構造

```mermaid
graph TD;
    start-->
    A処理-->B処理;
    B処理-->C処理;
```

##### ②分岐
ある条件を通って満たされるなら**true**
満たされないなら**false**を
という処理をわける構造
```mermaid
graph TD;
    Start([Start])-->B{条件}
    B{条件}-->|true|1処理;
    B{条件}-->|false|2処理;
    1処理-->END;
    2処理-->END;
```

##### ③繰り返し
ある条件が満たされている間は同じ処理を繰り返す構造
```mermaid
graph TD;
    start-->
    IFS[/A処理\]-->B処理;
    B処理-->IFB[\C処理/];
```




**◆if文**
-
```java:java
if( 条件式 ){
  処理1
}else{
  処理2
}
```

・どちらかの処理しか実行されない
・else以降は省略可
※省略した場合、条件を満たさないときは何もしない
・処理が1つのときは`{ }`を省略可
※省略できるがプログラムがわかりにくくなるため非推奨

**◆if文Sample**
-

```java:java
class Aaa{
  public static void main(String[] args){
    int price = Integer.parseInt(args[0]);
    double rate = 0.10;         // 消費税率：10%;
    int discount, amount;       
    
    if( price >= 3000 ){        // 値引額の設定 3000円以上か以未満か見る
      discount = 300;           //3000円以上なら300円割引しますよ
    } else {
      discount = 0;             //3000円未満なら割引なし
    }

    amount = (int)((price - discount) * (1 + rate)); //if文で見た金額を計算して消費税率を計算。前回出てきた型変換
    System.out.println("値引金額：" + discount + "円");
    System.out.println("税込金額：" + amount + "円");
  }
}
```
例えば購入価格が5000円だったら。

```cmd:cmd
C:\Java\1>java Aaa 5000
値引金額：300円
税込金額：5170円

値引きされないパターン
C:\Java\1>java Aaa 2999
値引金額：0円
税込金額：3298円
```

**◆else if文**
-

```java:java
if( 条件式1 ){
    処理1
}else if(条件式2){
    処理2
}else{
    処理3
}
```


```mermaid
graph TD;
    Start([Start])-->B{条件}
    B{条件1}-->|true|処理1;
    B{条件1}-->|false|2{条件2};
    処理1-->END;
    2{条件2}-->|true|処理2;
    2{条件2}-->|false|処理3;
    処理2-->END;
    処理3-->END;
```

・条件は上から順に判定

**◆elase if文Sample**
-
さっきのSampleに**else if文**を追加
```java:java
class Aaa{
  public static void main(String[] args){
    int price = Integer.parseInt(args[0]);
    double rate = 0.10;         // 消費税率：10%;
    int discount, amount;
    
    if( price >= 5000 ){        // 購入金額が5000円以上か未満か
      discount = 500;           //以上なら割引
    } else if ( price >= 3000 ){ //3000円以上か未満か
    	discount = 300;          //以上なら割引
    } else {
      discount = 0;              //3000未満だったら割引なし
    }

    amount = (int)((price - discount) * (1 + rate));
    System.out.println("値引金額：" + discount + "円");
    System.out.println("税込金額：" + amount + "円");
  }
}

```

```cmd:cmd
C:\Java\1>java Aaa 5000
値引金額：500円
税込金額：4950円

C:\Java\1>java Aaa 4999
値引金額：300円
税込金額：5168円

C:\Java\1>java Aaa 3000
値引金額：300円
税込金額：2970円

C:\Java\1>java Aaa 2999
値引金額：0円
税込金額：3298円
```
5000円購入すれば500円引き、3000円から4999円までなら300円引き。
3000円未満は値引きなしという結果。



条件式の結果って`boolean型`ですね。

**◆switch文**
-
一度に処理を多分岐に分けられる。


```mermaid
graph TD;
    Start([Start])-->B{式}
    B{式}-->|値1|処理1;
    B{式}-->|値2|処理2;
    B{式}-->|その他|処理3;
    処理1-->END;
    処理2-->END;
    処理3-->END;
```

```java:java
switch(式){
  case 値1 ;
    処理1
   break ;
   case 値2 ;
    処理2
   break ;
   defaut ;
    処理3
}
```
式は**byte型、short型、int型、char型**等。
式の値によって処理の開始位置が決まる。
例えば、式の値が値1と同じなら**case1**から処理をスタート。値2と同じなら**case2**からスタート。

**bresk**は`{ 処理 }`を抜ける。


**◆switch文Sample**
-

```java:java
class Aaa{
  public static void main(String[] args){
    int num = Integer.parseInt(args[0]);
    switch( num ){
      case 1:
        System.out.println("入園料金：8,400円");
        break; //入力された値が1なら抜ける
      case 2:
        System.out.println("入園料金：7,000円");
        break; //入力された値が2なら抜ける
      case 3:
        System.out.println("入園料金：5,000円");
        break; //入力された値が3なら抜ける
      default: //それ以外
        System.out.println("1:一般，2:中・高校生，3:小学生・幼児");
    }
  }
}
```

```cmd:cmd
class Branch3{
  public static void main(String[] args){
    int num = Integer.parseInt(args[0]);
    switch( num ){
      case 1:
        System.out.println("入園料金：8,400円");
        break;
      case 2:
        System.out.println("入園料金：7,000円");
        break;
      case 3:
        System.out.println("入園料金：5,000円");
        break;
      default:
        System.out.println("1:一般，2:中・高校生，3:小学生・幼児");
    }
  }
}
```

**break処理をしないとどうなる？**

```java:java
class Aaa{
  public static void main(String[] args){
    int num = Integer.parseInt(args[0]);
    switch( num ){
      case 1:
        System.out.println("入園料金：8,400円");
        // break;
      case 2:
        System.out.println("入園料金：7,000円");
        // break;
      case 3:
        System.out.println("入園料金：5,000円");
        break;
      default:
        System.out.println("1:一般，2:中・高校生，3:小学生・幼児");
    }
  }
}
```
breakで抜けないため、入力された値の位置から順に処理をしていく。

```cmd:cmd
C:\Java\1>java Aaa 1
入園料金：8,400円
入園料金：7,000円
入園料金：5,000円

C:\Java\1>java Aaa 2
入園料金：7,000円
入園料金：5,000円
```

**◆if文とswitch文の使い分け**
-
基本的には**if文**を使うと思う。
switch文で出来る処理はif文でもできる。

がしかし、

if文は`tureかfalse`で見て上から処理する二分岐なので、swich文と同じ処理をしようもんなら条件の数だけ`else if`を記述していくため、コードの複雑化、処理速度が遅くなったりする。

switch文Sampleのように変数の値によって処理を一度に多分岐したいときはswitch文の方がわかりやすい。


どんな処理のしたいかを考え、適切な方をえらびましょ。