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的結果。
    1. 可以直接用變數套進去判斷式裡面
    2. 要輸出的值記得用括號包起來,表示先做括號。
符號 意思
== 判斷是否等於
!= 判斷是否不等於
> 判斷是否大於
< 判斷是否小於
>= 判斷是否大於等於
<= 判斷是否小於等於

怕你忘記,我把表放過來。

#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為甚麼?
    1. (x = y)這行執行結束後,x會等於y,然後程式會變成                                。
    2. 透過第八行你就發現原本的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_scoreTrue,算式就會變成 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 ! :就是真假反轉,
    也就是TrueFalseFalseTrue
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 || b 呢?
    • 如果 a 是 True,那麼結果會是True。
      • 同理,程式不會去判斷 b 了!
    • 如果 a 是 False,那麼結果會是 b。
  • 那 !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

  • 什麼是優先子運算順序,其實就是先乘除後加減的詳細版本。
     
  • 只要你沒有把握誰先算,就用小括號包起來,絕對不會錯。
    • ​舉例來說,下面會錯。

       
    • 但這樣就會對。這是因為 <<其實也是運算子,而它比條件運算子還要先算。
  1.  括號 () 裡面會被優先處理。
  2.  struct的"的"的那個. / 反轉! 
  3.  ++系列: 變數自己加1。
  4.  */還有取餘數%
  5.  加+-
  6.  判斷一不一樣 == !=
  7.  判斷大小 <<=>>=
  8.  兩個條件式的"" &&
  9.  兩個條件式的"" ||
  10.  三元運算子 <條件> ? <如果是> : <如果不是>
  11.  等於系列(修改左邊的變數)  =+=*= ...

大致上的運算子優先順序。 不用記

  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;
}
>0
0
<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 山嵐拉麵

數值轉換表

d = 4a + b(\lfloor \frac {c+1} 2 \rfloor)

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

題號 名稱 註記
160 電神裴裴隱匿錄 上課習題
161 我們與裴裴的距離 上課習題
162 麻雀變裴裴  
163 魔王的考驗 上課習題
164 魔王的考驗(二)  
165 選擇障礙 上課習題
166 三角尼姆 真的只要if就可以了。
167 長方形大師 有點難
168 光明會 APCS 考古題
169 邏輯運算子 APCS 考古題

APCS camp - If-else

By Arvin Liu

APCS camp - If-else

APCS Camp - If-else & switch-case

  • 1,064