If-else & switch
Arvin Liu
一個方便找投影片的目錄
Syllabus
內容 | 快速連結 |
---|---|
前導 Before class | Section 1 |
Relational Operator 關係運算子 | Section 2 |
if-else 選擇結構 | Section 3 |
Ex I - 電神裴裴隱匿錄 | Section 4 |
Nested if-else 巢狀選擇結構 | Section 5 |
Ex II - 我們與裴裴的距離 | Section 6 |
Logical Operator 邏輯運算子 | Section 7 |
Exercise III | Section 8 |
Conditional Operator 條件運算子 | Section 9 |
bool 專門存真/假的變數型態 | Section 10 |
Review | Section 11 |
Exercise IV | Section 12 |
Switch-case | Section 13 |
這個投影片怎麼用呢?
Before Before Class - 0
- 上下左右切換投影片,用ESC可以看到整個投影片的大綱。
- 每個直排都是一個主題,右上角有編號,你可按右上角的 回第一頁。
- 正確觀看順序:一直往下,到底往右。
Esc後大概長這樣,你可以先Esc在上下左右選你要看哪頁投影片。
關於這堂課
Before Before Class - 1
-
這堂課(if-else)幾乎都在講語法,可能會有點無聊:(
- 自己往後看也沒問題!
講義主要是設計給大家閱讀和複習的,而不是拿來講課的。
- 自己往後看也沒問題!
- 在接下來的課程中 (if-else + 迴圈 + 進階迴圈 + 遞迴) ,
我會不時的讓大家做有計時的練習題,雖然有計時不過大家還是別太緊張(?)- 寫練習題時,如果真的不會就趁機趕快複習以前的東西,
沒寫出來回家再看也沒關係,code都有附。
- 寫練習題時,如果真的不會就趁機趕快複習以前的東西,
- 有問題不要害羞,可以直接匿名發問。
Before Class...
上課前耍個廢吧 😎😎😎
上課前,耍個廢
Before Class - 0
你看了什麼?
Before Class - 1
: 我接下來會出布,我沒出布結果贏了算平手。
如果 正常思考,出布勝率只有1/3,出石頭和剪刀顯然剪刀有利,所以 認為 會出石頭打剪刀,所以她會出布。所以我( )會出剪刀。
但如果 看了我靠北頗具挑釁的臉後冷靜下來,她會發現 出布是唯一贏的可能,所以預測 會出布, 該出剪刀。所以我( )會出石頭。
勝負表
你看了什麼?
Before Class - 2
: 我接下來會出布,我沒出布結果贏了算平手。
如果 正常思考,我( )會出剪刀。
但如果 看了我靠北頗具挑釁的臉後冷靜下來,我( )會出石頭。
人生就是這麼多如果。
那程式呢?
看不懂就算了,這不是這堂課的重點
勝負表
人生總是會有分歧的... 程式也是
Before Class - 3
- 你目前第一堂課所學到的程式都是「循序結構」,也就是都是一條線的結構。
- 有沒有一種天方夜譚可以做到像右邊一樣的「選擇結構」呢?
- 在講怎麼做選擇結構之前,先學學怎麼用程式做判斷吧!
循序結構例圖
選擇結構例圖
Relational Operator
關係運算子
什麼是關係運算子?
Relational Operator 關係運算子 - 0
- 其實就是來判斷兩個東西關係的符號啦!
- 例如兩個變數一不一樣,大於小於等等。
- 判斷完後會得到一個值,這個值只會有兩種可能,True(真) 或 False(假)
- 關係運算子總共有六種: (記得判斷等於有兩個=!)
符號 | 意思 | 舉例1 | 舉例1的結果 | 舉例2 | 舉例2的結果 |
---|---|---|---|---|---|
== | 判斷是否等於 | 1 == 2 | False | 1 == 2 - 1 | True |
!= | 判斷是否不等於 | 1 != 2 | True | 0 != 5 * 0 | False |
> | 判斷是否大於 | 7 > 5 | True | 5 + 1 > 5 + 1 | False |
< | 判斷是否小於 | 7 < 5 | False | 5 < 5 | False |
>= | 判斷是否大於等於 | 7 > 5 | True | 5 >= 5 | True |
<= | 判斷是否小於等於 | 7 < 5 | False | 5 <= 5 | True |
轉變程式,印出結果!
- 輸入兩個整數x, y,輸出x不等於y的結果。
- 可以直接用變數套進去判斷式裡面。
- 要輸出的值記得用括號包起來,表示先做括號。
符號 | 意思 |
---|---|
== | 判斷是否等於 |
!= | 判斷是否不等於 |
> | 判斷是否大於 |
< | 判斷是否小於 |
>= | 判斷是否大於等於 |
<= | 判斷是否小於等於 |
怕你忘記,我把表放過來。
#include <iostream>
using namespace std;
int main () {
int x, y;
cin >> x >> y;
cout << (x != y) << endl;
return 0;
}
- 輸入5 5,會輸出0,表示條件為假。(也就是False)
- 輸入5 6,會輸出1,表示條件為真。(也就是True)
3 mins
Relational Operator 關係運算子 - 1
為甚麼判斷等於要==?
- 看看下面這份code會跑出什麼東西?
符號 | 意思 |
---|---|
== | 判斷是否等於 |
!= | 判斷是否不等於 |
> | 判斷是否大於 |
< | 判斷是否小於 |
>= | 判斷是否大於等於 |
<= | 判斷是否小於等於 |
怕你忘記,我把表放過來。
#include <iostream>
using namespace std;
int main () {
int x, y;
cin >> x >> y;
cout << (x = y) << endl;
cout << x << endl;
return 0;
}
- 輸入5 7,會輸出7 和 7。為甚麼?
- (x = y)這行執行結束後,x會等於y,然後程式會變成 。
- 透過第八行你就發現原本的x值被改成y了。
這裡的==不是表情符號==
cout << x << endl;
Relational Operator 關係運算子 - 2
If-else
選擇結構
If-else的基本語法
If-else 選擇結構 - 0
- 知道了怎麼用關係運算子做出判斷式,
我們就來學學選擇結構吧!
- if-else 語法 (不含註解):
- 如果覺得不用else,可以把else{}拿掉。
流程圖
// 前面的code
if (True 或 False) {
// 如果括號內是True,跑這個第一個大括號裡面的程式。
} else {
// 如果括號內是False,跑下面第二個大括號裡面的程式。
}
// 後面的code
If-else的基本語法
- if-else 語法 (不含註解):
// 前面的code
if (True 或 False) {
// 如果括號內是True,跑這個第一個大括號裡面的程式。
} else {
// 如果括號內是False,跑下面第二個大括號裡面的程式。
}
// 後面的code
範例的流程圖
- 範例:判斷pin碼。首先輸入一個整數 pin。
- 如果pin等於5356,輸出"Yes",否則輸出"No"。
int pin;
cin >> pin;
if (pin == 5356) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
If-else 選擇結構 - 1
If-else的基本語法
- if-else 沒有 else 的語法 (不含註解):
// 前面的code
if (True 或 False) {
// 如果括號內是True,跑這個第一個大括號裡面的程式。
}
// 後面的code
範例的流程圖
- 範例:輸入一個整數score。
- 如果score等於100,輸出"Dian!"。
int score;
cin >> score;
if (score == 100) {
cout << "Dian!" << endl;
}
If-else 選擇結構 - 2
code 好長喔 (?)
- 大括號是可以省略的,但僅限一行 (到分號為止一行)。
- 它可以幫你省一個大括號的空間。
- 但是不建議新手用!知道可以這樣寫就好。
- 例如pin碼的範例可以寫成下面這樣:
if 是能長到哪裡去?
int pin;
cin >> pin;
if (pin == 5356)
cout << "Yes" << endl;
else
cout << "No" << endl;
int pin;
cin >> pin;
if (pin == 5356)
cout << "Yes" << endl;
cout << "Hi!" << endl;
else
cout << "No" << endl;
大括號內只有一行,
可以省略大括號
大括號不只一行,
不可以省略大括號
If-else 選擇結構 - 3
縮排 - 讓你的code好看一點
- 被大括號包起來的code,在這裡我們稱為一個程式片段,
例如被if或else的大括號括起來的程式片段,或是你的main(){}。 - 為了增加程式可讀性,只要是一個程式片段 (省略大括號的也算),
我們會讓整個片段都往右移動tab或空2格以上的空格。
If-else 選擇結構 - 4
int pin;
cin >> pin;
if (pin == 5356)
cout << "Yes" << endl;
else
cout << "No" << endl;
int pin;
cin >> pin;
if (pin == 5356)
cout << "Yes" << endl;
else
cout << "No" << endl;
漂亮的縮排
(⌐■_■)
寫三小啦 看不懂啦
(╯‵□′)╯︵┴─┴
Exercise I
選擇結構
Exercise I
程式練習題
接下來有一題請你用
程式實做if-else的題目。
- 我會花1分鐘讀題。
- 總共計時5分鐘。
- 開好你的程式環境吧!
160 - 電神裴裴隱匿錄 - 題目
Exercise I - 電神裴裴隱匿錄 - 0
- 題目:給定三科成績,問成績個別是否等於60分,如果是輸出O,否輸出X。
- 範例測資:如果分數為60, 59, 60,輸出OXO。(結尾需要換行。)
5 mins
就是有人這麼喜歡裝B,平均50不就好了?
160 - 電神裴裴隱匿錄 - 解答
Exercise I - 電神裴裴隱匿錄 - 1
- 題目:給定三科成績,問成績個別是否等於60分,如果是輸出O,否輸出X。
- 如果只有一科,你應該會吧?
- 那麼有三科你應該也會吧?
- 不會?三科不就是三個一科嗎?
5 mins
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (a == 60)
cout << 'O';
else
cout << 'X';
if (b == 60)
cout << 'O';
else
cout << 'X';
if (c == 60)
cout << 'O';
else
cout << 'X';
cout << endl;
}
Nested If-else
多重選擇結構 - if裡面竟還有if?
Nested If-else
Nested if - 巢狀選擇結構 - 0
流程圖
- if的大括號裡面可不可以包if呢? 可以!
- else的大括號裡面可不可以包if呢?也可以!
-
像這種大括號裡面還有大括號的結構,
稱作巢狀結構 (Nested Structure)。
我們來試試看巢狀的if-else吧!
- 首先先設一個變數x,初始值自己給定。
- 輸入一個變數guess,
- 如果guess > x,輸出再猜小一點。
- 如果guess = x,輸出猜中了。
- 如果guess < x,輸出再猜大一點。
Nested If-else
Nested if - 巢狀選擇結構 - 1
流程圖
- 首先先設一個變數x,初始值自己給定。
- 輸入一個變數guess,
- 如果guess > x,輸出再猜小一點。
- 如果guess = x,輸出猜中了。
- 如果guess < x,輸出再猜大一點。
- 記得第二層的縮排要再往右一層。
int x = 7, guess;
cin >> guess;
if (guess > x) {
cout << "Smaller.\n";
} else {
if (guess == x) {
cout << "Atari!\n";
} else {
cout << "Larger.\n";
}
}
If - else if - else 結構
Nested if - 巢狀選擇結構 - 2
流程圖
- 如果else的大括號只有一個if結構,習慣會將這else的大括號省略,把if直接接在else後面。(這個你們就真的需要省大括號了😎)
- 而且第二層的縮排會跟著大括號省略。
- 這樣是不是看起來更整潔了呢?
int x = 7, guess;
cin >> guess;
if (guess > x) {
cout << "Smaller.\n";
} else if (guess == x) {
cout << "Atari!\n";
} else {
cout << "Larger.\n";
}
int x = 7, guess;
cin >> guess;
if (guess > x) {
cout << "Smaller.\n";
} else {
if (guess == x) {
cout << "Atari!\n";
} else {
cout << "Larger.\n";
}
}
原本的code
if-else if-else的結構code
好像怪怪的?這個省略
Nested if - 巢狀選擇結構 - 3
- 不是說只有一行?
這個else大括號裡面是個if結構也,很多行啊? - 你說對了,事實上,應該說大括號裡面
只有一個結構或一句程式,才可以省略。
if (guess > x) {
cout << "Smaller.\n";
} else if (guess == x) {
cout << "Atari!\n";
} else {
cout << "Larger.\n";
}
省略大括號的code
if (guess > x) {
cout << "Smaller.\n";
} else {
cout << "HAHA!\n";
if (guess == x) {
cout << "Atari!\n";
} else {
cout << "Larger.\n";
}
}
不能省略的例子。
Exercise II
多重if-else
Exercise II
程式練習題
接下來有一題請你用
程式實做多重if-else的題目。
- 我會花1分鐘讀題。
- 總共計時7分鐘。
- 開好你的程式環境吧!
161 - 我們與裴裴的距離 - 題目
Exercise II - 我們與裴裴的距離 - 0
- 題目:為了測量電神裴裴到底比你強了多少,給定你的三科成績,算出平均後依照下面對照表輸出你的平均等第。(句末要換行。)
- 如果平均分為69.66...,輸出一行"F",如果平均分為99.66...,輸出一行"A+"。
7 mins
分數等第對照表
某個老頭的語錄
161 - 我們與裴裴的距離 - 解答
Exercise II - 我們與裴裴的距離 - 1
7 mins
分數等第對照表
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
double avg_score = (double)(a+b+c) / 3;
if (avg_score >= 90)
cout << "A+\n";
else if (avg_score >= 85)
cout << "A\n";
else if (avg_score >= 80)
cout << "A-\n";
else if (avg_score >= 77)
cout << "B+\n";
else if (avg_score >= 73)
cout << "B\n";
else if (avg_score >= 70)
cout << "B-\n";
else
cout << "F\n";
}
- 題目:為了測量電神裴裴到底比你強了多少,給定你的三科成績,算出平均後依照下面對照表輸出你的平均等第。(句末要換行。)
- 就是一直else if就好,但是不要寫90 > avg_score >= 85這種東西。
161 - 我們與裴裴的距離 - 小問題
Exercise II - 我們與裴裴的距離 - 2
-
為甚麼不能寫90 > avg_score >= 85呢?
-
根據關係運算子,還有運算順序(從左到右),
程式會先處理 90 > avg_score。- (就跟你算1 + 2 + 3會先從1 + 2開始算一樣。)
- 如果 90 > avg_score 是 True,算式就會變成 True >= 85。
- True 其實就是 1 ,所以 1 >= 85 一定是False。
- 如果 90 > avg_score 是 False,算式就會變成 False >= 85。
- False 其實就是 0 ,所以 0 >= 85 一定是False。
- 所以你這樣寫最終答案都會是False。
- 雖然這題不需要,但是如果你要寫 90 > avg_score 且 avg_score >= 85,那該怎麼辦?
-
根據關係運算子,還有運算順序(從左到右),
7 mins
邏輯運算子 - 更複雜的邏輯組合
Logical Operator
什麼是邏輯運算子?
- 其實就是對T/F做運算的符號!
- 蛤?T/F還可以運算喔?可以!
- 我們剛剛所說的且就是一種!
- 且 &&:當兩個條件成立才成立。
- 85 <= score && score < 90 拿 A
- 或 || :當兩個條件有人成立就成立。
- 學測過門檻 || 靠TOI2階推薦保送,就可以上台大資工 (?)
- Not ! :就是真假反轉,
也就是True變False,False變True。
a && b (且) | a = True | a = False |
---|---|---|
b = True | True | False |
b = False | False | False |
Logical Operator 邏輯運算子 - 0
a || b (或) | a = True | a = False |
---|---|---|
b = True | True | True |
b = False | True | False |
! a | a = True | a = False |
---|---|---|
結果 | False | True |
且(and, &&)的運算表
或(or, ||)的運算表
Not(!)的運算表
幫你上一下邏輯課 😈
- 分析一下 a && b 的性質:
- 如果 a 是 True,那麼結果會是 b 。
-
如果 a 是 False,那麼結果會是 False。
- 所以如果程式發現a是False,
就不會去判斷 b 了! - 怎麼驗證呢?要等你會函式再說😢
- 所以如果程式發現a是False,
- 那 a || b 呢?
-
如果 a 是 True,那麼結果會是True。
- 同理,程式不會去判斷 b 了!
- 如果 a 是 False,那麼結果會是 b。
-
如果 a 是 True,那麼結果會是True。
- 那 !a 呢?
- 它就那樣啊?
a && b (且) | a = True | a = False |
---|---|---|
b = True | True | False |
b = False | False | False |
Logical Operator 邏輯運算子 - 1
a || b (或) | a = True | a = False |
---|---|---|
b = True | True | True |
b = False | True | False |
! a | a = True | a = False |
---|---|---|
結果 | False | True |
且(and, &&)的運算表
或(or, ||)的運算表
Not(!)的運算表
一個簡單的例子 - 找最大
- 題目:給你三個數字,請輸出最大的那個數字。
- 其實就是一個一個判斷是不是誰最大就可以了。
Logical Operator 邏輯運算子 - 2
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (a >= b && a >= c)
cout << a << endl;
else if (b >= a && b >= c)
cout << b << endl;
else
cout << c << endl;
}
if (a 最大)
輸出a;
else if (b 最大)
輸出b;
else
輸出c;
大概念是這樣。
寫起來長這樣。
2 mins
一個經典的例子 - 判斷閏年
- 如果年份可以被4整除,且不能被100整除,或能夠被400整除,則該年為閏年。
Logical Operator 邏輯運算子 - 3
3 mins
你是在工三小?
- 舉例來說:8算閏年,200不算,1200算。
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0 )
cout << "yes";
else
cout << "no";
if (y % 400 == 0)
cout << "yes";
else if (y % 100 == 0)
cout << "no";
else if (y % 4 == 0)
cout << "yes";
else
cout << "no";
一個簡單的實作
一個更簡單的實作,就照著題目寫下來就好了。
Exercise III
進階if-else - 魔王的考驗
Exercise III
程式練習題
接下來有一題請你用
程式實做if-else的題目。
- 我會花約1.5分鐘讀題。
- 總共計時10分鐘。
- 開好你的程式環境吧!
163 - 魔王的考驗 - 題目
Exercise III - 魔王的考驗 - 0
- 題目:你身為IOI 國的勇者Zisk 的跟班你,經過了很多不可描述的事情後,要給予敵對的 JOI 的國王最後一擊。你會同時發動兩個攻擊,攻擊力分別為 a 和 b,而 JOI 國的國王會發動他的「最後的守備」。這個「最後的守備」有非常嚴謹的條件:它也會分別產生兩個數字 c 和 d,分別會與兩個攻擊產生 兩個「共振值」 a 且 c 和 b 且 d。只要有其中一個非零,就代表 JOI 國王防守成功,而反之則代表你將 JOI 國消滅了。
-
如果能夠消滅JOI國王,則請輸出一行 "KATSU";否則,請輸出一行 "MAKE"。
10 mins
163 - 魔王的考驗 - 解答
Exercise III - 魔王的考驗 - 1
- 題目:你身為IOI 國的勇者Zisk 的跟班你,經過了很多不可描述的事情後,要給予敵對的 JOI 的國王最後一擊。你會同時發動兩個攻擊,攻擊力分別為 a 和 b,而 JOI 國的國王會發動他的「最後的守備」。這個「最後的守備」有非常嚴謹的條件:它也會分別產生兩個數字 c 和 d,分別會與兩個攻擊產生 兩個「共振值」 a 且 c 和 b 且 d。只要有其中一個非零,就代表 JOI 國王防守成功,而反之則代表你將 JOI 國消滅了。
-
如果能夠消滅JOI國王,則請輸出一行 "KATSU";否則,請輸出一行 "MAKE"。
10 mins
-
總之就是 (a && c) 和 (b && d) 其中一個是true,那麼就是(勝つ)KATSU,反之則是(負け)MAKE。
-
所以就是判斷 (a && c) || (b && d)而已。
#include <iostream>
using namespace std;
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
if((a && c) || (b && d)){
cout << "MAKE" << endl;
} else {
cout << "KATSU" << endl;
}
return 0;
}
範例 code
Conditional Operator
條件運算子 - 一個結合 = 與 if-else的符號
什麼是條件運算子?
Conditional Operator 條件運算子 - 0
- 你可能會寫到這種東西:
- 求兩個數字的最大值:
- 事實上,用條件運算子就可以一行寫完
- 求兩個數字的最大值:
int max_value;
if (a > b) {
max_value = a;
} else {
max_value = b;
}
int max_value = ((a > b) ? a : b);
什麼是條件運算子?
Conditional Operator 條件運算子 - 1
- 簡單上來說,條件運算子 ?: 就是:
- 如果前面是true,這一整段都會變成A。
- 如果前面是false,這一整段都會變成B。
- 再舉一個例子,if01的code可以這樣寫:
true或false ? A : B;
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
cout << (a == 60 ? 'O' : 'X');
cout << (b == 60 ? 'O' : 'X');
cout << (c == 60 ? 'O' : 'X');
cout << endl;
}
一些條件運算子的注意事項
Conditional Operator 條件運算子 - 2
- 什麼是優先子運算順序,其實就是先乘除後加減的詳細版本。
-
只要你沒有把握誰先算,就用小括號包起來,絕對不會錯。
-
舉例來說,下面會錯。
- 但這樣就會對。這是因為 <<其實也是運算子,而它比條件運算子還要先算。
-
舉例來說,下面會錯。
- 括號 () 裡面會被優先處理。
- struct的"的"的那個. / 反轉! 。
- ++系列: 變數自己加1。
- 乘*除/還有取餘數%。
- 加+減-。
- 判斷一不一樣 == 和 != 。
- 判斷大小 <,<=,>,>=。
- 兩個條件式的"且" && 。
- 兩個條件式的"或" || 。
- 三元運算子 <條件> ? <如果是> : <如果不是>。
- 等於系列(修改左邊的變數) =,+=,*= ...。
大致上的運算子優先順序。 不用記
cout << c == 60 ? 'X' : 'O';
cout << (c == 60 ? 'X' : 'O');
bool
專門存真/假的變數型態
什麼是布林值(Boolean)?
bool 布林型態 - 0
-
關係運算子算完後只會有兩種可能,True(真) 或 False(假)。
- 阿True(真) 或 False(假) 的變數型態是什麼,又該怎麼存呢?
整數
布林值
英文: integer
英文: boolean
型態名稱: int
型態名稱: bool
宣告
宣告
int x;
int y = 4 + 1;
bool x = false;
bool y = true;
bool z = (2 > 1);
* true跟false都是關鍵字,都要小寫。
為什麼要布林值(Boolean)?
- 什麼時候會用到bool?
- 暫時用不到,但是之後會用到,所以先存下來。
- 當你要的條件非常非常複雜的時候。(例如判斷n個數字是否有重複的數字)
- 之後看到講師們的code自然就會知道使用時機了! (maybe下堂課?)
bool 布林型態 - 1
Review
太多語法了啦QQ 複習一下好不?
各個運算子
- 布林值:一個要馬是 True(真) 要馬是 False(假) 的變數型態。
- 關係運算子,判斷兩個變數 (例如整數) 的大小/等於關係,結果為一布林值。
- 邏輯運算子,對布林值(們)做運算的符號。
- 條件運算子,把一個簡單if-else濃縮的酷酷符號。
Review 小小複習 - 0
關係運算子 | 意思 |
---|---|
== | 判斷是否等於 |
!= | 判斷是否不等於 |
> | 判斷是否大於 |
< | 判斷是否小於 |
>= | 判斷是否大於等於 |
<= | 判斷是否小於等於 |
邏輯運算子 | T/T | T/F | F/T | F/F |
---|---|---|---|---|
a && b 結果 | True | False | False | False |
a || b 結果 | True | True | True | False |
邏輯運算子 | True | False |
---|---|---|
!a 結果 | False | True |
條件運算子 | c = True | c = False |
---|---|---|
a = (c ? 5 : 7) | a = 5 | a = 7 |
三種常見的if-else
- 一般的if。
- 一般的if-else。
- if-else if-else。
- 巢狀if就靠自己搭配囉!
Review 小小複習 - 1
// Case 1:
if (true 或 false) {
// 做事情
}
// Case 2:
if (true 或 false) {
// 做事情
} else {
// 做事情
}
// Case 3:
if (true 或 false) {
// 做事情
} else if (true 或 false) {
// 做事情
} else {
// 做事情
}
不是 0 / 1 的條件?
- 事實上,條件判斷不一定要是布林值 (True / False) 才可以。
- 猜猜看右邊這份程式會輸出什麼結果呢?
- 於是我們可以大膽猜測:
Review 小小補充 - 0
#include <iostream>
using namespace std;
int main() {
if (2) cout << "A";
if (1) cout << "B";
if (0) cout << "C";
if (-1) cout << "D";
if (-2) cout << "E";
return 0;
}
ABDE
實驗程式
輸出
True
True
False
Exercise IV
看起來很複雜的選擇結構 - 選擇障礙
Exercise IV
程式練習題
接下來有一題請你用
程式實做if-else的題目。
- 我會花約2分鐘讀題。
- 總共計時10分鐘。
- 開好你的程式環境吧!
165 - 選擇障礙 - 題目
Exercise IV - 選擇障礙 - 0
- 題目:小明是個有選擇障礙的人,因此他決定照天氣好不好、心情好不好把餐廳分類,再不行的話就擲骰子。現在給定今天的天氣好壞、小明心情好壞、和骰子骰出的結果,請你預測小明今天的午餐會吃什麼。
10 mins
- 天氣好
- 心情好
- 骰出 1 或 2:極匠拉麵
- 骰出 3 或 4:勝千代拉麵
- (勝千代倒了辣QQ)
- 骰出 5 或 6:山嵐拉麵
- 心情差
- 小川拉麵
- 心情好
- 天氣差
- 心情好
- 骰出 1 或 2:雞二拉麵
- 骰出 3 或 4:海拉麵
- 骰出 5 或 6:真劍拉麵
- 心情差
- 墨洋拉麵
- 心情好
- 例如: 0 1 3,就代表天氣差 / 心情好 / 骰出3,那麼請你輸出一行 "海拉麵" 。
165 - 選擇障礙 - 引導
Exercise IV - 選擇障礙 - 1
- 你可以用一個樹狀圖表示。(其實本來題目敘述就是樹狀圖了XD)
10 mins
(第一個數字是1)
(第一個數字是0)
(第二個數字是1)
(第二個數字是0)
(第二個數字是1)
(第二個數字是0)
⚀⚁
⚂⚃
⚄⚅
⚀⚁
⚂⚃
⚄⚅
極匠
勝千代
山嵐
小川
雞二
海
真劍
墨洋
165 - 選擇障礙 - 答案
Exercise IV - 選擇障礙 - 2
- 你可以用一個樹狀圖表示。(題目本來就是樹狀圖了XD)
10 mins
⚀⚁
⚂⚃
⚄⚅
極匠
勝千代
山嵐
小川
雞二
海
真劍
墨洋
⚀⚁
⚂⚃
⚄⚅
#include <iostream>
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
if (a == 1) {
if (b == 1) {
if (c == 1 || c == 2)
cout << "極匠拉麵\n";
else if (c == 3 || c == 4)
cout << "勝千代拉麵\n";
else if (c == 5 || c == 6)
cout << "山嵐拉麵\n";
} else
cout << "小川拉麵\n";
} else {
if (b == 1) {
if (c == 1 || c == 2)
cout << "雞二拉麵\n";
else if (c == 3 || c == 4)
cout << "海拉麵\n";
else if (c == 5 || c == 6)
cout << "真劍拉麵\n";
} else
cout << "墨洋拉麵\n";
}
return 0;
}
一個很長的解答
165 - 選擇障礙 - 一個很酷的答案
Exercise IV - 選擇障礙 - 3
- 聰明的你可能會通過一些數值壓縮來做到看起來很簡單,很酷的程式。
- 如果讓
- 但盡量別這樣寫,不然你下次看到code會很痛苦QQ。
10 mins
#include <iostream>
using namespace std;
int main() {
int a, b, c, d;
cin >> a >> b >> c;
d = 4 * a + b * ((c+1) / 2);
if (d == 0) cout << "墨洋拉麵\n";
else if (d == 1) cout << "雞二拉麵\n";
else if (d == 2) cout << "海拉麵\n";
else if (d == 3) cout << "真劍拉麵\n";
else if (d == 4) cout << "小川拉麵\n";
else if (d == 5) cout << "極匠拉麵\n";
else if (d == 6) cout << "勝千代拉麵\n";
else if (d == 7) cout << "山嵐拉麵\n";
return 0;
}
一個很酷但不要學的解答
(但不要學)
a | b | c | d | 結果 |
---|---|---|---|---|
0 | 0 | any | 0 | 墨洋拉麵 |
0 | 1 | 1/2 | 1 | 雞二拉麵 |
0 | 1 | 3/4 | 2 | 海拉麵 |
0 | 1 | 5/6 | 3 | 真劍拉麵 |
1 | 0 | any | 4 | 小川拉麵 |
1 | 1 | 1/2 | 5 | 極匠拉麵 |
1 | 1 | 3/4 | 6 | 勝千代拉麵 |
1 | 1 | 5/6 | 7 | 山嵐拉麵 |
數值轉換表
165 - 選擇障礙 - 另一個很酷的答案
Exercise IV - 選擇障礙 - 4
- 如果你會了上面這種數值轉換,而且你很熟後面會教的陣列,你可以寫出像下面的code。
- 但我沒有要教這個的意思 ☆(・ω<)
10 mins
(但不要學)
a | b | c | d | 結果 |
---|---|---|---|---|
0 | 0 | any | 0 | 墨洋拉麵 |
0 | 1 | 1/2 | 1 | 雞二拉麵 |
0 | 1 | 3/4 | 2 | 海拉麵 |
0 | 1 | 5/6 | 3 | 真劍拉麵 |
1 | 0 | any | 4 | 小川拉麵 |
1 | 1 | 1/2 | 5 | 極匠拉麵 |
1 | 1 | 3/4 | 6 | 勝千代拉麵 |
1 | 1 | 5/6 | 7 | 山嵐拉麵 |
數值轉換表
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
string s[] = {
"墨洋拉麵", "雞二拉麵",
"海拉麵", "真劍拉麵",
"小川拉麵", "極匠拉麵",
"勝千代拉麵", "山嵐拉麵"
};
cout << s[4 * a + b * ((c+1) / 2)] << endl;
return 0;
}
一個很酷,理論上比較快但很難懂的程式
Switch-case
if-else if-else if else ... 好麻煩啊啊啊啊
什麼是switch case?
switch case - 0
- 直接講有點麻煩,我們直接看code吧!
- 如果輸入1,就會輸出1 + End。
- 如果輸入9,就會輸出2 + End。
- 如果輸入其他數字 (default = 預設),
就會輸出 No QQ + End。
- 這樣你懂了怎麼用嗎?
- 將要比對的字放進switch()小括號裡面。
- 在大括號裡面放case <比對的數字>:
- case做完後要break跳出大括號。
int x;
cin >> x;
switch (x) {
case 1:
cout << 1 << endl;
break;
case 9:
cout << 2 << endl;
break;
default:
cout << "No QQ" << endl;
break;
}
cout << "End\n";
switch case的基本語法
switch case - 1
- 所以它其實就是if-else if-else的只有等於的版本。
- 比對字只可以是字元或數字,不能是字串。
- 要是沒有break;的話,它會繼續往下跑。舉例來說,如果case A沒有break,它會先做完"事情A",再做"事情B",再"break"。
- break在這裡就是跳出大括號的意思,我們之後還會用到喔!
switch (比對字) {
case <比對字如果等於這個東西A>:
// 做事情A
break;
case <比對字如果等於這個東西B>:
// 做事情B
break;
default:
// 如果不符合所有判斷,做事情C
break;
}
Exercise VI
APCS 手寫觀念題
接下來有一題APCS觀念題。
- 與剛剛說的switch有關。
- 計時2分鐘。
APCS 105/10 - 觀念題 - 3
switch case - 2
switch (x) {
case 10: y = 'a'; break;
case 20:
case 30: y = 'b'; break;
default: y = 'c';
}
3. 右側 switch 敘述程式碼可以如何以 if-else 改寫?
if (x==10) y = 'a';
if (x==20 || x==30) y = 'b';
y = 'c';
if (x==10) y = 'a';
else if (x==20 || x==30) y = 'b';
else y = 'c';
if (x==10) y = 'a';
if (x>=20 && x<=30) y = 'b';
y = 'c';
if (x==10) y = 'a';
else if(x>=20 && x<=30) y = 'b';
else y = 'c';
(A)
(B)
(C)
(D)
(B)
2 mins
End
希望大家都有聽懂~
題目表
題目表 - 0
APCS camp - If-else
By Arvin Liu
APCS camp - If-else
APCS Camp - If-else & switch-case
- 1,046