c語言-第5章選擇結(jié)構(gòu)程序設(shè)計(jì).ppt_第1頁
c語言-第5章選擇結(jié)構(gòu)程序設(shè)計(jì).ppt_第2頁
c語言-第5章選擇結(jié)構(gòu)程序設(shè)計(jì).ppt_第3頁
c語言-第5章選擇結(jié)構(gòu)程序設(shè)計(jì).ppt_第4頁
c語言-第5章選擇結(jié)構(gòu)程序設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、2020/8/2,1,第5章 選擇結(jié)構(gòu)程序設(shè)計(jì),要設(shè)計(jì)選擇結(jié)構(gòu)程序,要考慮兩個(gè)方面的問題:一是在C語言中如何來表示條件,二是在C語言中實(shí)現(xiàn)選擇結(jié)構(gòu)用什么語句。 在C語言中表示條件,一般用關(guān)系表達(dá)式或邏輯表達(dá)式,實(shí)現(xiàn)選擇結(jié)構(gòu)用if語句或switch語句。 5.1 關(guān)系運(yùn)算及其表達(dá)式 5.2 邏輯運(yùn)算及其表達(dá)式 5.3 if語句 5.4 switch語句 5.5 選擇結(jié)構(gòu)程序舉例 良好的源程序書寫風(fēng)格注釋,2020/8/2,2,第五章 選擇結(jié)構(gòu)程序設(shè)計(jì),根據(jù)選擇結(jié)構(gòu)的組成特點(diǎn),分析問題時(shí)著重明確以下兩點(diǎn): 1)條件是什么 2)條件成立和不成立時(shí)分別執(zhí)行什么操作。,2020/8/2,3,引例,需考慮

2、: 輸入x 判斷x的值 根據(jù)x值,計(jì)算y值 輸出y值,顯然,順序程序不能夠?qū)崿F(xiàn),須引入選擇結(jié)構(gòu)程序。,關(guān)系運(yùn)算,Enter x: 2 x=2.00 y=0.4546,2020/8/2,4,5.1 關(guān)系運(yùn)算及其表達(dá)式,所謂“關(guān)系運(yùn)算”實(shí)際上就是“比較運(yùn)算”,即將兩個(gè)數(shù)據(jù)進(jìn)行比較,判定兩個(gè)數(shù)據(jù)是否符合給定的關(guān)系。 例如,“a b”中的“”表示一個(gè)大于關(guān)系運(yùn)算。如果a的值是5,b的值是3,則大于關(guān)系運(yùn)算“”的結(jié)果為“真”,即條件成立;如果a的值是2,b的值是3,則大于關(guān)系運(yùn)算“”的結(jié)果為“假”,即條件不成立。,2020/8/2,5,5.1.1 關(guān)系運(yùn)算符及其優(yōu)先次序 1關(guān)系運(yùn)算符 C語言提供6種關(guān)系

3、運(yùn)算符: (大于) = (大于或等于) = (等于) != (不等于) 注意:在語言中,“等于”關(guān)系運(yùn)算符是雙等號(hào) “= =”,而不是單等號(hào)“= ”(賦值運(yùn)算符)。,2優(yōu)先級(jí) (1)在關(guān)系運(yùn)算符中,前4個(gè)優(yōu)先級(jí)相同,后2個(gè)也相同,且前4個(gè)高于后2個(gè)。 (2)與其它種類運(yùn)算符的優(yōu)先級(jí)關(guān)系 關(guān)系運(yùn)算符的優(yōu)先級(jí),低于算術(shù)運(yùn)算符,但高于賦值運(yùn)算符。(P366),2020/8/2,6,5.1.2 關(guān)系表達(dá)式 1關(guān)系表達(dá)式的概念: 用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來,進(jìn)行關(guān)系運(yùn)算的式子。 例如,下面的關(guān)系表達(dá)式都是合法的: ab, a+bc-d, (a=3)=b, (ab)= =(bc) 2關(guān)系表達(dá)式的值邏

