程式的三個主要結構為循序結構、選擇結構與重複結構。循序結構為程式有從第一行開始逐行執行的特性,第一行執行完畢後執行第二行,第二行執行完畢後執行第三行,直到程式執行結束;選擇結構為若條件測試的結果為真,則做條件測試為真的動作,否則執行條件測試為假的動作,例如:若成績大於等於60分,則輸出及格,否則輸出不及格。重複結構讓電腦重複執行某個區塊的程式多次,電腦適合做重複的工作,例如:求1+2+3+…+1000,使用重複結構可在很短時間內重複執行相加的程式,直到求出加總的結果,重複結構將於下一章介紹。善用這三種結構可以寫出解決問題的程式。
日常生活中也有許多選擇結構的對話,「若明天天氣好的話,我們就去游泳,否則就待在家裡」,程式語言提供選擇結構的程式結構,讓使用者可以於程式中使用,邏輯上的語意為「若測式條件成立,則執行條件成立的動作,否則執行條件不成立的動作」,許多問題的解決過程,都會遇到選擇結構,如登入系統時需要驗證帳號和密碼,正確則可登入系統,否則跳到登入畫面,重新輸入帳號與密碼。
(A)單向選擇結構
單向選擇結構是最簡單的選擇結構,日常生活上經常用到,例如:「若週末天氣好的話,我們就去打球」。單向選擇結構只做測試條件為真時,執行條件為真的動作,只有一個方向的選擇,因此稱做單向選擇結構。
單向選擇程式語法
程式範例
if 條件判斷:
條件成立的敘述
if score >= 60:
print("很好,請繼續保持下去")
說明
若變數score大於等於60,則顯示「很好,請繼續保持下去」。
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)雙向選擇結構
雙向選擇結構比起單向選擇結構更複雜一些,日常生活上屬於雙向選擇的對話,例如:「若週末天氣好的話,我們就出去打球,否則去看電影」。雙向選擇結構為當測試條件為真時,執行測試條件為真的動作;否則做測試條件為假的動作。有兩個方向的選擇,因此稱做雙向選擇結構。
雙向選擇程式語法
程式範例(滿2000打九折)
if 條件判斷:
條件成立的敘述
else:
條件不成立的敘述
if cost >= 2000:
print(cost*0.9)
else:
print(cost)
說明
若cost大於等於2000,則顯示為cost的值打九折,否則顯示cost的值
(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分,評語為「不錯喔」,否則評語為「要加油」,將以上敘述表示為表格,如下。
成績
評語
成績>=80
非常好
80>成績>=60
不錯喔
成績<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) 郵資計算
某快遞公司以重量為計算郵資的依據,重量與郵資計算如下表,請寫一個程式協助快遞人員計算郵資,快遞人員只要輸入重量,程式自動計算郵資。
重量
X<=5公斤
X>5且X<=10公斤
X>10且X<=15公斤
X>15且X<=20公斤
X>20公斤
價格
50
70
90
110
超過20公斤無法寄送
(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公斤無法寄送」。
(D)條件判斷與運算子「in」
可以使用條件判斷與「in」測試資料容器tuple、串列、字典與集合是否包含某個元素。(ch4\條件判斷與運算子「in」.py)
(D-1)判斷tuple是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
執行結果
a = (1,2,3,4)
if 1 in a:
print('數字1在tuple a中')
else:
print('數字1不在tuple a中')
數字1在tuple a中
(D-2)判斷串列是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
執行結果
a = list('abcdefghijklmnopqrstuvwxyz')
if 'q' in a:
print('q在串列a中')
else:
print('q不在串列a中')
q在串列a中
(D-3)判斷字典是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
執行結果
lang1={'早安':'Good Morning','謝謝':'Thank You'}
if '謝謝' in lang1:
print('謝謝的英文為', lang1['謝謝'])
else:
print('查不到謝謝的英文')
謝謝的英文為 Thank You
(D-4) 判斷集合是否包含某個元素
使用條件判斷與「in」進行判斷,程式如下。
程式
執行結果
a = set('tiger')
if 't' in a:
print('t在集合a內')
else:
print('t不在集合a內')
t在集合a內