Semorphe

選擇

讓程式走兩條不同的路。 · ⏱ 約 25 分鐘

你會學到三件事

  1. if 怎麼把一段程式變成有條件的
  2. else 是「其餘的情況」
  3. 大括號圈起來的東西叫區塊,而它是一個整體

開始之前

到目前為止,程式由上往下每一行都會跑。

這一課開始,有些行會被跳過,而哪些被跳過取決於資料。 這是程式第一次「自己做決定」。

第 7 課的 bool 就是為了這一課。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、if

照著打上這一段:

1int score = 75;2if (score >= 60) {3    cout << "及格" << endl;4}
75變數score60≥"及格"換行印出如果則宣告int(整數)變數score=使用命名空間std引入函式庫iostream(輸入輸出)123

讀法:「如果 score >= 60 成立,就做大括號裡面的事。」

不成立的話,大括號裡面整段跳過,程式從大括號後面繼續。

三個部位:

if ( 條件 ) {  要做的事  }
     ↑         ↑
   一個 bool   一個【區塊】——大括號圈起來的一整段

⚠️ if 後面沒有分號。 if (x) ; 是合法的,而它的意思是 「條件成立就做,什麼都不做」,後面那個大括號會變成無條件執行。 這個錯不會報錯,只會讓程式行為變得莫名其妙。

二、else

不及格的時候也要說話——在後面接一段 else:

1if (score >= 60) {2    cout << "及格" << endl;3} else {4    cout << "不及格" << endl;5}
變數score60≥"及格"換行印出"不及格"換行印出如果則否則使用命名空間std引入函式庫iostream(輸入輸出)124

else 沒有條件,它就是「上面那個不成立的時候」。

兩條路一定會走一條,而且只會走一條。

三、區塊

大括號 { } 圈起來的一整段叫區塊。它裡面可以有很多行:

1if (score >= 60) {2    cout << "及格" << endl;3    cout << "恭喜" << endl;4}
變數score60≥"及格"換行"恭喜"換行印出印出如果則使用命名空間std引入函式庫iostream(輸入輸出)123

只有一行的時候,大括號可以省略:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1if (score >= 60) cout << "及格" << endl;
變數score60≥"及格"換行印出如果則使用命名空間std引入函式庫iostream(輸入輸出)1

⚠️ 而建議永遠不要省。

省掉之後想加第二行,很容易變成這樣:

if (score >= 60)
    cout << "及格" << endl;
    cout << "恭喜" << endl;   // ← 這一行【無條件】會跑

縮排看起來在裡面,而 if 只管到第一個分號為止。 這是一個縮排會騙你的錯,而它在 Python 裡不會發生(那一課會再提)。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1#include <iostream>2using namespace std;3int main() {4    int score = 75;5    if (score >= 60) {6        cout << "及格" << endl;7    } else {8        cout << "不及格" << endl;9    }10    return 0;11}
75變數score60≥"及格"換行印出"不及格"換行印出0回傳如果則否則宣告int(整數)變數score=定義函式 回傳型別int(整數)main使用命名空間std引入函式庫iostream(輸入輸出)123456810

把積木打散,自己排回去:排回去:把剛才那支程式的積木排好

換你了

改成三段:>= 90 印「優等」、>= 60 印「及格」、其餘印「不及格」。

提示:else 後面可以直接再接一個 if——

} else if (score >= 60) {

到編輯器做這一題:練習:加上「優等」那一段

再一個:調分

老師覺得這次考太難,決定調分。規則有四段:

原分數 怎麼調
>= 90 已經很高了,不調
>= 60 加 5 分
>= 40 開根號再乘以 10
其餘 加 10 分

讀進一個分數,印出調完的分數。⚠️ 裁判餵的是 49。 (開根號是第 6 課的 sqrt,別忘了 #include <cmath>。)

🔴 四段的順序不能換。 把 >= 40 那一段搬到最前面試試看: 95 分會變成多少?想清楚為什麼,再改回來。

🔴 自己拿 95、75、30 各跑一次,確認四段都走得到。 裁判只餵一個數字,而它驗不到你沒走過的那三段。

到編輯器做這一題:練習:調分

做一個

兩個人出拳,用數字表示:0 石頭、1 布、2 剪刀。讀進兩個數字, 印出 A、B 或 平手。⚠️ 裁判用的是 0 1(石頭對布,B 贏)。

🔴 做完跟旁邊的人比一下你們寫了幾個條件。 這一題至少有三種寫法:九個 if、三個 if、以及一行算式。三種都是對的。

到編輯器做這一題:做一個:剪刀石頭布的裁判

這一課你做了什麼

如果卡住了

你看到 多半是因為
兩句都印出來了 第二句沒在大括號裡(或大括號省掉了)
條件明明成立卻沒進去 == 寫成 = 了,或比較方向反了
if (x); 行為很怪 多了一個分號。if 後面不加分號
「優等」和「及格」都印了 第二段用了 if 而不是 else if——那是兩個獨立的判斷
在編輯器打開這一課 →