Python語言程序設計(微課版)-課件 -CH05-選擇結構程序設計_第1頁
Python語言程序設計(微課版)-課件 -CH05-選擇結構程序設計_第2頁
Python語言程序設計(微課版)-課件 -CH05-選擇結構程序設計_第3頁
Python語言程序設計(微課版)-課件 -CH05-選擇結構程序設計_第4頁
Python語言程序設計(微課版)-課件 -CH05-選擇結構程序設計_第5頁
已閱讀5頁,還剩49頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章選擇結構程序設計2主要內容選擇結構則會根據條件的真假決定程序控制流程,它是實現復雜程序的基礎。3主要內容選擇結構則會根據條件的真假決定程序控制流程,它是實現復雜程序的基礎。1.選擇結構算法設計。2.if語句,雙分支、多分支、單分支,函數寫法。3.pass語句4.條件表達式5.選擇結構的嵌套。6.函數的遞歸調用(fact(n),求解n!,漢諾塔問題)長征,紅軍四渡赤水,根據敵人的部署情況做出正確選擇在長征期間,毛澤東同志指揮紅軍四度赤水,根據敵人的部署情況做出正確選擇,指揮紅軍運動和作戰,在運動中大量殲滅敵人,牢牢地掌握戰場的主動權,取得了紅軍長征史上以少勝多、變被動為主動的光輝戰例。選擇結構的算法設計【例5.1】輸入x,求函數的值。分析:首先判定x<1條件,如果為True則結果為

x;否則判定x≥1條件,如果為True則結果為

2x

-

1;不管執行哪個分支,最后都需要輸出結果

y選擇結構的算法設計【例5.1】輸入x,求函數的值。分析:首先判定x<1條件,如果為True則結果為x;否則判定x≥1條件,如果為True則結果為2x

-

1;不管執行哪個分支,最后都需要輸出結果y算法設計如果x<1為True,則執行第一個分支。如果x<1為False,那么第二個條件x≥1必然為True,也就不需要再做判斷了。算法設計如果x<1為True,則執行第一個分支。如果x<1為False,那么第二個條件x≥1必然為True,也就不需要再做判斷了。算法設計求三個分支的函數的值。算法設計求三個分支的函數的值。思考:(1)思考4個分支、5個分支或者更多分支的問題的算法設計。(3)算法設計應該力求做到:易于閱讀和理解;減少運算次數;減少程序書寫量。算法設計【例5.2】輸入a、b值,輸出其中較大的數。(1)輸入變量a和b。(2)如果a>b為True,則轉入(3),否則轉入(4)。(3)max=a,轉入(5)。

(4)max=b,轉入(5)。(5)輸出max。(6)結束。算法設計【例5.2】輸入a、b值,輸出其中較大的數。(1)輸入變量a和b。(2)如果a>b為True,則轉入(3),否則轉入(4)。(3)max=a,轉入(5)。(4)max=b,轉入(5)。(5)輸出max。(6)結束。算法設計【例5.3】輸入a、b值,如果a>b,那么交換a和b,使得a≤b。(1)輸入變量a和b。(2)如果條件a>b為True,則交換a和b;否則轉入(3)。(3)輸出a、b。(4)結束。算法設計【例5.3】輸入a、b值,如果a>b,那么交換a和b,使得a≤b。(1)輸入變量a和b。(2)如果條件a>b為True,則交換a和b;否則轉入(3)。(4)輸出a、b。(5)結束。算法設計(1)算法依然包括輸入、處理和輸出3個部分,其中處理部分使用了選擇結構。(2)使用中間變量t交換兩個變量a和b數值的方法常用在一些經典算法中,交換過程如圖5-6所示,讀者應注意理解和掌握。算法設計【例5.4】輸入變量a、b和c,將它們按照從小到大的順序排序后輸出。(1)如果a>b,則a和b交換。(2)如果a>c,則a和c交換,此時可以保證a最小。(3)如果b>c,則b和c交換,此時可以保證b≤c。(4)排序完畢。思考:4個、5個、…、100個變量排序問題的算法應該怎樣設計。算法設計【例5.4】輸入變量a、b和c,將它們按照從小到大的順序排序后輸出。(1)如果a>b,則a和b交換。(2)如果a>c,則a和c交換,此時可以保證a最小。(3)如果b>c,則b和c交換,此時可以保證b≤c。(4)排序完畢。思考4個、5個、…、100個變量排序問題的算法應該怎樣設計。if語句if語句,它會根據判定條件的真假,決定執行的語句。if條件表達式1:

