




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 第三部分第三部分 C語言的結構語句語言的結構語句 第第4章章 選擇結構選擇結構問題的提出:百分制成績的等級劃分問題編程實現:給出一百分制成績,要求輸出成績等級A、B、C、D、E。90分以上為A等,8980分為B等,7970分為C等,6960分為D等,60分以下為E等。 假定成績為整型數據。4.1 if 語句語句4.1.1 單分支單分支if語句語句 它的一般格式如下:它的一般格式如下: if(表達式)(表達式) 語句;語句; 說明:對條件表達式進行判斷,若其值為說明:對條件表達式進行判斷,若其值為“真(非真(非0)”時執行語句,若其值為時執行語句,若其值為“假(假(0)”時則跳過語句。其執行過
2、程時則跳過語句。其執行過程見流程圖見流程圖4.1。一條件:一條件:一個條件表達式可以是一個條件表達式可以是單值判斷如單值判斷如x=1,也可以是范圍也可以是范圍判斷,如判斷,如x0 & x = 60 ) printf ( “passedn ” ) ;又如:x大于y就輸出x,用單分支if語句描述為: if ( x y ) printf ( “%d ”, x ) ; 寫出程序段的運行結果:當整型變量x=55,60,78時, if ( x = 60 ) printf ( “%d ”, x ) ; printf ( “passedn ” ) ; 【例【例4-1】百分制成績的等級劃分問題之解法】百
3、分制成績的等級劃分問題之解法1:僅:僅用用if單分支語句實現單分支語句實現 main() int score; scanf(%d,&score); if (score=60&score=70& score=80& score=90) printf(“grade=A”);/要求掌握:數學范圍與if條件范圍的轉換4.1.2 雙分支雙分支if語句語句它的一般格式如下:if (表達式表達式) 語句語句1;else 語句語句2; 說明:與單分支if語句不同的是在條件為“真(非0)”或“假(0)”時執行指定的不同的操作。對條件表達式進行判斷,若其值為“真(非0)”時,就執行
4、語句1;若其值為“假(0)”時,就執行語句2。其執行過程見流程圖4.2。一條件:一條件:一個條件一個條件/關系表達式關系表達式一語句:一語句: if后有且僅能有一條后有且僅能有一條語句語句,else后只能管一條語句后只能管一條語句一執行:一執行:只能執行一條語句只能執行一條語句例如:給學生成績劃分:成績大于或等于60分時輸出“passed”,成績小于60分時輸出“failed”。用雙分支if語句描述為: if ( grade = 60 ) printf ( “passedn ” ) ; else printf ( “failedn ” ) ;說明:說明:1.對于單分支和雙分支對于單分支和雙分支
5、if后面的后面的“表達式表達式”,一般,一般為邏輯表達式或關系表達式為邏輯表達式或關系表達式,事實上表達式的類型,事實上表達式的類型不限于此,可以是任意的數值類型(包括整型、實不限于此,可以是任意的數值類型(包括整型、實型、字符型、指針型數據)。只要表達式的值為非型、字符型、指針型數據)。只要表達式的值為非0,就認為它為真;只要表達式的值為,就認為它為真;只要表達式的值為0,就認為它,就認為它為假。為假。 例如:例如: if ( 6 ) printf ( “passedn ” ) ; if ( A ) printf ( “%d ”, A ) ; 這些都是合法的這些都是合法的if語句。語句。2.
6、 else子句不能作為語句單獨使用子句不能作為語句單獨使用,它必須是,它必須是if語語句的一部分,與句的一部分,與if配對使用。配對使用。 3.if語句后面的表達式之后不能增加分號(為何?為何?),同時注意語句后面的分號不能遺漏(為何?為何?) 。4.在if和else后面可以只包括一個內嵌的操作語句,也可以包括多個操作語句,此時務必用“”將幾個語句括起來成為一個復合語句。 例如:if ( x 100 ) x- ; s=+x ; /如果去掉括號如果去掉括號呢?呢? else x+ ; s=+x ; /如果去掉括號如果去掉括號呢?呢?此時又要注意:在“”后面不能再添加分號,因為“”內是一個完整的復
7、合語句,不需要再添加分號。在前面的章節還提到過與if / else結構密切相關的條件運算符 ?:,它是C語言中唯一的三目運算符(即有三個操作數)。對上面的兩例用條件運算符改寫為: grade = 60 ?printf ( “passedn ” ) :printf ( “failedn ” ) ; x y ?printf ( “%d ”, x ) :printf ( “%d ”, y ) ;由此說明適當的語句修改條件運算符可以完成if / else結構相同的功能。4.1.3 多分支多分支if語句語句對于解決判斷多個條件的問題,可以使用對于解決判斷多個條件的問題,可以使用if語句的嵌套,即語句的嵌
8、套,即在在if語句中又包括一個或多個語句中又包括一個或多個if語句。它的一般格式如下:語句。它的一般格式如下:if (表達式表達式1) 語句語句1;else if (表達式表達式2) 語句語句2;else if (表達式表達式3) 語句語句3; else if (表達式表達式m) 語句語句m;else 語句語句n; /一般來說表達式之間具備一定的順序關系一般來說表達式之間具備一定的順序關系說明:1.執行順序:執行順序:開始執行該結構后,便依次去對多個條件進行判斷測試,符合某一條件,則轉去執行該條件下的操作,其它部分將被跳過;如果無一條件為“真(非0)”,就執行最后一個else所指定的操作,這個
9、else可以看作“其它情形”。2.應當特別注意應當特別注意if與與else的匹配關系的匹配關系(難點難點):規則是從最內層開始,else總是與它上面最近的(未曾配對的)if配對(而不是if與他最下面的else匹配)。例 根據程序寫出運行結果main ( ) int x=2,y=-1,z=2; if(xy) if(y=90) printf(An); else if(grade=80) printf(Bn); else if(grade=70) printf(Cn); else if(grade=60) printf(Dn); else printf(En);例:關于if與else的匹配問題編程實
10、現以下功能:編程實現以下功能:1)當當a=0并且并且b=0時輸出時輸出“error”2)當當a=0并且并且b!=0時什么也不做時什么也不做3)當當a!=0時,進行自加時,進行自加a=0b=0輸出輸出”error”開始開始結束結束a+TFFTIf (a=0) if (b=0) printf(“error”); /請問他們是如何匹配的請問他們是如何匹配的?else a+;4.2 switch語句語句4.2.1 switch語句語句對于解決實際生活中例如人口統計分類、工資統計分類、銀行存款分類等等的多分支選擇問題,采用多分支if語句(即if語句的嵌套)來處理固然可以,但是如果分支較多,則嵌套的if語
11、句層數多,程序冗長而且會導致可讀性降低。C語言提供了直接處理多分支選擇的switch語句,它的一般格式如下:switch ( 表達式表達式 ) case 常量表達式常量表達式1:語句:語句1; case 常量表達式常量表達式2:語句:語句2; case 常量表達式常量表達式n:語句:語句n; default : 語句語句m;說明:其執行過程可描述為:說明:其執行過程可描述為: 按整型、配標號、添按整型、配標號、添break、可跳出。、可跳出。1.按整型、配標號按整型、配標號: 根據整型根據整型/字符型表達式的值,從上字符型表達式的值,從上到下去找與其相匹配的到下去找與其相匹配的case標號(標
12、號(整型常量,單值,整型常量,單值,故不會進行范圍判斷,如故不會進行范圍判斷,如x0 ),以此作為入口,執行),以此作為入口,執行其后面的各語句。其后面的各語句。2.添添break、可跳出。、可跳出。見下節見下節/百分制成績的等級劃分問題之解法百分制成績的等級劃分問題之解法3(不完善不完善):main( )int grade; printf(input the grade:);scanf(%d,&grade);switch(grade/10) /按單值匹配按單值匹配,故要將范圍映射為單值故要將范圍映射為單值 case 10: case 9: printf(An); case 8: pr
13、intf(Bn); case 7: printf(Cn); case 6: printf(Dn); default : printf(En); 【例【例4-3】對【例】對【例4-2】用】用switch語句改寫語句改寫.如何改寫呢?如何改寫呢?關鍵:關鍵:不象多分支不象多分支if語句語句有范圍判斷有范圍判斷,而而switch語語句按單值匹配句按單值匹配,故要將范故要將范圍映射為單值圍映射為單值. 【運行結果】input the grade:98ABCDE說明:此時的結果并不是我們所希望得到的,也就是說根據switch后面表達式的值找到了相匹配的case分支后,就以此為入口執行后面的所有語句,而不
14、再進行判斷了。其流程圖如圖4.5。問題:問題:如果分別輸入如果分別輸入82,77,65,52時,運行結時,運行結果會怎樣呢?果會怎樣呢? 4.2.2 break語句在語句在switch結構中的結構中的運用運用添添break、可跳出。、可跳出。為了正確使用switch結構從多種結果中選擇一種結果的功能,我們可以運用前面學過的break語句直接跳出switch結構來達到此目的。對流程圖4.5修改如下如圖4.6:【例【例4-4】百分制成績的等級劃分問題之解法】百分制成績的等級劃分問題之解法3(較完善較完善):【源程序】main( )int grade;printf(input the grade:)
15、;scanf(%d,&grade);switch(grade/10)case 10:case 9: printf(An);break;case 8: printf(Bn);break;case 7: printf(Cn);break;case 6: printf(Dn);break;default : printf(En);break; 說明:1. switch結構的執行部分是一個由一些case子句和一個可缺省的default子句組成的復合語句,特別注意要用一對“”括起來。2. switch后面的表達式一般是整型表達式或整型表達式或字符型表達式字符型表達式,與之相對應的case后面的常
16、量表達式也應是一個整型表達式或字符型表達式,但要注意case與常量表達式之間要有空格。例如:case 6+9 : printf( “ok” ) ;是合法的。3.在執行switch語句時,根據其后表達式的值找相匹配的case子句,要注意“case 常量表達式”只是起語句標號的作用,并不是在該處進行條件判斷。當找到相匹配的case子句即入口標號時,就從此標號開始執行后面的語句。因此,應該在執行一個case子句后必須增加一條間斷語句break來使流程跳出switch結構。如果未找到相匹配的case子句就執行default子句,若default子句放在最后其后可以不加break語句。4.各個case子
17、句出現的次序對執行結果沒任何影響,即順序可以任意布局。5.每一個case能夠擁有一條或多條語句,其最大的不同之處在于使用多條語句時不需要用“”括起來。6.多個case可以共用一組執行語句。例如: case A: case a: +count ; break ; 成績為大寫字母A或小寫字母a都進行累加求和。7. switch結構中的case子句中的常量表達式的值不允許相同。8. switch結構允許嵌套。 4.3 實例解析實例解析【例【例4-5】從鍵盤輸入三個整數】從鍵盤輸入三個整數a、b、c,輸出最大的一個。輸出最大的一個。【編程思路】分析:可以先找出a與b之間的較大者,然后再將這個較大者與c
18、比較找出較大者,則此數即為三個數中的最大數。 程序代碼:程序代碼: main( ) int a,b,c,max; printf(input a,b,c:); scanf(%d,%d,%d,&a,&b,&c); if(ab) if(ac) max=a; else max=c; else if(bc) max=b; else max=c; printf(the max is :%d n,max); #include main() int c; printf(Enter m or n or h or other:); c=getchar(); switch(c) case m
19、: printf(nGood morning!n);break; case n: printf(nGood night!n); break; case h: printf(nHello!n); break; default : printf(n?n); break; 【例【例4-6】根據輸入字母輸出字符串根據輸入字母輸出字符串【例【例4-7】根據程序寫出運行結果】根據程序寫出運行結果main ( ) int x=2,y=-1,z=2; if(xy) if(y0) z=0; else z+=1; printf(“%dn“,z);main ( ) int i=10; switch(i) case 9:i+=1; case 10:i+=1; case 11:i+=1; default:i+=1; printf(%dn,i);答案:答案:2答案:答案:13【例【例4-8】根據輸入的年份和月份,計算該月有多少天?】根據輸入的年份和月份,計算該月有多少天?(考慮閏年和平年的情況)(考慮閏年和平年的情況) main()int year,month,day; printf(“input the year and month:”);scanf(“%d,%d”,&year,&month);switch(month) case 4: case
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論