# 控制程式流程:條件判斷 ## 販賣機的運作 這一章要談的就是,如何讓程式按照你指定條件被執行。 我們先從生活中的例子來看,這是一台日常隨處可見的自動販賣機。  販賣機之所以可以自動化,就是他可以根據人類的投幣與按鈕行為,根據不同的判斷條件,做出適當的反應。 我們來解析一台販賣機的運作: > 已知此販賣機,當投幣金額大於等於飲料金額時,該飲料購買燈會亮起。 > 目前它販售的飲料有三種品項與金額,分別是: > 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)  - 狀態圖示是帶有圓角的矩形,主要作為整個系統開始與結束的節點。 - 動作圖示是矩形,表示作為動作的執行。 - 判斷條件圖示是菱形,表示作為條件的判斷。 以販賣機的運作流程圖為例: - 起始狀態: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程式設計入門`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.