4、輯值(非“真”即“假”)。 由于語言沒有邏輯型數(shù)據(jù),所以用: 整數(shù)“”表示“邏輯真”;用整數(shù)“”表示“邏輯假”。,2020/8/2,7,例如,假設(shè)n1=3,n2=4,n3=5,則: (1)n1n2的值 (2)(n1n2)!=n3的值 (3)n1n3n2的值 (4)(n1n2)+n3的值 思考題:任意改變n1或n2的值,會(huì)影響整個(gè)表達(dá)式的值嗎? 再次強(qiáng)調(diào):C語言用整數(shù)“1”表示“邏輯真”,用整數(shù)“0”表示“邏輯假”。所以,關(guān)系表達(dá)式的值,還可以參與其它種類的運(yùn)算,例如算術(shù)運(yùn)算、邏輯運(yùn)算等。 Return,0 1 1 6,2020/8/2,8,5.2 邏輯運(yùn)算及其表達(dá)式,關(guān)系表達(dá)式只能描述單一條件

5、,例如: “x=0”。如果需要描述“x=0”、同時(shí)“x10”,就要借助于邏輯表達(dá)式了。 5.2.1 邏輯運(yùn)算及其優(yōu)先次序 邏輯運(yùn)算符及其運(yùn)算規(guī)則 (1)C語言提供三種邏輯運(yùn)算符: printf(“Please input three numbers:”); scanf(“%d,%d,%d”,程序運(yùn)行情況如下: Please input three numbers:11,22,18 The three numbers are:11,22,18 max=22,這種優(yōu)化形式的基本思想是:首先取一個(gè)數(shù)預(yù)置為max(最大值),然后再用max依次與其余的數(shù)逐個(gè)比較,如果發(fā)現(xiàn)有比max大的,就用它給max重

6、新賦值,比較完所有的數(shù)后,max中的數(shù)就是最大值。這種方法,對(duì)從3個(gè)或3個(gè)以上的數(shù)中找最大值的處理,非常有效。,max=n1; if(n2max) max=n2;,2020/8/2,15,例5.2輸入任意三個(gè)數(shù)n1、n2、n3,按從小到大的順序排序輸出。 /*例代碼文件名:L5_2.C。*/(P98) #include main() int n1,n2,n3,temp; printf(Please input three numbers:); scanf(%d,%d,%d, 程序運(yùn)行情況如下: Please input three numbers: 22,18,11 Three numbers

7、 after sorted: 11,18,22,2020/8/2,16,1if語句的一般格式 if(表達(dá)式) 語句組1; else 語句組2; (1)if語句中的“表達(dá)式”必須用“(”和“)”括起來。 (2)else子句(可選)是if語句的一部分,必須與if配對(duì)使用,不能單獨(dú)使用。 (3)當(dāng)if和else下面的語句組,僅由一條語句構(gòu)成時(shí),也可不使用復(fù)合語句形式,即去掉花括號(hào)“ ”。,2020/8/2,17,2if語句的執(zhí)行過程 (1)缺省else子句時(shí)(P96) 當(dāng)“表達(dá)式”的值不等于0(即判定為“邏輯真”)時(shí),則執(zhí)行語句組1,否則直接轉(zhuǎn)向執(zhí)行下一條。如圖5-5(a)所示。 (2)指定else

8、子句時(shí) 當(dāng)“表達(dá)式”的值不等于0(即判定為“邏輯真”)時(shí),則執(zhí)行語句組1,然后轉(zhuǎn)向下一條語句;否則,執(zhí)行語句組2。如圖5-5(b)所示。 3if語句的嵌套與嵌套匹配原則 if語句允許嵌套。所謂if語句的嵌套是指,在“語句組1”或(和)“語句組2”中,又包含有if語句的情況。 if語句嵌套時(shí),else子句與if的匹配原則:與在它上面、距它最近、且尚未匹配的if配對(duì)。 為明確匹配關(guān)系,避免匹配錯(cuò)誤,建議:將內(nèi)嵌的if語句,一律用花括號(hào)括起來。,2020/8/2,18,例5.3 寫一程序,從鍵盤上輸入一個(gè)年份year(4位十進(jìn)制數(shù)),判斷其是否閏年。 算法設(shè)計(jì)要點(diǎn): 1)閏年的條件是:能被4整除、但

