kj-第4章選擇結(jié)構(gòu)程序的設(shè)計ppt課件(全)_第1頁
kj-第4章選擇結(jié)構(gòu)程序的設(shè)計ppt課件(全)_第2頁
kj-第4章選擇結(jié)構(gòu)程序的設(shè)計ppt課件(全)_第3頁
kj-第4章選擇結(jié)構(gòu)程序的設(shè)計ppt課件(全)_第4頁
kj-第4章選擇結(jié)構(gòu)程序的設(shè)計ppt課件(全)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 選擇結(jié)構(gòu)程序的設(shè)計本章概述 本章的學習目標主要內(nèi)容1本章概述首先介紹條件表達式和邏輯表達式其次介紹了選擇結(jié)構(gòu)的基本語句If語句及其三種形式switch語句的介紹 if語句和switch語句的嵌套使用相應(yīng)程序舉例2本章的學習目標本章教學目的: 掌握關(guān)系表達式和邏輯表達式的使用方法,能使用if和switch 語句編寫簡單的程序。本章教學重點:if和switch 語句本章教學難點:if和switch語句的嵌套3主要內(nèi)容4.1 關(guān)系運算及關(guān)系表達式4.2 邏輯運算及邏輯表達式4.3 if語句4.4 switch語句4.5 if語句和switch語句的嵌套形式4.6 程序舉例44.1 關(guān)系運算及

2、關(guān)系表達式 所謂“關(guān)系運算”實際上就是“比較運算”,即將兩個數(shù)據(jù)進行比較,判定兩個數(shù)據(jù)是否符合給定的關(guān)系。 例如,“a b”中的“”表示一個大于關(guān)系運算。如果a的值是5,b的值是3,則大于關(guān)系運算“”的結(jié)果為“真”,即條件成立;如果a的值是2,b的值是3,則大于關(guān)系運算“”的結(jié)果為“假”,即條件不成立。54.1 關(guān)系運算及關(guān)系表達式 關(guān)系運算符及其優(yōu)先次序1關(guān)系運算符C語言提供6種關(guān)系運算符:(小于), (大于), =(大于或等于), =(等于), !=(不等于) 2優(yōu)先級 在關(guān)系運算符中,前4個優(yōu)先級相同,后2個也相同,且前4個高于后2個。64.1 關(guān)系運算及關(guān)系表達式注意:在語言中,“等于

3、”關(guān)系運算符是雙等號”= =”,而不是單等號“= ”(賦值運算符)。應(yīng)避免對實數(shù)作相等或不等的判斷,如 1.0/3.0*3.0= =1.0 ,可改寫為:fabs(1.0/3.0*3.0-1.0)b,a+bc-d,(a=3)=b,(ab)= =(bc)2關(guān)系表達式的值邏輯值(非“真”即“假”)。84.1關(guān)系運算及關(guān)系表達式注意:可以把關(guān)系表達式的值賦給其他變量, z= (xy+3) 當x=23,y=12時,z的值為1。a=(b!=c) 當b=2、c=2時,a的值為0。關(guān)系運算符是自左至右的結(jié)合方向,若a=3、b=2、c=1,y=(abc) ,則y 的值為0。因為按照自左至右的結(jié)合方向,先執(zhí)行關(guān)系

4、運算“ab”得值為1(“真”),再執(zhí)行關(guān)系運算“1c”,得值為0(“假”),因此y為0。94.1關(guān)系運算及關(guān)系表達式關(guān)系運算符的優(yōu)先級低于算術(shù)運算符。關(guān)系運算符的優(yōu)先級高于賦值運算符。根據(jù)優(yōu)先級的規(guī)定,下面左邊的關(guān)系表達式可以簡化為下面右邊的形式:(b*b-4*a*c)=0 b*b-4*a*c=0z= (xy+3) z= xy+3(ab)= = c ab= =c a=(b!=c) a=b!=c當然為提高程序的可讀性、可維護性你不妨多使用括號,因為C語言中的有些優(yōu)先級很容易讓你不小心犯錯。104.2 邏輯運算及其表達式關(guān)系表達式只能描述單一條件,例如“x=0”。如果需要描述“x=0”、同時“x0

