# 控制程式流程:條件判斷 ## 販賣機的運作 這一章要談的就是,如何讓程式按照你指定條件被執行。 我們先從生活中的例子來看,這是一台日常隨處可見的自動販賣機。 ![](https://i.imgur.com/2pvo2rA.png) 販賣機之所以可以自動化,就是他可以根據人類的投幣與按鈕行為,根據不同的判斷條件,做出適當的反應。 我們來解析一台販賣機的運作: > 已知此販賣機,當投幣金額大於等於飲料金額時,該飲料購買燈會亮起。 > 目前它販售的飲料有三種品項與金額,分別是: > 1.紅茶 15元 > 2.可樂 25元 > 3.咖啡 30元 > > 請問,依序投入2個10元、2個5元,在每投入一個硬幣的過程中 > 1. 已投金額會有什麼顯示變化? > 2. 販賣機的按鈕燈會有什麼變化? 按照題目需求,我們可以觀察每個步驟: 1. 投入第1個10元,已投金額由0元變成10元,沒有任何飲料燈亮起。 2. 接著投入第2個10元,已投金額由10元變成20元,紅茶的飲料燈,因為已投金額大於等於購買金額而亮起。 3. 接著投入第1個5元,已投金額由20元變成25元,紅茶、可樂的飲料燈,因為已投金額大於等於購買金額而亮起。 4. 最後投入第2個5元,已投金額由25元變成30元,紅茶、可樂、咖啡的飲料燈,都因為已投金額大於等於購買金額而亮著。 用文字敘述理解整個系統的運作,似乎要花點時間,所以我們在這裡學習使用流程圖,以視覺化的方式,更容易讓人明白這一切的運作。 ## 流程圖 流程圖由幾個元件構成,分別是狀態(Terminal)、動作(Process)、判斷條件(Decision) ![](https://i.imgur.com/biYyiIR.png) - 狀態圖示是帶有圓角的矩形,主要作為整個系統開始與結束的節點。 - 動作圖示是矩形,表示作為動作的執行。 - 判斷條件圖示是菱形,表示作為條件的判斷。 以販賣機的運作流程圖為例: - 起始狀態:LED顯示已投金額為0 - 結束狀態:顧客取得商品與找零 - 動作執行: - 投幣 - 已投金額累加投幣金額 - LED顯示已投金額 - 條件判斷: - 已投金額是否大於等於飲料金額,決定飲料購買燈是否亮起 - 是否按下商品鈕,決定繼續投幣還是取得商品與找零 流程圖參考如下: ```flow st=>start: LED顯示已投金額為0 e=>end: 顧客取得商品與找零 op1=>operation: 投幣,已投金額累加投幣金額 op2=>operation: LED顯示已投金額 cond1=>condition: 已投金額 大於等於 30元 cond2=>condition: 已投金額 大於等於 25元 cond3=>condition: 已投金額 大於等於 15元 op3=>operation: 咖啡按鈕燈亮起 op4=>operation: 可樂按鈕燈亮起 op5=>operation: 紅茶按鈕燈亮起 cond4=>condition: 是否按下商品鈕 st->op1->op2->cond1 cond1(yes)->op3->cond4 cond1(no)->cond2->op1 cond2(yes)->op4->cond4 cond2(no)->cond3->op1 cond3(yes)->op5->cond4 cond3(no)->op1 cond4(no)->op1 cond4(yes)->e ``` ``` Tip: 可以學習使用markdown語法或是使用draw.io繪製 ``` ## 條件判斷的Python語法 ### if判斷式 if語法: ``` =python if 條件成立 : 執行敘述 ``` if-else語法: ``` =python if 條件成立 : 執行敘述A else: 執行敘述B ``` if-elif-else語法: ``` =python if 條件A成立 : 執行敘述A elif 條件B成立 : 執行敘述B else: 執行敘述C ``` ### 巢狀判斷式 ``` =python if 條件A成立 : if 條件B成立 : 執行敘述A else: 執行敘述B else: 執行敘述C ``` ## 隨堂練習 1. 在micro:bit上面實作以下功能: - 如果按下左邊按鈕A則顯示笑臉 - 如果按下右邊按鈕B則顯示傷心 - 都沒有按鈕被按下時,顯示問號 參考流程圖: ```flow st=>start: micro:bit啟動 e1=>end: 顯示問號 e2=>end: 顯示笑臉 e3=>end: 顯示哭臉 op1=>operation: 監控使用者按下哪些按鈕 cond1=>condition: 按下按鈕A cond2=>condition: 按下按鈕B st->op1->cond1 cond1(yes)->e2 cond1(no)->cond2 cond2(yes)->e3 cond2(no)->e1 ``` 參考程式碼: ```python= from microbit import * while True: if button_a.is_pressed(): display.show(Image.HAPPY) elif button_b.is_pressed(): display.show(Image.SAD) else: display.show("?") ``` 2. 在micro:bit上面,使用**邏輯運算子 and**實作以下功能 - 當單獨按下按鈕A會出現笑臉 - 單獨按下按鈕B會出現傷心的臉 - 同時按下按鈕A跟按鈕B會出現愛心的小程式 - 都沒有按鈕被按下時,顯示問號。 參考流程圖: ```flow st=>start: micro:bit啟動 e1=>end: 顯示問號 e2=>end: 顯示笑臉 e3=>end: 顯示哭臉 e4=>end: 顯示愛心 op1=>operation: 監控使用者按下哪些按鈕 cond1=>condition: 同時按下按鈕A和按鈕B cond2=>condition: 按下按鈕A cond3=>condition: 按下按鈕B st->op1->cond1 cond1(yes)->e2 cond1(no)->cond2 cond2(yes)->e3 cond2(no)->cond3 cond3(yes)->e4 cond3(no)->e1 ``` 參考程式碼: ```python= from microbit import * while True: if button_a.is_pressed() and button_b.is_pressed(): display.show(Image.HEART) elif button_a.is_pressed(): display.show(Image.HAPPY) elif button_b.is_pressed(): display.show(Image.SAD) else: display.show("?") ``` 3. 承上題需求,在micro:bit上面實作同樣功能,但不可使用**邏輯運算子 and**,請使用巢狀邏輯判斷 參考流程圖: ```flow st=>start: micro:bit啟動 e1=>end: 顯示問號 e2=>end: 顯示笑臉 e3=>end: 顯示哭臉 e4=>end: 顯示愛心 op1=>operation: 監控使用者按下哪些按鈕 cond1=>condition: 按下按鈕A cond2=>condition: 按下按鈕B cond3=>condition: 按下按鈕B st->op1->cond1 cond1(yes)->cond2 cond1(no)->cond3 cond2(yes)->e4 cond2(no)->e2 cond3(yes)->e3 cond3(no)->e1 ``` 參考程式碼: ```python= from microbit import * while True: if button_a.is_pressed(): if button_b.is_pressed(): display.show(Image.HEART) else: display.show(Image.HAPPY) else: if button_b.is_pressed(): display.show(Image.SAD) else: display.show("?") ``` ## 未來持續學習 請充分理解語法,大部分的程式流程,都是從上一章的迴圈與本章判斷式所組成 多看別人的程式,並且動手練習,是最好的方法。 ## 參考資料 Python官方文件 https://www.python.org/ ###### tags: `Python程式設計入門`