# 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`,才會執行`{}`內的程式 ![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)