5、)&(y0) x0 & y0(x= =3)| |(y!= 6) x= =3 | | y!= 6 (x0) & (!z) x0 & !z134.2 邏輯運算及其表達式4.2.2 邏輯表達式1邏輯表達式的概念 所謂邏輯表達式是指,用邏輯運算符將1個或多個表達式連接起來,進行邏輯運算的式子。在C語言中,用邏輯表達式表示多個條件的組合。 例如,(year%4=0)&(year%100!=0)|(year%400=0)就是一個判斷一個年份是否是閏年的邏輯表達式。 邏輯表達式的值也是一個邏輯值(非“真”即“假”)。144.2 邏輯運算及其表達式4.2.2 邏輯表達式2邏輯量的真假判定和非 語言用整數(shù)“”表

6、示“邏輯真”、用“”表示“邏輯假”。但在判斷一個數(shù)據(jù)的“真”或“假”時,卻以和非為根據(jù):如果為,則判定為“邏輯假”;如果為非,則判定為“邏輯真”。 例如,假設(shè)num=12,則: !num的值= ,num=1 num31的值=1。154.2 邏輯運算及其表達式3說明邏輯運算符兩側(cè)的操作數(shù),除可以是和非的整數(shù)外,也可以是其它任何類型的數(shù)據(jù),如實型、字符型等。注意:在邏輯表達式的求解中,并不是所有的邏輯運算符都被按順序執(zhí)行,若計算到某一步時,邏輯表達式的值是“真”是“假”已經(jīng)明確,則不再執(zhí)行后面的邏輯運算符。例如:(1)對于邏輯表達式a & b & c , 只有a為真(非0)時,才需要判別b的值,只

7、有a和b都為真的情況下才需要判別c的值。只要a為假,就不再去判斷b和c(此時整個表達式已確定為假)。如果a為真,b為假,就不再去判斷c。 (2)對于邏輯表達式a | | b | | c, 只要a為真(非0),就不再去判斷b和c。只有a為假,才去判斷b。a和b都為假時,才去判斷c。164.3 if語句if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假),決定執(zhí)行哪條分支的語句。 4.3.1 if語句的三種形式1第一種if語句格式如下:if(表達式)語句它的執(zhí)行過程見圖,若表達式為“真”,則執(zhí)行該語句,否則不執(zhí)行該語句。174.3 if語句例4.1 從鍵盤輸入一個整數(shù)x,如果x0,則打

8、印x的值。 # include int main() int x; printf(Input x:); scanf(%d,&x); if (x0) printf(x=%dn, x); return 0; 184.3 if語句2第二種if語句格式如下:if(表達式) 語句1else 語句2它的執(zhí)行過程是: 若表達式為“真”,則執(zhí)行該語句1,否則執(zhí)行語句2,語句1和語句2只能有其中一個語句被執(zhí)行到。 194.3 if語句# include int main() int a; printf(輸入一個整數(shù):); scanf(%d,&a); if(a%2= =0) printf(%d 是偶數(shù)n,a);

9、else printf(%d 是奇數(shù)n,a); return 0;例4.2 從鍵盤輸入一個整數(shù),判斷該整數(shù)是奇數(shù)還是偶數(shù)。203第三種if語句格式如下:3第三種if語句格式如下:if(表達式1) 語句1else if(表達式2) 語句2else if(表達式n-1) 語句n-1else 語句n213第三種if語句格式如下:224.3 if語句# include int main() float x,y; printf(Input x:); scanf(%f,&x); if(x1) y=x+1; else if (1=x & x2) y=x+2; /*或?qū)懗蒭lse if (x2) y=x+2;

10、*/ else y=x+3; printf(x=%f, y=%fn,x,y); return 0;例4.3 輸入x,計算并輸出下列分段函數(shù)y的值。234.3 if語句4.3.2 條件運算符 條件運算符要求有3個操作對象,稱為三目運算符,它是C語言中唯一的一個三目運算符。條件表達式的一般形式如下: 表達式1?表達式2:表達式3 它的執(zhí)行過程是:先求解表達式1,若表達式1為“真”,則取表達式2的值為該條件表達式的值,否則取表達式3的值為該條件表達式的值。 例如以下的if語句: if(x=y)s=x*y; else s=x+y;可以用下面的條件運算符來處理: s=(x=y)?(x*y) :(x+y)

