Try   HackMD

控制程式流程:條件判斷

販賣機的運作

這一章要談的就是,如何讓程式按照你指定條件被執行。

我們先從生活中的例子來看,這是一台日常隨處可見的自動販賣機。

販賣機之所以可以自動化,就是他可以根據人類的投幣與按鈕行為,根據不同的判斷條件,做出適當的反應。

我們來解析一台販賣機的運作:

已知此販賣機,當投幣金額大於等於飲料金額時,該飲料購買燈會亮起。
目前它販售的飲料有三種品項與金額,分別是:
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顯示已投金額
  • 條件判斷:
    • 已投金額是否大於等於飲料金額,決定飲料購買燈是否亮起
    • 是否按下商品鈕,決定繼續投幣還是取得商品與找零

流程圖參考如下:

Created with Raphaël 2.2.0LED顯示已投金額為0投幣,已投金額累加投幣金額LED顯示已投金額已投金額 大於等於 30元咖啡按鈕燈亮起是否按下商品鈕顧客取得商品與找零已投金額 大於等於 25元可樂按鈕燈亮起已投金額 大於等於 15元紅茶按鈕燈亮起yesnoyesnoyesnoyesno
Tip:
可以學習使用markdown語法或是使用draw.io繪製

條件判斷的Python語法

if判斷式

if語法:

if 條件成立 :
    執行敘述

if-else語法:

if 條件成立 :
    執行敘述A
else:    
    執行敘述B

if-elif-else語法:

if 條件A成立 :
    執行敘述A
elif 條件B成立 :
    執行敘述B
else:    
    執行敘述C

巢狀判斷式

if 條件A成立 :
    if 條件B成立 :
        執行敘述A
    else:
        執行敘述B
else:
    執行敘述C

隨堂練習

  1. 在micro:bit上面實作以下功能:
  • 如果按下左邊按鈕A則顯示笑臉
  • 如果按下右邊按鈕B則顯示傷心
  • 都沒有按鈕被按下時,顯示問號

參考流程圖:

Created with Raphaël 2.2.0micro:bit啟動監控使用者按下哪些按鈕按下按鈕A顯示笑臉按下按鈕B顯示哭臉顯示問號yesnoyesno

參考程式碼:

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("?")
  1. 在micro:bit上面,使用邏輯運算子 and實作以下功能
  • 當單獨按下按鈕A會出現笑臉
  • 單獨按下按鈕B會出現傷心的臉
  • 同時按下按鈕A跟按鈕B會出現愛心的小程式
  • 都沒有按鈕被按下時,顯示問號。

參考流程圖:

Created with Raphaël 2.2.0micro:bit啟動監控使用者按下哪些按鈕同時按下按鈕A和按鈕B顯示笑臉按下按鈕A顯示哭臉按下按鈕B顯示愛心顯示問號yesnoyesnoyesno

參考程式碼:

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("?")
  1. 承上題需求,在micro:bit上面實作同樣功能,但不可使用邏輯運算子 and,請使用巢狀邏輯判斷

參考流程圖:

Created with Raphaël 2.2.0micro:bit啟動監控使用者按下哪些按鈕按下按鈕A按下按鈕B顯示愛心顯示笑臉按下按鈕B顯示哭臉顯示問號yesnoyesnoyesno

參考程式碼:

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程式設計入門