版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 選擇結構程序設計選擇結構是三種基本結構之一,特點是:根據(jù)給定條件 :成立時執(zhí)行一組操作,不成立時執(zhí)行另一組操作。C中選擇結構利用if語句實現(xiàn)。5.1 關系運算符和關系表達式 關系運算是比較運算,判斷比較的結果是否符合給定的條件,結果為邏輯值“真”或“假”。(前已討論算術、賦值、逗號?,F(xiàn)討論關系、邏輯為條件和循環(huán)表達式為條件和循環(huán)語句所用)。5.1.1 關系運算符及其優(yōu)先級 關系運算符有6種:
2、 、 >= :優(yōu)先級為6級 = = 、!= :優(yōu)先級為7級 結合性為從左到右算符優(yōu)先級高,運算次序優(yōu)先,關系運算符和其它運算符優(yōu)先級的比較: 高 算術運算符:* 、/、%(3) +、- (4) 關系運算符:、 >=(6) == 、!=(7)
3、 邏輯運算符:! (2) && (11) || (12) 低 賦值運算符:=、 +=、 -=、 *=、 /=、 %=(14)由于存在優(yōu)先級,因此下面表達式是等價的:,,5.1.2關系表達式關系表達式:用關系運算符將兩個表達式(算術、關系、邏輯、賦值、字符)連接起來的式子。 如:a > b 、 a+b >
4、 b+ c 、 (a=3) > (b=5) ‘a(chǎn)’ b) > (c b 真 a > b = = c 真 b + c b d的為1 f = a > b > c f 值為0,5.2 邏輯運算符和邏輯表
5、達式邏輯表達式:用邏輯運算符將表達式連接起來的式子。4.2.1 邏輯運算符及其優(yōu)先次序在 c 語言中,邏輯運算符有: 1.邏輯與:&& 優(yōu)先級11 2.邏輯或:| | 優(yōu)先級12 3.邏輯非: ! 優(yōu)先級2,有如下邏輯表達式: a && b: 當 a, b 都為真時,結果為真,
6、否則結果為假 a | | b :當 a, b 都為假時,結果為假,否則結果為真 ! a : 當 a 為真時 , 結果為假,當a為假時,結果為 真。,在一個邏輯表達式中,若包含多個邏輯運算符時,則運算順序按運算符優(yōu)先級的高低進行。如:下面表達式是邏輯還是關系表達式?,5.2.2 邏輯表達式 在邏輯表達式中參加運算的數(shù)據(jù)可以是常量、變量、表達式。
7、例:T5-0-1.cmain( ){int a= -5,i,j,k,l,m; float b=0.01; i= !a;j=a && b; k= a | | b; l=(5 > 3 && 2 | | 8 ‘9’ ; printf (“i=%d,j=%d,k=%d, l=%d, m=%d\n”, i, j, k,l, m);},運行結果:i=0,j=1,k=1,l=1,m
8、=0,在邏輯表達式求解過程中,所有邏輯運算符并不一定都被執(zhí)行。只有在必須執(zhí)行下一個邏輯運算符才能求出表達式的解時,才執(zhí)行該運算符。1.邏輯與運算符: &&如有邏輯表達式:a && b && c執(zhí)行過程是:當a為0時,b和c不用再判斷了,邏輯與運算符將不再執(zhí)行,結果為0,否則還要繼續(xù)后邊的運算。,2.邏輯或運算符:| |如有邏輯表達式:a | | b | | c執(zhí)行過程
9、是:當a為非0時,b和c不用再判斷了,邏輯或運算符將不再執(zhí)行,其結果為1,否則繼續(xù)執(zhí)行后面的運算。,例:T5-0-2.cmain( ){int a, b=0, c=0, d=0;scanf(“%d”,&a);d=a && (b=5) && (c=3);printf (“a=%d, b=%d, c=%d, d=%d\n”, a, b, c, d);},例T5-0-3.cma
10、in( ){int a,b=0,c=0,d=0; scanf(“ %d”,&a); d=a | | (b=5) | | (c=3) ; printf (“a=%d, b=%d, c=%d, d=%d, \n”,a, b, c, d); },在C中,巧妙地使用邏輯表達式,可以表示一個復雜的問題如:關于閏年問題:符合下列條件之一,均為閏年。(1)能被4整除并且不能被100整除(2)能被4整除并且能被400整除其
11、邏輯表達式為:(year % 4 = =0 && year % 100 != 0) | | (year % 400 ==0 && year % 4 = = 0)由于能被400 整除的年份一定能被4 整除,所以可省去了后一部分,即:(year % 4 = =0 && year % 100 != 0) | | (year % 400 ==0 )若判斷非閏年,只在閏年表達
12、式前加 !即: !(year % 4 = = 0 && year % 100 != 0) | | ( year % 400 = = 0),,5.3 if 語句選擇結構中使用的一種語句。根據(jù)給定的條件判別是否滿足,以決定執(zhí)行哪種操作。5.3.1 if 語句的三種形式1.第一種形式的條件語句if (表達式) 語句 表達式可以是常量、變量、 各種表達式。其類型可以是整
13、、實、字符型。語句可以是一句或復合語句。,例T5-0-4.cmain( ){int x=0; float y=-5.6;if(x) printf (“x=%d\n”,x);if(y) printf (“y=%f\n”, y);if(‘0’) printf(“ ‘0’=%d\n”, ‘0’);if(x>y) printf (“x-y=%f\n”, x-y);if(y> -100) {x++;y++;
14、 printf(“x=%d, y=%f\n”, x, y); }},運行結果: y= -5.600000‘0’=48x- y=5.600000x=1, y=-4.600000,2. 第二種形式的條件語句if(表達式) 語句1 else 語句2例T5-0-5.cmain( ){ int x,y; printf (“please input x, y\n”);scanf (“%d %d”
15、,&x, &y);if(x>y) printf (“x=%d\n”,x);else printf (“y=%d\n”,y);}運行結果:please input x,y 2 _ 5? 輸出:y=5 34 _ 28 ?
16、 x=34,3. 第三種形式的條件語句 if(表達式1) 語句1 else if(表達式2) 語句2 else if(表達式3) 語句3 ┆ else if(表達式m) 語句m else 語句 n右圖為:m=4n=5,例: 商店售貨按購物的款數(shù)分別給予不同的優(yōu)惠折扣。
17、 設變量:n:購物金額, c:優(yōu)惠折扣百分比, a:優(yōu)惠后的實際款數(shù)T5-0-6.cmain( ){float n, c, a; scanf (“%f”, &n);if(n>500) c=0.15;else if(n>300) c=0.10;else if(n>100) c=0.075;else if(n>
18、50) c=0.05;else c=0;a=n* (1-c);printf (“a=%f\n”, a);},輸入: 輸出:800 680.000000480 432.000000200 185.00000080 76.0000
19、0030 30.000000,說明:1.執(zhí)行if語句時,先判斷表達式的值,為真時(非0),執(zhí)行其后語句,為假(0)時不執(zhí)行其后的語句,表達式可以是常量、變量、各種表達式。2.if的各內(nèi)嵌語句用“ ; ”號結束。3.if和else后面的內(nèi)嵌語句若有多句,用 { } 括起構成復合語句。例T5-1.c 輸入兩個實數(shù),按代數(shù)值由小到大輸出。main( ){float a, b, t;
20、scanf(“%f, %f”, &a, &b);if(a>b) {t=a; a=b; b=t; }printf (“%5.2f, %5.2f\n”,a,b); },輸入: 輸出:3.6,-3.2 ? -3.20, 3.602.5,8.9 ? 2.50, 8.90,例T5-2.c 輸入三個數(shù),按從小到大的順序輸出ma
21、in( ){ float a, b, c, t; scanf(“%f, %f, %f”,&a, &b, &c);if(a>b) {t=a; a=b; b=t;}if(a>c) {t=a; a=c; c=t;}if(b>c) {t=b; b=c; c=t;}printf (“%5.2f, %5.2f,%5.2f\n”, a, b, c);},t a
22、 b c 7 5 3 5 7 3 3 7 57 3 5 7,輸入: 輸出:7,5,3 3.00,5.00,7.001
23、,8,6 1.00,6.00,8.00,5.3.2 if 語句的嵌套嵌套:在if語句中,又包含1到多個if 語句一般形式: if( ) if( ) 語句1 else 語句2 else if( ) 語句3 else 語句4,總
24、體上是哪種形式?,,使用內(nèi)嵌的if語句時,應區(qū)分表面形式與實際對應關系如: if( ) if( ) 語句1 else if( ) 語句2 else 語句3編程者希望把中間的else與第一行的if匹配,雖然書寫上是對齊的,但編譯系統(tǒng)并非如此執(zhí)行。
25、,在C語言中,if與else 的配對原則是:從最內(nèi)層開始,else總是與它上面最近的,未曾配對的if配對。因此,上述問題在編譯時的真正效果是:if( ) 等價于下述表示: 當條件成立時執(zhí)行下面虛框中的內(nèi)容,總體上是哪種形式?,為了使程序清晰,不至出錯,采取的方法是:(1) 使內(nèi)嵌的if也包含else,如上面的問題可進行如下描述: if( ) if( ) …
26、 else … else if( ) … else ...,(2) 若if和else數(shù)目不等,為實現(xiàn)設計者的企圖,可用{ } 實現(xiàn),如上述問題可進行如下描述: if( ) { if( ) 語句1 } els
27、e {if( ) 語句2 else 語句3},如此一來,else不是和復合語句匹配而是與其前面的if匹配,總體上是哪種形式?,有一符號函數(shù) 例T5-3.cmain( ){int x, y; scanf(“%d”,&x); if(x<0) y= -1; else if(x==0)
28、 y=0; else y=1; printf(“x=%d, y=%d\n”,x,y); },輸入: -1234? 0 ? 756 ?輸出:x= -1234, y= -1 x=0, y=0 x=756, y=1,例T5-3-1.cmain( ){int x, y; sca
29、nf(“%d”,&x);if(x>=0) if(x>0) y=1; else y=0;else y=-1;printf(“x=%d, y=%d\n”,x, y);},輸入:12 ? -24 ? 0 ?輸出:x=12, y=1 x= -24, y= -1 x= 0,
30、y =0,例T5-3-2.cmain( ){int x, y; scanf(%d”,&x);y= -1;if(x !=0) if(x >0 ) y=1;else y=0; / *此else 和誰匹配 ?*/printf(“x=%d, y=%d\n”,x, y);},輸入: 輸出:-5 ? x= -5, y=0 0 ?
31、 x=0, y= -1 8 ? x=8, y=1,例T5-3-3.cmain( ){int x, y; scanf(%d”,&x);y= 0;if(x >=0) if(x >0 ) y=1;else y=-1; printf(“x=%d, y=%d\n”,x, y);},輸入: 輸出:-
32、5 ? x= -5, y=00 ? x=0, y=-18 ? x=8, y=1,5.3.3 條件運算符條件表達式的一般形式:表達式1 ? 表達式2 : 表達式3其中: ? : 是條件運算符號 在if語句中,給同一變量賦值時,可用語句: if(a > b) max=a; else
33、 max=b;上述問題用條件運算符和相應表達式實現(xiàn)如下: max= a > b ? a : b,條件表達式的執(zhí)行過程是: 說明:1.條件運算符的優(yōu)先級為13級 max=(a > b) ? a : b max= a > b ? a : b (=為14級) max=a > b ? a
34、 : (b+1) max=a>b ? a: b+1 (+為4級),2.條件運算符的結合方向:從右向左如有表達式: a > b ? a : c > d ? c : da,b,c,d的取值如下: 表達式值如下 : a b
35、 c d 1 2 3 4 45 8 6 2 63 2 20 30
36、 3,3. 若if語句內(nèi)嵌的是賦值語句,且兩分支給同一變量賦值時,才可用條件表達式代替 條件表達式的結果究競是給變量c還是x,是無法確定的,所以這種 if 語句不能用條件
37、算符組成的表達式代替。,例T5-3-4.cmain( ){int a,b;scanf(“%d%d”,&a,&b);a>b ? printf(“max=%x\n”,a) : printf(“max=%d\n”,b);}輸入:3 5輸出:max=5,4.表達式1,2,3類型可以相同,也可不同,不同時,低類型向高類型轉換例T5-3-5.cmain( ){int x=-1, y=5, z=6;
38、printf (“%c\n” , x ? ‘a(chǎn)’ : ‘b’ );printf (“%f\ n”, y<z ? 1 : 1. 5); },輸出:a 1.000000,例T5-4.c 輸入一字符,若是大寫字母,則將其轉換為小寫字母main( ){char ch; scanf (“%c”, &ch); ch=(ch>=‘A’ && ch
39、<= ‘Z’ ) ? (ch +32) : ch ;printf (“%c\ n”,ch); }‘A’的ASCII碼值是65 ‘Z’的ASCII碼值是90,輸入: A ? 輸出:a a ? a 1? 1,輸入其它字符輸出的是什么?,5.4
40、 switch 語句一種多分支選擇語句,可統(tǒng)計成績、工資等。一般形式: switch(表達式){ case 常量表達式1:語句1; case 常量表達式2:語句2; ┆ case 常量表達式n:語句n; default : 語句n+1 },說明:(1)switch(表
41、達式) :表達式的值可以是字符、整(ANSI新標準規(guī)定允許使用實型數(shù)據(jù),若是實型數(shù)據(jù),則將其轉換為整型數(shù)據(jù)。)(2)常量表達式必須是整型的或字符型數(shù)據(jù)(包括表達式常量)。(3)執(zhí)行過程:計算表達式的值,依次與case后的常量表達式比較: ①若有相等的值,從這點開始執(zhí)行;,②若無相等的值,則執(zhí)行default后面的語句,若無default, 則無任何操作。③每個常量表達式的值不能相等;④case出現(xiàn)的順序無關;⑤case中若
42、有break語句,則使控制流程跳出switch; 若無break,則順序執(zhí)行下一個case;⑥case后可有多個語句,不必加{ },系統(tǒng)順序執(zhí)行;⑦多個case可用一組執(zhí)行語句如: case ‘a(chǎn)’: case ‘b’: case ‘c’: printf (“ok”);,例T5-4-1.c 從鍵盤輸入不同等級,打印相應的分數(shù)段main( ){char n; sca
43、nf(“%c”, &n);switch(n) { case ‘a(chǎn)’ :printf (“85~100\n” ); break; case ‘b’ :printf (“70~84\n” ); break; case ‘c’ :printf (“60~69\n” ); break; case ‘d’ :printf (“<60\n” )
44、; break; default : printf (“input error!\n” ); }}問題的提出:(1)若無break語句,情況將如何; (2)case 順序顛倒是否可以? (3)case 后有多句,不加{ } 是否行?,輸入:a? c ? e ?輸
45、出:85~100 60~69 input error !,T5-4-2.cmain( ){double a; scanf(“%lf”,&a); switch(a) {case 1:printf(“abc\n”);break; case 2:printf(“123\n”);break; case 2+3:printf(“2+3\n”); defaul
46、t:printf(“other\n”); }},輸入: 輸出:1.23456 abc2.56789 1235 2+3456.789 other,5.5 程序舉例例T5-5 判某年是否是閏年main( )
47、{ int year, leap; scanf(“ %d”, &year);if(year % 4 ==0) {if(year % 100 ==0) {if(year % 400 ==0) leap=1; else leap=0; } else leap=1; } else le
48、ap=0;if(leap) printf(“%d is a leap year\ n”, year);else printf(“%d is not a leap year\ n” ,year);},輸入:1999? 2000 ? 1972 ? 輸出:1999 is not a leap y
49、ear 2000 is a leap year1972 is a leap year,,,例T5-6.c 求ax2+bx+c=0 方程的解幾種可能的情況: ① a=0:不是二次方程; ② b2 - 4ac=0 :有兩個相等的實根 ③ b2 - 4ac>0 :有兩個不等的實根 ④ b2 - 4ac< 0 :有兩個共軛復根,X1, 2=,T5-6.c
50、#inlude “math.h”main( ){float a, b, c, disc, x1, x2, re, im; scanf(“%f, %f, %f”,&a,&b,&c); printf (“The equation ”); if (fabs(a) 1e-6) {x1=(-b+sqrt(disk))/(2*a); x2=(-b-sqrt(disc))
51、/(2*a); printf(“has distinct real roots:%8.4f and %8.4f\ n”,x1,x2); } else {re=-b/(2*a); im=sqrt(- disk)/(2*a); printf(“has complex roots:\ n”); pri
52、ntf(“%8.4f + %8.4fi\ n”, re, im); printf(“%8.4f - %8.4fi\ n”, re, im); }loop:;},輸入:0, 2, 1? 1, 2, 1 ? 2, 6, 1 ? 1, 2, 2 ? 輸出:The equation is not quadraticThe equation has two equal root
53、s: - 1.0000The equation has distinct real roots: - 0.1771 and - 2 .8229The equation has complex roots:- 1. 0000 + 1 . 0000 i- 1 . 0000 - 1 . 0000 i,例T5-7.c 運輸費的計算 設: s: 距離 w: 貨物重量
54、 d: 折扣 p: 基本運費 f: 總運費 f=p*w*s*(1-d) s =3000 15%折扣,T5-7.cmain( ){ int c, s; float p, w, d, f; scanf(“%f,%f,%d”,&p, &w, &s);if(s> =
55、3000) c=12;else c=s/250;switch(c){case 0: d=0; break; case 1: d=2; break; case 2:case 3: d=5; break; case 4:case 5: case 6:case 7: d=8;break; case 8:case 9: case 10:case 11: d=10;break; case 12: d=
56、15;break;}f=p*w*s*(1-d/100.0);printf(“freight=%15.4f”, f);},C: 公里數(shù)/250, 以確定表達式的值s: 距離p: 基本運費w: 貨物重量d: 折扣總運費f : p*w*s*(1-d),輸入:100, 20, 300 輸出:freight=_ _ _588000.0000,,s<250km 沒有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論