11、 ;其中“(x=y)?(x*y) :(x+y)”是一個“條件表達式”。244.3 if語句4.3.2 條件運算符說明:(1)條件運算符優(yōu)先于賦值運算符。因此上面在“s =(x=y)?(x*y) :(x+y) ;”中,是先求解條件表達式,再將它的值賦給s。(2)條件運算符的優(yōu)先級別低于關(guān)系運算符和算術(shù)運算符。因此條件表達式:s =(x=y)?(x*y) :(x+y) ;括號可以不要,寫成下面形式:s = x8?0:y3?1:-1 相當于 x8?0:(y3?1:-1)(4)條件表達式中“表達式2”和“表達式3” 不僅可以是數(shù)值表達式,也可以是賦值表達式或函數(shù)表達式。例如: xy ?(z=x+y):

12、(z=x*y) 或 xy ?putchar(A):putchar(a) 即xy成立時,上面條件表達式的值是putchar(A);否則上面條件表達式的值是putchar(a)。函數(shù)putchar的返回值是參數(shù)本身,即顯示的字符。 264.3 if語句例4.4 輸入一個2位整數(shù),判斷它的十位數(shù)碼是否為3,如果是3,將它乘以10;如果不是,將它乘以6。然后輸出乘以10或乘以6后的結(jié)果。# include int main() int m, k; scanf(%d,&m); k=(m/10=3)?(m=m*10) : (m=m*6); printf(%dn,k); return 0;274.4 swi

13、tch語句1switch語句的一般形式switch(表達式) case 常量表達式1:語句組;break; case 常量表達式2:語句組;break; . case 常量表達式:語句組;break; default:語句組;break; 284.4 switch語句2執(zhí)行過程(1)當switch后面“表達式”的值,與某個case后面的“常量表達式”的值相同時,就執(zhí)行該case后面的語句(組);當執(zhí)行到break語句時,跳出switch語句,轉(zhuǎn)向執(zhí)行switch語句的下一條。(2)如果沒有任何一個case后面的“常量表達式”的值,與“表達式”的值匹配,則執(zhí)行default 后面的語句(組)。然

14、后,再執(zhí)行switch語句的下一條。294.4 switch語句3注意問題:(l)switch后的表達式的類型與常量表達式的類型必須一致。(2)每一個case的常量表達式的值必須互不相同,否則就會出現(xiàn)互相矛盾的現(xiàn)象。(3)在case后面雖然包含了一個以上執(zhí)行語句,但可以不用花括弧括起來,會自動順序執(zhí)行本case后面所有的執(zhí)行語句。當然加上花括弧也可以。304.4 switch語句3注意問題:(4)break語句的作用是使流程跳出switch結(jié)構(gòu),即終止switch語句的執(zhí)行。格式中的break語句一般情況下不要省略,因為沒有break語句,無法跳出switch結(jié)構(gòu),會繼續(xù)執(zhí)行下一條case后面

15、的語句。最后一個分支(default)可以不加break語句。(5)各個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。314.4 switch語句例4.5 分析下面程序。# include int main() char ch; printf(Input Y/N(y/n):); scanf(%c,&ch); switch(ch) case y: case Y: printf(this is Y or yn); break; case n: case N: printf(this is N or nn); break; default: printf(this is other char.n

16、); return 0;324.5 if語句和switch語句的嵌套形式4.5.1 if語句的嵌套在if語句中可以包含一個或多個if語句,稱為if語句的嵌套。如下所示: if() if() 語句1 else 語句2 else if() 語句3 else 語句4應(yīng)當注意if與else的配對關(guān)系。else總是與它上面的最近的未配對的if配對。如果if與else的數(shù)目不一樣,為實現(xiàn)程序設(shè)計者的意圖,可以加花括弧來確定配對關(guān)系。33# include int main() float x,y; printf(Input x:); scanf(%f,&x); if(x10) if(x0) y=5*x-6

17、; else y=4*x; else y=2*x+3; printf(x=%f, y=%fn,x,y); return 0;例4.6 輸入x,計算并輸出下列分段函數(shù)y的值。344.5 .2 switch語句的嵌套例4.7 分析下面程序。 # include int main() float x,y; printf(Input x:); scanf(%f,&x); switch(x=0) case 0 : y=5*x-6; break; case 1: switch (x=10) case 0 : y=4*x; break; case 1 : y=2*x+3; break; printf(y=%