語句塊1[elif條件表達式2:

語句塊2

…...

elif條件表達式n:

語句塊n][else:

執行語句塊n+1]注意:if、elif和else對齊,不可以缺少冒號,各分支的語句塊向右縮進。雙分支if語句雙分支if語句當條件為True時執行一個語句塊,當條件為False時執行另一個語句塊。【例5.5】按照圖5-10所示的算法,編寫【例5.1】的程序,輸入x,求函數的值。雙分支if語句【例5.5】按照圖所示的算法,編寫【例5.1】的程序,輸入x,求函數的值。x=float(input("請輸入x:"))ifx<1:y=xelse:y=2*x-1print("y=",y)在選擇結構程序調試中,每個分支取值都需要測試。熟練掌握單步調試的方法,追蹤程序運行過程。雙分支if語句學習提示:打開Debugger調試器,運行程序,按下Over單步追蹤程序執行過程。注意,一個分支正確,不表示其他分支都正確。需要分別針對分支的各個條件輸入數值,追蹤程序的運行流程,觀察變量或表達式的變化。多分支if語句多分支if語句,包括ifelifelse的

多個分支。【例5.6】按照算法,編寫例5.1的程序,求函數的值。多分支if語句【例5.6】按照算法,編寫例5.1的程序,求函數的值x=float(input("請輸入x:"))ifx<1:y=xelifx<10:y=2*x-1else:y=x**2+2*x+1print("y=",y)單分支if語句elseif和else子句可以省略,如果只有if分支則成為單分支if語句。【例5.7】編寫程序如下,分析其執行流程。x=float(input("請輸入x:"))y=2*x-1ifx<1:#單分支ify=xprint("y=",y)語句塊縮進對齊語句塊中,可以有多條語句,縮進對齊【例5.8】編寫程序x=float(input("請輸入x:"))ifx<1:y=xprint("y=",y)#4print("真分支")#5else:

y=2*x-1 #7print("y=",y)#8print("假分支")#9(1)第8、9行與第7行不對齊,提示縮進錯誤(2)第7、8、9行左對齊后,程序正常運行語句緊跟if后語句緊跟在if、elif或else子句的后邊,書寫在同一行上【例5.9】編寫程序x=float(input("請輸入x:"))ifx<1:y=x;print("y=",y)else:y=2*x-1;print("y=",y)學習提示:為了提高程序的可讀性,方便單步調試程序,建議if、elseif或else子句和語句在不同行書寫。if語句函數【例5.10】編寫程序,實現【例5.2】,編寫函數求兩個參數的最大值。在程序中輸入a、b值,輸出其中較大的數。if語句函數【例5.10】編寫程序,實現【例5.2】,編寫函數求兩個參數的最大值。在程序中輸入a、b值,輸出其中較大的數。defmax(a,b):ifa>b:y=aelse:y=breturnya=int(input("請輸入a:"))b=int(input("請輸入b:"))z=max(a,b)print("最大值為",z)if語句函數【例5.11】編寫函數判斷其參數m是否為“水仙花數”。所謂“水仙花數”是指各位數字的立方和等于該數本身的整數。例如,153

=

13

+

53

+33,所以153為水仙花數。如果是水仙花數,函數的返回值為True否則為Fasleif語句函數deffun(m):a=m//100#求百位數b=m//10%10#求十位數c=m%10;#求個位數

