Python的選擇結構
以下為此單元簡報。
https://drive.google.com/file/d/1cDoVaSLLuxw8WKkZLao_Gryt2PZo_yAl/view?usp=sharing
以下為本單元的教學影片(放置於YouTube上),以下兩種方式擇一。
(A)以YouTube播放清單方式觀看影片,如下。
https://www.youtube.com/playlist?list=PLOk9WKoJdjHbzn_34Fu03o9nCY0ysfRNC
(B)以超連結方式觀看個別影片,如下。
程式的三個主要結構為循序結構、選擇結構與重複結構。循序結構為程式有從第一行開始逐行執行的特性,第一行執行完畢後執行第二行,第二行執行完畢後執行第三行,直到程式執行結束;選擇結構為若條件測試的結果為真,則做條件測試為真的動作,否則執行條件測試為假的動作,例如:若成績大於等於60分,則輸出及格,否則輸出不及格。重複結構讓電腦重複執行某個區塊的程式多次,電腦適合做重複的工作,例如:求1+2+3+…+1000,使用重複結構可在很短時間內重複執行相加的程式,直到求出加總的結果,重複結構將於下一章介紹。善用這三種結構可以寫出解決問題的程式。
日常生活中也有許多選擇結構的對話,「若明天天氣好的話,我們就去游泳,否則就待在家裡」,程式語言提供選擇結構的程式結構,讓使用者可以於程式中使用,邏輯上的語意為「若測式條件成立,則執行條件成立的動作,否則執行條件不成立的動作」,許多問題的解決過程,都會遇到選擇結構,如登入系統時需要驗證帳號和密碼,正確則可登入系統,否則跳到登入畫面,重新輸入帳號與密碼。
(A)單向選擇結構
單向選擇結構是最簡單的選擇結構,日常生活上經常用到,例如:「若週末天氣好的話,我們就去打球」。單向選擇結構只做測試條件為真時,執行條件為真的動作,只有一個方向的選擇,因此稱做單向選擇結構。
Python程式撰寫時注意事項:
(1)條件成立要做的動作有哪些,可能不只一行程式,那到底有幾行,Python程式碼以縮行表示執行的範圍。
(2)條件成立要做什麼,需要執行的每一行程式碼都要縮相同的空白鍵(space)個數,通常使用4個空白鍵,所以「if條件判斷 :」後面接的條件成立的動作,每一行都需要以4個空白鍵開頭,表示執行的範圍,與C或C++語言慣用以一對大括號「{}」表示執行的範圍有很大的不同之處。
(3)Tab也可用於表示縮行,但是空白鍵與Tab鍵不要混用,整個程式只能從頭到尾選擇其中一種進行縮行。
有了這樣的概念後,我們就舉個實例進行說明。
(A-1)判斷及格
寫一個程式判斷所輸入成績是否及格,成績及格則顯示「很好,請繼續保持下去」。
(a)解題想法
可以使用單向選擇結構撰寫程式,判斷成績是否及格,及格就顯示「很好,請繼續保持下去」。
(b)程式碼與解說
行
1
2
3
程式碼
score = int(input('請輸入一個成績?'))
if score >= 60:
print('很好,請繼續保持下去')
執行結果
輸入成績「60」,結果顯示在螢幕。
請輸入一個成績?60
很好,請繼續保持下去
解說
第1行:於螢幕顯示「請輸入一個成績?」,允許使用者輸入成績,並經由int函式轉換成整數,指定給變數score。
第2到3行:使用條件判斷(if)對score做判斷,若大於等於60分,就輸出「很好,請繼續保持下去」。
(B)雙向選擇結構
雙向選擇結構比起單向選擇結構更複雜一些,日常生活上屬於雙向選擇的對話,例如:「若週末天氣好的話,我們就出去打球,否則去看電影」。雙向選擇結構為當測試條件為真時,執行測試條件為真的動作;否則做測試條件為假的動作。有兩個方向的選擇,因此稱做雙向選擇結構。
(B-1)滿2000打九折
採買物品時,有時會遇到店家為了刺激消費,會使用滿額折扣,如:滿2000打九折,未滿2000則不打折,請寫一個程式幫助店家計算顧客所需付出的金額。
(a)解題想法
可以使用雙向選擇結構撰寫程式,判斷購買金額是否在2000元以上,若購買金額在2000元以上,輸出購買金額乘以0.9;否則依照原價輸出。
(b)程式碼與解說
行
1
2
3
4
5
程式碼
cost = int(input('請輸入購買金額?'))
if cost >= 2000:
print(cost * 0.9)
else:
print(cost)
執行結果
輸入購買金額「2000」,結果顯示在螢幕。
請輸入購買金額?2000
1800.0
解說
第1行:於螢幕顯示「請輸入購買金額?」,允許使用者這輸入購買金額,並經由int函式轉換成整數,指定給變數cost。
第2到5行:條件判斷(if)對cost做判斷,大於等於2000就將該數值打九折(第2到3行),否則該數值不打折(第4到5行)。
(B-2)判斷奇偶數(ch4\4-2-2-判斷奇偶數.py)
請寫一個程式判斷輸入的值是奇數還是偶數,通常會以求除以2的餘數,若餘數為0表示輸入的數為偶數,否則輸入的數為奇數。
(a)解題想法
可以使用雙向選擇結構撰寫程式,判斷輸入值除以2的餘數,若餘數為0,則輸出該數為偶數;否則輸出該數為奇數。
(b)程式碼與解說
行
1
2
3
4
5
程式碼
num = int(input('請輸入一個整數?'))
if num%2:
print(num, '為奇數')
else:
print(num, '為偶數')
執行結果
輸入一個數字「13」,顯示結果在螢幕上。
請輸入一個整數?13
13為奇數
解說
第1行:於螢幕顯示「請輸入一個整數?」,允許使用者這輸入整數,並經由int函式轉換成整數,指定為變數num。
第2到5行:利用條件判斷(if)對num做判斷,取2的餘數,若餘數不為0則顯示變數num的值與「為奇數」(第2到3行),否則餘數為0,則變數num的值與「為偶數」(第4到5行)。
(C)多向選擇結構
除了單向選擇與雙向選擇外,更廣義的選擇結構是多向選擇,意即選擇結構中還可以加入選擇結構,單向選擇與雙向選擇為多向選擇結構的特例,多向選擇結構讓程式有無限可能執行的路徑與狀態。
我們可以使用多個if-elif-else來達成多項選擇結構,以成績與評語對應關係為例,介紹多項選擇結構,例如:假設成績與評語有對應關係,若成績大於等於80分,評語為「非常好」;否則若成績大於等於60分,也就是小於80分且大於等於60分,評語為「不錯喔」;否則評語為「要加油」,也就是小於60分,這就是多向選擇結構。
多項選擇結構可以使用多個if-elif-else串接起來,以下說明多項選擇結構語法。
多向選擇結構語法
if 條件判斷1:
條件判斷1成立的敘述
elif 條件判斷2:
條件判斷2成立的敘述
else:
條件判斷2不成立的敘述
程式範例(分數與評語)
if score >= 80:
print('非常好')
elif score >= 60:
print('不錯喔')
else:
print('要加油')
(C-1) 分數與評語
寫一個程式若成績大於等於80分,評語為「非常好」,否則若成績大於等於60分,評語為「不錯喔」,否則評語為「要加油」,將以上敘述表示為表格,如下。
(a)解題想法
可以使用多向選擇結構撰寫程式,若成績是否大於等於80,則顯示「非常好」,否則若成績大於等於60,則顯示「不錯喔」,否則顯示「要加油」。
(b)程式碼與解說
行
1
2
3
4
5
6
7
程式碼
score = int(input('請輸入一個成績?'))
if score >= 80:
print('非常好')
elif score >= 60:
print('不錯喔')
else:
print('要加油')
執行結果
輸入成績「60」,結果顯示在螢幕。
請輸入一個成績?60
不錯喔
解說
第1行:於螢幕顯示「請輸入一個成績?」,允許使用者輸入成績,並經由int函式轉換成整數,指定為變數score。
第2到7行:條件判斷(if)對score做判斷,若大於等於80分就輸出「非常好」(第2到3行),否則若大於等於60分就輸出「不錯喔」(第4到5行),否則輸出「要加油」(第6到7行)。
(C-2) 郵資計算
某快遞公司以重量為計算郵資的依據,重量與郵資計算如下表,請寫一個程式協助快遞人員計算郵資,快遞人員只要輸入重量,程式自動計算郵資。
(a)解題想法
可以使用多向選擇結構撰寫程式,若重量小於等於5公斤,則顯示「50」,否則若重量小於等於10公斤,則顯示「70」,若重量小於等於15公斤,則顯示「90」,若重量小於等於20公斤,則顯示「110」,否則顯示「超過20公斤無法寄送」。
(b)程式碼與解說
行
1
2
3
4
5
6
7
8
9
10
11
程式碼
w = float(input('請輸入物品重量?'))
if w <= 5:
print('所需郵資為50元')
elif w <= 10:
print('所需郵資為70元')
elif w <= 15:
print('所需郵資為90元')
elif w <= 20:
print('所需郵資為110元')
else:
print('超過20公斤無法寄送')
執行結果
請輸入重量「10」,螢幕輸出所需郵資。
請輸入物品重量?10
所需郵資為70元
解說
第1行:於螢幕顯示「請輸入物品重量?」,允許使用者物品重量,並經由float函式轉換成浮點數,指定給變數w。
第2到3行判斷w是否小於等於5,若是則顯示「所需郵資為50元」
第4到5行:否則若w是否小於等於10(隱含成績大於5),若是則顯示「所需郵資為70元」
第6到7行:否則若w是否小於等於15(隱含成績大於10),若是則顯示「所需郵資為90元」
第8到9行:否則若w是否小於等於20(隱含成績大於15),若是則顯示「所需郵資為110元」
第10行到11行::否則(隱含重量大於20)顯示「超過20公斤無法寄送」。