9、不能被100整除,或者能被400整除。 2)如果能被整除,則余數(shù)為,即如果的值等于,則表示能被整除! 3)首先將是否閏年的標(biāo)志leap預(yù)置為0(非閏年),這樣僅當(dāng)year為閏年時(shí)將leap置為1即可。這種處理兩種狀態(tài)值的方法,對(duì)優(yōu)化算法和提高程序可讀性非常有效。,2020/8/2,19,#include main() int year,leap=0; /* leap=0:預(yù)置為非閏年*/ printf(Please input the year:); scanf(%d, ,利用邏輯運(yùn)算能描述復(fù)雜條件的特點(diǎn),可將上述程序優(yōu)化如下: #include main() int year; printf

10、(Please input the year:); scanf(%d, ,參考程序如下: /*例代碼文件名:L5_3.C。*/ /*功能:說明if語句的嵌套格式和用法。*/,2020/8/2,20,4說明 (1)if后面的“表達(dá)式”,除常見的關(guān)系表達(dá)式或邏輯表達(dá)式外,也允許是其它類型的數(shù)據(jù),如整型、實(shí)型、字符型等。 (2)if語句允許嵌套,但嵌套的層數(shù)不宜太多。在實(shí)際編程時(shí),應(yīng)適當(dāng)控制嵌套層數(shù)(23層)。 (3)“語句組1”和“語句組2”,可以只包含一個(gè)簡單語句,也可以是復(fù)合語句。 務(wù)必牢記:不管是簡單語句,還是復(fù)合語句中的各個(gè)語句,每個(gè)語句后面的分號(hào)必不可少! 例如,例5.1中的: if (

11、n1n2) max=n1; else max=n2; if行后面的賦值語句“max=n1;”分號(hào)不能省略。但不要誤認(rèn)為if和else是2個(gè)獨(dú)立的語句,它們都屬于if語句中的一部分,else是if語句的子句。,2020/8/2,21,5.3.2 條件運(yùn)算符 1一般格式: 表達(dá)式1?表達(dá)式2:表達(dá)式3 條件表達(dá)式中的“表達(dá)式1”、“表達(dá)式2”、“表達(dá)式3”的類型,可以各不相同。 2運(yùn)算規(guī)則 如果“表達(dá)式1”的值為非0(即邏輯真), 則運(yùn)算結(jié)果等于“表達(dá)式2”的值;否則,運(yùn)算結(jié)果等于“表達(dá)式3”的值。如圖5-11所示。 3運(yùn)算符的優(yōu)先級(jí)與結(jié)合性 條件運(yùn)算符的優(yōu)先級(jí),高于賦值運(yùn)算符,但低于關(guān)系運(yùn)算符和

12、算術(shù)運(yùn)算符。其結(jié)合性為“從右到左”(即右結(jié)合性)。,2020/8/2,22,#include main() char ch; printf(Input a character: ); scanf(%c, ,例5.4 從鍵盤上輸入一個(gè)字符,如果它是大寫字母,則把它轉(zhuǎn)換成小寫字母輸出;否則,直接輸出。 /*例文件名:L5_4.C*/,2020/8/2,23,5.4 switch語句,C語言提供了switch語句直接處理多分支選擇。 例5.5 從鍵盤上輸入一個(gè)百分制成績score,按下列原則輸出其等級(jí):score90,等級(jí)為A;80score main()int score, grade; prin

13、tf(“Input a score(0100): ”); scanf(“%d”, ,2020/8/2,24,case 8: printf(grade=Bn); break; case 7: printf(grade=Cn); break; case 6: printf(grade=Dn); break; case 5: case 4: case 3: case 2: case 1: case 0: printf(“grade=En”); break; default: printf(“The score is out of range!n”); 程序運(yùn)行情況如下: Input a score(

14、0100): 85 grade=B,2020/8/2,25,1switch語句的一般形式 switch(表達(dá)式) case 常量表達(dá)式1:語句組;break; case 常量表達(dá)式2:語句組;break; . case 常量表達(dá)式:語句組;break; default:語句組;break; 2執(zhí)行過程 1)當(dāng)switch后面“表達(dá)式”的值,與某個(gè)case后面的“常量表達(dá)式”的值相同時(shí),就執(zhí)行該case后面的語句(組);當(dāng)執(zhí)行到break語句時(shí),跳出switch語句,轉(zhuǎn)向執(zhí)行switch語句的下一條。 2)如果沒有任何一個(gè)case后面的“常量表達(dá)式”的值,與“表達(dá)式”的值匹配,則執(zhí)行defaul