if(a**3+b**3+c**3==m):returnTrueelse:returnFalsem=int(input("請輸入三位整數:"))iffun(m)==True:print(m,"是水仙花數")else:print(m,"不是水仙花數")單分支if語句elif和else分支都省略,只有if分支時稱為單分支語句。【例5.10】按照圖所示的算法,編寫例5.4的程序。輸入變量a、b和c,將它們按照從小到大的順序排序后輸出。單分支if語句【例5.12】按照圖所示的算法,編寫例5.4的程序。輸入變量a、b和c,將它們按照從小到大的順序排序后輸出。單分支if語句【例5.10】按照圖所示的算法,編寫例5.4的程序。輸入變量a、b和c,將它們按照從小到大的順序排序后輸出。a=float(input("請輸入a:"))b=float(input("請輸入b:"))c=float(input("請輸入c:"))ifa>b: #如果a>b,那么交換a和bt=a;a=b;b=tifa>c:t=a;a=c;c=tifb>c:t=b;b=c;c=tprint(a,b,c)多分支if語句【例5.13】輸入學生課程成績mark,按照方法給出評分等級多分支if語句deff(mark):ifmark>=90:print("優秀")elifmark>=80:print("良")elifmark>=70:print("中")elifmark>=60:print("及格")else:print("不及格")mark=float(input("請輸入成績:"))f(mark)#調用函數pass語句pass語句相當于一個空語句,不會執行任何操作,一般用于占位符或者創建占位程序,保證程序格式完整、語義完整。【例5.14】輸入用戶名,如果正確則繼續;否則報錯。username=input("請輸入用戶名:")ifusername=="admin":pass#空語句else:print("用戶名不正確")print("后續語句,繼續")條件運算條件表達式可以將二分支四條語句簡化為一條語句格式:表達式2if表達式1else表達式3a=3;b=4print(aifa>belseb)條件運算條件表達式可以將二分支四條語句簡化為一條語句格式:【例5.15】條件運算a=int(input("a:"))b=int(input("b:"))max=aifa>belseb#相當于max=(aifa>belseb)print(z)ifa>b:max=aelse:max=b選擇結構的嵌套(1)在if語句中又包含一個或多個if語句的形式稱為if語句的嵌套(2)if、elif、else分支都允許嵌套選擇結構,可以嵌套多層if

表達式1:

...... if

表達式2: 語句塊1 else: 語句塊2 ......elif表達式2: ......else: ......

內嵌if語句選擇結構的嵌套【例5.16】停車場規定如下:(1)如果車輛是貨運車輛,那么重量小于等于2噸的收費10元,大于2噸的謝絕入內;(2)如果車輛是客運車輛,乘員數量小于等于7人,則收費5元;如果乘員數大于7人,則收費10元。編寫程序輸入車輛類型、噸數或者乘員數量,根據停車場的規定,判斷該車是否可以進入,收費多少元?選擇結構的嵌套選擇結構的嵌套m=input("請輸入車型(1~貨車,2~客車):")if(m=="1"):t=int(input("請輸入噸數:"))if(t<=2):print("停車費為10元")else:print("該車不得進入!")elif(m=="2"):n=int(input("請輸入乘員數:"))if(n<=7):p=5else:p=10print("該車停車費(元)",p)else:print("輸出車型錯誤!")遞歸函數遞歸是問題求解的重要方法,將一個大規模的復雜問題,層層轉換為一個與原問題相同但是規模較小的問題求解。使用遞歸解決問題的基礎是構造遞歸函數。本章學習了選擇結構之后,可以編寫遞歸函數了。遞歸函數指的是在函數內部調用函數本身。deff(): ...... f()#遞歸調用符f() ......遞歸函數【例5.17】用遞歸算法求n!。分析:根據觀察可知遞歸過程可以總結為以下兩個階段。(1)回推階段:要求n!,從左向右依次回推,直到1!=1。(2)遞推階段:求得1!,再從右向左依次遞推,直到求出n!。遞歸公式為:n!=

n*(n-1)!,(n-1)!=

(n-1)*(n-2)!,…,3!=3*2!,2!=2*1!,1!=1n!→(n-1)!→(n-2)!→(n-3)!→…→3!→2!→1!n!←(n-1)!←(n-2)!←(n-3)!←…←3!←2!←1!遞歸函數學習提示:遞歸算法設計中,要注意觀察問題并找出規律,設計遞歸公式。根據遞歸公式設定遞歸函數的參數并編寫函數。調試過程中,可以單步調試,查看遞歸過程。deffact(n):#遞歸函數ifn==0orn==1:return1else:returnn*fact(n-1)

#遞歸調用n=int(input("輸入整數n:"))t=fact(n)print(n,"!=",t)遞歸函數遞歸函數【例5.18】漢諾塔問題:有3根柱子A、B和C,開始A柱上有64個盤子,從上到下,依次大一點,如何把所有盤子

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論