---
# System prepended metadata

title: Ch03 if 條件判斷
tags: [程式教學]

---

# Ch03 if條件判斷
> 上一章: [Ch02 變數與運算](https://hackmd.io/@sunfrancis12/r1AweRsfT)
> 下一章: [Ch04 while 迴圈](https://hackmd.io/@sunfrancis12/BJB6lCiG6/edit)
> 回目錄: [NTCU程式戰鬥營C講義](https://hackmd.io/@sunfrancis12/ByfdXdjG6)

## if判斷式
if()的功能就是條件判斷，如同字面上的意思，類似於 **如果滿足....的條件則執行...** 的效果
```cmake=
如果今天下午沒課:      //如果今天下午沒課，我就去打機
    我就去機廳打機

if(money>30):       //如果身上的錢大於30塊，就可以再打一道
    再...再一道就好.. 
```

**if的運算子:**

| 運算子 | 意義     | 範例                                |
| ------ | -------- | ----------------------------------- |
| >      | 大於     | a>b (當a的值大等於b的值則成立)      |
| <      | 小於     | a<b (當a的值小於b的值則成立)        |
| ==     | 等於     | a==b (當a的值相等於b的值則成立)     |
| !=     | 不等於   | a!=b (當a的值不等於b的值則成立)     |
| >=     | 大於等於 | a>=b (當a的值大等等於於b的值則成立) |
| <=     | 小於等於 | a<=b (當a的值小於等於b的值則成立)   |



以下是一個if使用例子
```c=
#include<stdio.h>

int main(){
    int money;
    scanf("%d",&money);

    if(money>30){
        printf("太好了我身上還有30塊以上");
    }
}
```
輸入內容:
```c=
40
```
輸出結果:
```c=
太好了我身上還有30塊以上
```
## else判斷
如同字面上的意思，`else`的意思類似於 **要是條件不成立，那就...**
```cmake=
如果今天下午沒課:        //如果今天下午沒課，我就去打機
    我就去機廳打機
如果條件不成立，那就只好: //下午有課(條件不成立)
    乖乖上課

if(money>30):        //如果身上的錢大於30塊，就可以再打一道
    再...再一道就好..
else:
    好吧，只能回家了
```

以下是if-else的使用例子
```c=
#include<stdio.h>

int main(){
    int money;
    scanf("%d",&money);

    if(money>30){
        printf("太好了我身上還有30塊以上");  //條件成立(money>30)
    }else{
        printf("沒錢了乖乖走吧");  //條件不成立(money<30)
    }
}
```
輸入內容:
```c=
15
```
輸出結果:
```c=
沒錢了乖乖走吧
```
## else if判斷
如同字面上的意思，`else if`的意思類似於 **要是上一個條件不成立，那我再試試...**
```cmake=
如果今天下午沒課:        //如果今天下午沒課，我就去打機
    我就去機廳打機
那如果今天下午是通識:      //今天下午有課，但是是通識課
    那就偷偷地...
如果條件不成立，那就只好: //下午有課(條件不成立)
    乖乖上課
```

以下是else if的使用例子
```c=
#include<stdio.h>

int main(){
    int money;
    scanf("%d",&money);

    if(money>90){
        printf("太好了我還可以玩個3道");  
    }else if(money>60){ //第一個條件不成立，則試試第二個
        printf("太好了我還可以玩個2道");
    }else if(money>30){ //第二個條件不成立，則試試第三個
        printf("太好了我還可以玩個1道");
    }else{  //上述的條件都不成立則執行else
        printf("沒錢了乖乖走吧");  
    }
}
```
輸入內容:
```c=
40
```
輸出結果:
```c=
太好了我還可以玩個1道
```
## 多重條件判斷
我們可以再單一個if()中塞入多種條件


| 運算子 | 意義                    | 範例                                                     |
| ------ | ----------------------- | -------------------------------------------------------- |
| &&     | AND(所有條件都必須成立) | a>100 && b>100 && c>100 (a,b,c都必須大於100)             |
| \|\|   | OR(所有條件其中有成立)  | a>100 \\|\| b>100 \|\| c>100 (a,b,c只需要其中一個大於100) |

多重條件判斷範例:
```c=
#include<stdio.h>

int main(){
    int money,time;
    scanf("%d%d",&money,&time);

    if(money>30 && time>10){ //money>30而且time>10
        printf("太好了我還可以玩個1道");  
    }else if(time>10){
        printf("我還有時間，可惜沒錢了");
    }else if(money>30){
        printf("我還有錢，但是來不及了");
    }else{
        printf("沒錢又沒時間，真慘");
    }
    
}
```
輸入內容:
```c=
40 20
```
輸出結果:
```c=
太好了我還可以玩個1道
```
除此之外，我們也可以透過()的方式讓內部的結果先判斷
```c=
if((n>100 && n<1000) && a>100)
    
//等同於
if(n>100 && n<1000)
    if(a>100)
```
<a style="color:orange">【例題】</a>
> 遊樂園推出了一個促銷活動，原本的票價為500元
> * 只要年齡介於10-12歲之間的小朋友，即可享6折優惠
> * 只要出生月份為12月的小朋友，即可享8折優惠
> * 只要年齡介於10-12歲之間，且出生月份為12月的小朋友，即可享5折優惠
> 
> 請寫出一個程式判斷小朋友是否符合折扣的資格
> 
> 輸入: 年齡 出生月份
> 輸出: 票價

範例程式:
```c=
#include<stdio.h>

int main(){
    int age,month;
    scanf("%d%d",&age,&month);

    float ticket=500;
    if((age>=10 && age<=12) && month==12){
        ticket *= 0.5;
    }else if(age>=10 && age<=12){
        ticket *= 0.6;
    }else if(month==12){
        ticket *= 0.8;
    }
    
    printf("最終票價: %f",ticket);
}
```
輸入內容(輸入後依次執行):
```c=
10 11
13 12
11 12
```
輸出結果(依次執行的輸出):
```c=
最終票價: 300.000000
最終票價: 400.000000
最終票價: 250.000000
```
<a style="color:orange">【例題】</a>
> 老閏年題了
>
> 計算輸入的年份是否為閏年，其條件為：
  １.不可被4整除者為平年。
  ２.可被100整除者為平年。
  ３.可被400整除為閏年。

範例程式:
```c=
#include<stdio.h>

int main(){
    int year;
    scanf("%d",&year);

    if(year%4==0){ //被4整除
        if(year%400==0){ //被400整除
            printf("%d年是閏年喔",year);
        }else if(year%100==0){ //被100整除
            printf("%d年不是閏年喔",year);
        }else{ //被4整除
            printf("%d年是閏年喔",year);
        }
    }else{
        printf("%d年不是閏年喔",year);
    }

}
```
輸入內容(輸入後依次執行):
```c=
2000
1900
1904
1999
```
輸出結果:
```c=
2000年是閏年喔
1900年不是閏年喔
1904年是閏年喔
1999年不是閏年喔
```
<a style="color:red">【另解】</a>
利用多重判斷的解答:
```c=
#include<stdio.h>

int main(){
    int year;
    scanf("%d",&year);

    if(((year%4==0) && (year%100!=0)) || (year%400==0)){
        printf("%d年是閏年喔",year);
    }else{
       printf("%d年不是閏年喔",year); 
    }
}
```
## if的本質
我們會把我們要的條件稱作`condition`，只有當`condition`評估為非零值或`true`，才會執行`{}`內的程式

![image.png](https://hackmd.io/_uploads/SyPOs3gXT.png)

`condition` 評估為非零的運算式包括：

* true
* 任何非零算術值
* 非 Null 指標
* 類別類型，定義對算術、布林值或指標類型的明確轉換
> [if-else 語句 （C++）-Microsoft](https://learn.microsoft.com/zh-tw/cpp/cpp/if-else-statement-cpp?view=msvc-170)


Condition的回傳範例:
```c=
if(30<50) => true
if(4!=3) => true
if(2==1) => false
if(0) => false
if(1) => true
if(35) => true
if(234.234) => true
```
完整程式碼:
```c=    
#include<stdio.h>

int main(){
    
    // 1 = true, 0 = false
    printf("(30<50) => %d\n",30<50);
    printf("(4!=3) => %d\n",4!=3);
    printf("(2==1) => %d\n",2==1);

    if(0) printf("0 => true\n");
    else printf("0 => false\n");

    if(1) printf("1 => true\n");
    else printf("1 => false\n");

    if(35) printf("35 => true\n");
    else printf("35 => false\n");

    if(234.234) printf("234.234 => true\n");
    else printf("234.234 => false\n");

}
```
輸出結果:
```c=
(30<50) => 1
(4!=3) => 1
(2==1) => 0
0 => false
1 => true
35 => true
234.234 => true
```


---

> 上一章: [Ch02 變數與運算](https://hackmd.io/@sunfrancis12/r1AweRsfT)
> 下一章: [Ch04 while 迴圈](https://hackmd.io/@sunfrancis12/BJB6lCiG6/edit)
> 回目錄: [NTCU程式戰鬥營C講義](https://hackmd.io/@sunfrancis12/ByfdXdjG6)