# 條件判斷
#### 講者:向景亘
###### 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" -->
執行結果

----
<!-- .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" -->

兩者執行上結果不同
---
<!-- .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" -->
執行結果

----
<!-- .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" -->

----
<!-- .slide: data-transition="convex-in convex-out" -->
執行結果

----
<!-- .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;
}
```
----
執行結果

----
<!-- .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" -->
執行結果

----
<!-- .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;
}
```
----
執行結果

----
<!-- .slide: data-transition="convex-in convex-out" -->

- [詳細參見](https://discuss.codechef.com/questions/97411/operator-precedence-table)
----
<!-- .slide: data-transition="convex-in convex-out" -->
# 善用 "(" 和 ")"
----

{"metaMigratedAt":"2023-06-15T00:00:56.886Z","metaMigratedFrom":"Content","title":"條件判斷","breaks":true,"contributors":"[{\"id\":\"59aaf2bc-cfcc-4ee3-a45e-d1046a516cbd\",\"add\":14268,\"del\":1989}]"}