W02|讓程式做決定:條件判斷
今天完成後,我可以
- 使用
if / elif / else處理多種情況。 - 依照題目邊界寫出正確的比較條件。
- 使用條件判斷決定是否計算或修改變數。
- 知道
if後面不一定要有else。 - 分辨「兩個獨立的
if」與if / elif的不同。 - 使用暫時的
print()檢查中間計算結果。 - 準備不同的測試資料檢查程式。
一、快速恢復條件判斷
下面的程式會讀入一個成績,並判斷是否及格:
執行程式前,先預測結果:
| 輸入 | 條件 score >= 60 |
輸出 |
|---|---|---|
59 |
____ | ____ |
60 |
____ | ____ |
85 |
____ | ____ |
閱讀這段程式時,可以按照以下順序理解:
if後面寫要檢查的條件。- 條件成立時,執行
if下方縮排的程式。 - 條件不成立時,執行
else下方縮排的程式。
請注意:
- 條件後面有冒號
:。 - 同一層的程式要使用相同的縮排。
else後面不需要再寫條件。- 字串需要放在引號中。
如果情況不只兩種,可以在 if 和 else 之間加入 elif:
Python 會由上往下檢查,遇到第一個成立的分支後,就不再執行後面的分支。接下來的 BMI 分類,就需要使用這種多分支判斷。
二、課中練習
2-1|b007 你過胖了嗎(70分)
先依下面的提醒自己試寫;約10分鐘後,教師會示範一種常見寫法與常見錯誤,再讓你補完程式。操作時記得:
- 身高、體重可能有小數,讀入時要使用
float()。 - 題目輸入「公分」,BMI 公式使用「公尺」。
- 分母是身高的平方;公式太長時先分段計算。
- 「以上」包含邊界,「未滿」不包含邊界。
- Python 由上往下判斷,遇到第一個成立的分支就會停止。
BMI 公式如下,其中\(w\)代表以公斤計算的體重,\(h\)代表以公尺計算的身高:
\[ \mathrm{BMI}=\frac{w}{h^2} \]
輸入大分數時,先打骨架,再填入分子與分母:
() / ()
| BMI | 輸出 |
|---|---|
| \(\mathrm{BMI}<18.5\) | 過輕 |
| \(18.5\leq\mathrm{BMI}<24\) | 健康 |
| \(24\leq\mathrm{BMI}<27\) | 過重 |
| \(\mathrm{BMI}\geq27\) | 肥胖 |
開始寫條件前,先預測三個邊界值:
| BMI剛好是 | 應輸出 |
|---|---|
18.5 |
____ |
24 |
____ |
27 |
____ |
除錯:先檢查BMI算得對不對
第一次執行結果不正確時,可以在條件判斷前暫時加入:
bmi數值不正確:先檢查單位、公式、括號與運算順序。bmi數值正確但分類錯誤:再檢查if / elif / else的條件與順序。- 找到問題後,提交 JMJ 前要刪除這行,否則會多輸出一行。
完成後請測試不同分類,並特別檢查 18.5、24、27。
完成後整理:elif 已經排除了哪些情況?
elif只會在前面的條件都不成立時才檢查,因此不必再次寫出已被排除的下限。
例如成績等第若先檢查score >= 90,接著的elif score >= 80本身就代表「未滿90,而且至少80」,不必再重寫score < 90。
2-2|a363 早餐店結帳(30分)
早餐買一份主餐和一杯飲料,優惠方式如下:
- 主餐原價超過 50 元,主餐折 10 元。
- 飲料原價超過 40 元,飲料折 5 元。
- 兩項優惠分別判斷,可以同時使用。
請計算套用優惠後的結帳金額。
這題不在 if 中直接輸出,而是先分別調整價格,最後才加總輸出。
先預測結果:
| 主餐原價 | 飲料原價 | 哪些品項有折扣 | 最後金額 |
|---|---|---|---|
50 |
40 |
______ | ____ |
51 |
40 |
______ | ____ |
50 |
41 |
______ | ____ |
60 |
45 |
______ | ____ |
指定敘述會先計算等號右邊,再把結果存回左邊的變數。例如:
第二行先用原本的price算出50,再把50存回price。下面骨架中的價格變數也會用相同方式更新。
提示:程式骨架
思考:
- 「超過」包含剛好等於門檻嗎?
- 兩項優惠能否同時成立?
- 為什麼這裡要用兩個
if,不能使用if / elif?
提示:兩項優惠能同時成立嗎?
先分別調整主餐與飲料價格,再加總。兩項優惠可能同時成立,所以要使用兩個獨立的if。
三、條件判斷可以有不同用途
| 題目 | 條件判斷負責什麼 |
|---|---|
b007 |
決定要輸出哪一種分類 |
a363 早餐店結帳 |
分別決定是否修改主餐與飲料價格 |
| 共同點 | 都要正確處理邊界及判斷順序 |
記住:if 可以決定輸出,也可以決定是否修改資料;不需要處理「其他情況」時,可以不寫 else。
四、課後挑戰:條件判斷的不同用法
| 題目 | 配分 | 定位 | 解題前要注意 |
|---|---|---|---|
b028 恭喜你可以參加複試 |
15 分 | 基礎必做 | 條件不成立時,題目是否要求輸出? |
b029 大雨大雨一直下 |
25 分 | 核心必做 | 從大到小或從小到大判斷,哪一種比較清楚? |
a185 籃球明星賽 |
30 分 | 核心進階 | 每場比賽後,要修改哪一隊的勝場? |
b008 決戰520 |
30 分 | 延伸挑戰 | 是否完整處理平手、A 勝與 B 勝? |
4-1|b028 恭喜你可以參加複試
提示:條件不成立時,題目沒有要求輸出;不要自行增加文字。
測試不合格的範例時,畫面上沒有任何輸出才是正確的。
4-2|b029 大雨大雨一直下
提示:先確認題目的各個雨量範圍,再決定由大到小或由小到大判斷。特別檢查剛好位於分界的數值。
4-3|a185 籃球明星賽
提示:準備兩個變數記錄勝場;每場更新一次,最後再判斷總結果。
4-4|b008 決戰520
這題沒有唯一寫法。先確定沒有遺漏情況,再考慮程式長短。
提示一:先整理情況
先列出所有出拳組合,確認哪些是平手、A 獲勝或 B 獲勝。
提示二:決定判斷順序
可以先處理平手,再處理 A 獲勝的情況,其餘情況就是 B 獲勝。
五、完成後自我檢查
- 我能正確輸入 BMI 公式並處理括號。
- 程式結果不正確時,我能暫時輸出
bmi,判斷錯誤來自公式還是條件判斷。 - 我能判斷「超過、以上、未滿」是否包含邊界,並選用正確的比較運算子。
- 我知道條件不成立時不需要執行任何動作,
if後面就不一定需要else。 - 我能在條件成立時進行計算或修改變數,最後再統一輸出。
- 我知道兩件事可能同時發生時,應使用兩個獨立的
if,而不是if / elif。 - 我有測試只有一個條件成立、兩個條件都成立及剛好等於邊界的資料。
- 面對多種情況時,我能先列出所有可能,再開始撰寫條件。
