# 條件判斷 #### 講者:向景亘 ###### tags: `lion_1081` --- # 前情提要 ---- # 布林運算 Boolean ---- <!-- .slide: data-transition="convex-in convex-out" --> # 比較運算子 ---- <!-- .slide: data-transition="convex-in convex-out" --> |運算子|用法||運算子|用法| |:------:|:---:|:-:|:-:|:-:| |大於 `>`|`a > b`||不等於 `!=`|`a != b`| |大於等於 `>=`|`a >= b`||非(反) `!`|`!a`| |小於 `<`|`a < b`||且 `&&`|`a && b`| |小於等於 `<=`|`a <= b`||或 `||`|`a || b`| |等於 `==`|`a == b`| <!--布林運算--> <!--zero, or not zero--> ---- <!-- .slide: data-transition="convex-in convex-out" --> - 若比較運算式成立,回傳一個非零的值 - 反之回傳 0 --- # if ---- <!-- .slide: data-transition="convex-in convex-out" --> 語法 ```C= if (condition) statement; // do statement only when condition is true ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main(){ int today; printf("What day is today?:\n"); scanf("%d", &today); if (today == 2) //if判斷句 printf("I need to go to lion class!\n"); //if成立後的執行內容 return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```flow st=>start: scanf e=>end: return 0 cond=>condition: today = 2 ? op=>operation: print line 7 st->cond->op->e cond(yes)->op cond(no)->e ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> 執行結果 ![](https://i.imgur.com/8X3bsn5.png) ---- <!-- .slide: data-transition="convex-in convex-out" --> - 若`if`括號中的判斷成立,則執行if後之指令 - 若指令有多行,必須加大括號 ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= /* 我有加大括號 */ if (today == 2) { printf("I need to go to lion class!\n"); printf("I don't konw what Xiao Guang Guang talking about QAQ\n"); } /* 我沒有加大括號 */ if (today == 2) printf("I need to go to lion class!\n"); printf("I don't konw what Xiao Guang Guang talking about QAQ\n"); ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ![](https://i.imgur.com/dPXwKW7.png) 兩者執行上結果不同 --- <!-- .slide: data-transition="convex-in convex-out" --> ## if-else ---- <!-- .slide: data-transition="convex-in convex-out" --> 語法 ```C= if (condition) statement1; /* do statement1 only when condition is true */ else statement2; /* do statement2 only when condition is false */ ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main() { int today; printf("What day is today?:\n"); scanf("%d", &today); if (today == 2) //if判斷句 printf("I need to go to lion class!\n"); // if成立後的執行內容 else // 若if判斷句不成立 printf("I can study C in my room all night!\n"); // if不成立後的執行內容 return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```flow st=>start: scanf e=>end: return 0 cond=>condition: today = 2 ? op1=>operation: print line 7 op2=>operation: print line 9 st->cond->op1->e op2->e cond(yes)->op1 cond(no)->op2 ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> 執行結果 ![](https://i.imgur.com/cLgy2Lx.png) ---- <!-- .slide: data-transition="convex-in convex-out" --> - 若條件符合if判斷,則執行if判斷之敘述句 - 若條件不符合if判斷,則執行else判斷之敘述句 ---- ## 小試身手 #1 ### 判斷平年或閏年 [答案在這邊](https://gist.github.com/AmyLin0210/0ca87afb4066a094dc46f7a5a8219a0b) --- <!-- .slide: data-transition="convex-in convex-out" --> # 那如果要執行三個以上的判斷呢? ---- <!-- .slide: data-transition="convex-in convex-out" --> # if-else巢狀結構 ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= if (condition1) statement1; //do when condition1 is true else { if (condition2) // check when condition1 is false statement2; // do when condition2 is true else { if (condition3) // check when condition1&2 is false statement3; // do when condition3 is true else { . . . . } } } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main() { int today; printf("What day is today?:\n"); scanf("%d", &today); if (today == 1) // if判斷句 printf("I don't want to go to school!\n"); // if成立後的執行內容 else { // line 6 if不成立後執行 if (today == 2) printf("I need to meet Xiao Guang Guang!\n"); else { // line 9 if不成立後執行 if (today == 6 || today == 7) printf("I can sleep all day!\n"); else // line 12 if不成立後執行 printf("I can study C in my room all night!\n"); } } return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```flow st=>start: scanf e=>end: return 0 cond1=>condition: today = 1 cond2=>condition: today = 2 cond3=>condition: today = 6 7 op1=>operation: print line 7 op2=>operation: print line 10 op3=>operation: print line 13 op4=>operation: print line 15 st->cond1->op1->e cond1(yes)->op1 cond1(no)->cond2 cond2(yes)->op2 cond2(no)->cond3 cond3(yes)->op3 cond3(no)->op4 op1->e op2->e op3->e op4->e ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> # 可以判斷多重判斷式 #### 可是如果巢狀結構太長? ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main() { int today; printf("What day is today?:\n"); scanf("%d", &today); if (today == 1) printf("Today is Monday\n"); else { if (today == 2) printf("Today is Tuesday\n"); else { if (today == 3) printf("Today is Wednesday\n"); else { if (today == 4) printf("Today is Thrusday\n"); else { if (today == 5) printf("Today is Friday\n"); else { if (today == 6) printf("Today is Saturday\n"); else printf("today is Sunday\n"); } } } } } return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ## 利用if else-if else改寫巢狀結構 ---- <!-- .slide: data-transition="convex-in convex-out" --> ```c= if (condition1) statement1; //do when condition1 is true else if (condition2) //check when condition1 is false statement2; //do when condition2 is true . . . else statementx; //do when all above is false ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main() { int today; printf("What day is today?:\n"); scanf("%d", &today); if (today == 1) //if判斷句 printf("I need to go to physics class!\n"); //if成立後的執行內容 else if (today == 2) //else if判斷句 只會在if不成立的狀況下檢查 printf("I need to go to lion class!\n"); //else if 成立後的執行內容 else if (today == 6 || today == 7) //前兩者不成立後檢查 printf("I can sleep all day!\n"); //此else if 成立後執行 else //若以上判斷句不成立 printf("I can study C in my room all night!\n"); //以上不成立後的執行內容 return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```flow st=>start: scanf e=>end: return 0 cond1=>condition: today = 1 cond2=>condition: today = 2 cond3=>condition: today = 6 7 op1=>operation: print line 7 op2=>operation: print line 9 op3=>operation: print line 11 op4=>operation: print line 13 st->cond1->op1->e cond1(yes)->op1 cond1(no)->cond2 cond2(yes)->op2 cond2(no)->cond3 cond3(yes)->op3 cond3(no)->op4 op1->e op2->e op3->e op4->e ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> - 清楚易懂 - 程式碼長度也可以縮減 - 記得判斷優先順序 ---- <!-- .slide: data-transition="convex-in convex-out" --> ## 小試身手 #2 ### 判斷今年某月有幾日 [Answer](https://gist.github.com/AmyLin0210/1187b97faebb1dc61e306100b12e5317) --- <!-- .slide: data-transition="convex-in convex-out" --> ## switch ---- <!-- .slide: data-transition="convex-in convex-out" --> ```c= switch (variable) { case 1: statement1; break; case 2: statement2; break; . . . . default: statementx; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main() { int time; printf("What time is it?\n"); scanf("%d", &time); switch(time) { //大括號重要!! case 7: printf("7 a.m, eat breakfast\n"); break; //記得break!!! case 12: printf("12 p.m, eat lunch\n"); break; //記得break!!! case 18: printf("6 p.m, eat dinner\n"); break; //記得break!!! default: printf("snack time!!\n"); } return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ![](https://i.imgur.com/VmyLMMs.png) ---- <!-- .slide: data-transition="convex-in convex-out" --> 執行結果 ![](https://i.imgur.com/2WUSmZY.png) ---- <!-- .slide: data-transition="convex-in convex-out" --> - switch跟if某方面可以互通,但是程式可讀性switch較好 - 最後的default(預設判斷式)可以不用加break - switch的變數與case都一定要是`integer`或是`char` - <font color="red">switch內部所有判斷式必須用大括號框起來!</font> - **<font color="red">case後面記得加break!!!!</font>** - **<font color="red">case後面記得加break!!!!</font>** - **<font color="red">case後面記得加break!!!!</font>** - 很重要要說三次 ---- ## 如果不加break會怎麼樣? ---- ```c= #include <stdio.h> int main() { int time; printf("What time is it?\n"); scanf("%d", &time); switch(time){ case 7: printf("7 a.m, eat breakfast\n"); //我沒有break case 12: printf("12 p.m, eat lunch\n"); //我沒有break case 18: printf("6 p.m, eat dinner\n"); //我沒有break default: printf("snack time!!\n"); } return 0; } ``` ---- 執行結果 ![](https://i.imgur.com/K4RIDbX.png) ---- <!-- .slide: data-transition="convex-in convex-out" --> ## 小試身手 #3 ### 判斷今年某月有幾日 [Answer](https://gist.github.com/AmyLin0210/d95c37ce9933fadc72845b78f78ab026) --- <!-- .slide: data-transition="convex-in convex-out" --> ## ? : 條件式運算子 (三元運算子) ## conditional operator (Ternary Operator) ---- <!-- .slide: data-transition="convex-in convex-out" --> ## 簡單來說,if+else的簡短版 ---- <!-- .slide: data-transition="convex-in convex-out" --> ```c= (condition)?expression1:expression2; // do statement1 when condition is true, otherwise do statement2 ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main() { int a, x, y; scanf("%d%d", &x, &y); a = (x == y)? x : y; printf("%d\n", a); return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> 同樣可以寫成 ```C= #include <stdio.h> int main() { int a, x, y; scanf("%d%d", &x, &y); if (x == y) a = x; else a = y; printf("%d\n", a); return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> - 簡潔度:條件式運算子 > if-else - 程式易讀性:if-else > 條件式運算子 - [微軟的定義](https://msdn.microsoft.com/zh-tw/library/e4213hs1.aspx) --- ## 補充一 ## integer與布林運算 ---- <!-- .slide: data-transition="convex-in convex-out" --> ```C= #include <stdio.h> int main() { int i; scanf("%d", &i); if (i) //true printf("true\n"); else //false printf("false\n"); return 0; } ``` ---- <!-- .slide: data-transition="convex-in convex-out" --> 執行結果 ![](https://i.imgur.com/EV2LlrA.png) ---- <!-- .slide: data-transition="convex-in convex-out" --> - C語言中,零為false,非零為true - 如果使用int當布林變數存取,請全部用整數! - [C語言中的Boolean演變](https://www.ptt.cc/bbs/C_and_CPP/M.1392678898.A.DA5.html) --- <!-- .slide: data-transition="convex-in convex-out" --> ## 補充二:運算子優先順序 ---- ```c= #include <stdio.h> int main() { int grade; scanf("%d", &grade); if(100 > grade > 60) printf("你好棒\n"); else printf("不及格\n"); return 0; } ``` ---- 執行結果 ![](https://i.imgur.com/Cc3mMtS.png) ---- <!-- .slide: data-transition="convex-in convex-out" --> ![Imgur](https://i.imgur.com/8JI4dKf.jpg =1000x) - [詳細參見](https://discuss.codechef.com/questions/97411/operator-precedence-table) ---- <!-- .slide: data-transition="convex-in convex-out" --> # 善用 "(" 和 ")" ---- ![Imgur](https://i.imgur.com/80at3qi.jpg)
{"metaMigratedAt":"2023-06-15T00:00:56.886Z","metaMigratedFrom":"Content","title":"條件判斷","breaks":true,"contributors":"[{\"id\":\"59aaf2bc-cfcc-4ee3-a45e-d1046a516cbd\",\"add\":14268,\"del\":1989}]"}
    1116 views