18、fn,y); return 0; 運行程序: 若輸入-2,則(x=0)為假,則輸出-16,即是按照y=5*x-6來計算并輸出y值。 若輸入8,則(x=0)為真,而(x=10) 為假,則輸出32,即是按照y=4*x來計算并輸出y值。 若輸入12,則(x=0)為真,而(x=10) 也為真,則輸出27,即是按照y=2*x+3來計算并輸出y值。 所以例4.7的程序,功能與例4.6相同。354.6 程序設(shè)計舉例例4.8 輸入三個數(shù)a,b,c,要求按由小到大的順序輸出。# include int main()float a,b,c,t; scanf(%f%f%f,&a,&b,&c); if(ab) t=a

19、; a=b; b=t; if(ac) t=a; a=c; c=t; if(bc) t=b; b=c; c=t; printf(%f %f %fn,a,b,c); return 0;364.6 程序設(shè)計舉例例4.9 輸入一個百分制成績,要求輸出一個用英文字母表示的等級制成績,大于或等于90分的為A等,小于90分但大于或等于80分的為B等,小于80分但大于或等于70分的為C等,小于70分但大于或等于60分的為D等,其余為E等。37程序清單:# include int main() float score; int grade; scanf(“%f”, &score); grade =(int)(s

20、core/10); switch(grade) case 0:case 1:case 2: case 3: case 4: case 5:printf(“E n”);break; case 6:printf(“Dn”);break; case 7:printf(“Cn”);break; case 8:printf(“Bn”);break; case 9: case 10:printf(“An”); return 0; 38第二種方法:上面的switch語句,可以用下面比較簡潔的形式替換: switch(grade) case 10: case 9: printf(“An”);break; ca

21、se 8: printf(“Bn”);break; case 7: printf(“Cn”);break; case 6: printf(“Dn”);break; default: printf(“E n”); 39例4.10求ax2+bx+c=0方程的解。對于ax2+bx+c=0方程(a不等于0),應(yīng)該有以下幾種可能:(1)b2-4ac=0, 有兩個相等實根。(2)b2-4ac0, 有兩個不相等實根。(3)b2-4ac0, 有兩個共軛復(fù)根。程序中將d=0(即b*b-4*a*c=0)用fabs(d)=1e-6代替,函數(shù)fabs(d)的值是d的絕對值。這是由于d是實型的,在計算和存儲時會有一些誤

22、差,如果直接使用“if (d=0)”進行判斷,可能由于誤差的存在,使本來應(yīng)該條件為“真”的情況出現(xiàn)偏差。因此用“if (fabs(d)=1e-6)”代替“if (d=0)”,1e-6是一個很小的正數(shù),如果(fabs(d)=1e-6)成立,就認為(d=0) 成立。 40程序清單#include #include int main( ) float a,b,c,d,x1,x2,p,q; scanf(%f%f%f,&a,&b,&c); d=b*b-4*a*c; if (fabs(d)1e-6) x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(有兩

23、個不相等的實根:%f 和 %fn, x1, x2); else p=-b/(2*a); q=sqrt(-d)/(2*a); printf(有兩個共軛復(fù)根n); printf(%8.4f+%8.4fin,p,q); printf(%8.4f-%8.4fin,p,q); return 0;41例4.11企業(yè)發(fā)放的獎金根據(jù)利潤i提成。利潤i100000時,獎金可提10%;當100000i=200000時,其中10萬元按10%提成,高于10萬元的部分,可提成7.5%;當200000 i=400000時,其中20萬元仍按上述辦法提成(下同),高于20萬元的部分按5%提成;當400000i=600000,

24、高于40萬元的部分按3%提成;當600000 i1000000時,高于100萬元的部分按1%提成。從鍵盤輸入當月利潤i,求應(yīng)發(fā)放獎金總數(shù)。42方法一:用if語句編程序# include int main() long i; float bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(Input I:); scanf(%ld,&i); if(i=100000) bonus=i*0.1; else if(i=200000) bonus=bon1+(i-100000)*0.075; else if(i=400000) bonus=bon2+(i-200000)*0.05; else if(i=600000) bonus=bon4+(i-400000)*0.03; else if

溫馨提示

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

評論

0/150

提交評論