# 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>
> 老閏年題了
>
> 計算輸入的年份是否為閏年,其條件為:
1.不可被4整除者為平年。
2.可被100整除者為平年。
3.可被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`,才會執行`{}`內的程式

`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)