15、t 后面的語句(組)。然后,再執(zhí)行switch語句的下一條。,2020/8/2,26,3說明 (1)switch后面的“表達(dá)式”,可以是int、char和枚舉型中的一種。 (2)每個(gè)case后面“常量表達(dá)式”的值,必須各不相同,否則會(huì)出現(xiàn)相互矛盾的現(xiàn)象(即對(duì)表達(dá)式的同一值,有兩種或兩種以上的執(zhí)行方案)。 (3)case后面的常量表達(dá)式僅起語句標(biāo)號(hào)作用,并不進(jìn)行條件判斷。系統(tǒng)一旦找到入口標(biāo)號(hào),就從此標(biāo)號(hào)開始執(zhí)行,不再進(jìn)行標(biāo)號(hào)判斷,所以必須加上break語句,以便結(jié)束switch語句。 思考題:如果去掉例5.5程序中的所有break語句,且輸入的成績?yōu)?5,輸出會(huì)如何?,2020/8/2,27,(

16、4)各case及default子句的先后次序,不影響程序執(zhí)行結(jié)果。 (5)多個(gè)case子句,可共用同一語句(組)。 例如,在例5.5中, case 10: 和case 9: 共用語句【printf(”grade=An“); break;】 case 5: case 0: 共用語句【printf(”grade=En“); break;】 (6)用switch語句實(shí)現(xiàn)的多分支結(jié)構(gòu)程序,完全可以用if語句或if語句的嵌套來實(shí)現(xiàn)。,2020/8/2,28,5.5 選擇結(jié)構(gòu)程序設(shè)計(jì)舉例,#include #include main() float a,b,c,disc,x1,x2,p,q; scanf(

17、“%f,%f,%f”, ,例5.6 求一元二次方程ax2+bx+c=0的解(a0)。(P108)/*例代碼文件名:L5_6.C。*/,說明:由于實(shí)數(shù)在計(jì)算機(jī)中存儲(chǔ)時(shí),經(jīng)常會(huì)有一些微小誤差,所以本例判斷disc是否為0的方法是:判斷disc的絕對(duì)值是否小于一個(gè)很小的數(shù)(例如10-6)。,2020/8/2,29,例5.7 已知某公司員工的保底薪水為500,某月所接工程的利潤profit(整數(shù))與利潤提成的關(guān)系如下(計(jì)量單位:元)(P110) profit1000沒有提成; 1000 profit2000提成10%; 2000 profit5000提成15%; 5000 profit10000提成2

18、0%; 10000profit提成25%。 算法設(shè)計(jì)要點(diǎn): 為使用switch語句,必須將利潤profit與提成的關(guān)系,轉(zhuǎn)換成某些整數(shù)與提成的關(guān)系。分析本題可知,提成的變化點(diǎn)都是1000的整數(shù)倍(1000、2000、5000、),如果將利潤profit整除1000,則當(dāng): profit1000對(duì)應(yīng)0、1 1000 profit2000對(duì)應(yīng)1、2 2000 profit5000對(duì)應(yīng)2、3、4、5 5000 profit10000對(duì)應(yīng)5、6、7、8、9、10 10000profit對(duì)應(yīng)10、11、12、 為解決相鄰兩個(gè)區(qū)間的重疊問題,最簡單的方法就是:利潤profit先減1(最小增量),然后再整除

19、1000即可: profit1000對(duì)應(yīng)0 1000 profit2000對(duì)應(yīng)1 2000 profit5000對(duì)應(yīng)2、3、4 5000 profit10000對(duì)應(yīng)5、6、7、8、9 10000profit對(duì)應(yīng)10、11、12、,2020/8/2,30,/*例代碼文件名:AL5_7.C。*/ #include main() long profit; int grade; float salary=500; printf(Input profit: ); scanf(%ld, ,2020/8/2,31,良好的源程序書寫風(fēng)格注釋,必要的注釋,可有效地提高程序的可讀性,從而提高程序的可維護(hù)性。 在語言源程序中,注釋可分為三種

溫馨提示

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

評(píng)論

0/150

提交評(píng)論