第4章 選擇結(jié)構(gòu)程序設(shè)計-20121026修-HB_第1頁
第4章 選擇結(jié)構(gòu)程序設(shè)計-20121026修-HB_第2頁
第4章 選擇結(jié)構(gòu)程序設(shè)計-20121026修-HB_第3頁
第4章 選擇結(jié)構(gòu)程序設(shè)計-20121026修-HB_第4頁
第4章 選擇結(jié)構(gòu)程序設(shè)計-20121026修-HB_第5頁
已閱讀5頁,還剩90頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 選擇結(jié)構(gòu)程序設(shè)計4.1 選擇結(jié)構(gòu)和條件判斷4.2 用if語句實現(xiàn)選擇結(jié)構(gòu)4.3關(guān)系運算符和關(guān)系表達式4.4 邏輯運算符和邏輯表達式4.5 條件運算符和條件表達式4.6 選擇結(jié)構(gòu)的嵌套4.7 用switch語句實現(xiàn)多分支選擇結(jié)構(gòu)4.8選擇結(jié)構(gòu)程序綜合舉例4.1 選擇結(jié)構(gòu)和條件判斷在現(xiàn)實生活中,需要進行判斷和選擇的情況是很多的如果你在家,我去拜訪你如果考試不及格,要補考如果遇到紅燈,要停車等待周末我們?nèi)ソ加?0歲以上的老年人,入公園免票4.1 選擇結(jié)構(gòu)和條件判斷在現(xiàn)實生活中,需要進行判斷和選擇的情況是很多的處理這些問題,關(guān)鍵在于進行條件判斷由于程序處理問題的需要,在大多數(shù)程序中都會包含選擇

2、結(jié)構(gòu),需要在進行下一個操作之前先進行條件判斷4.1 選擇結(jié)構(gòu)和條件判斷C語言有兩種選擇語句:(1)if語句,實現(xiàn)兩個分支的選擇結(jié)構(gòu)(2)switch語句,實現(xiàn)多分支的選擇結(jié)構(gòu)4.1 選擇結(jié)構(gòu)和條件判斷 例4.1 在例3.5的基礎(chǔ)上對程序進行改進。題目要求是求 方程的根。 由鍵盤輸入a,b,c。假設(shè)a,b,c的值任意,并不保證 。需要在程序中進行判別,如果 ,就計算并輸出方程的兩個實根,否則就輸出“方程無實根”的信息。 解題思路:輸入a,b,c計算discdisc0計算x1,x2輸出無實根輸出x1,x2真假#include #include int main ( ) double a,b,c,d

3、isc,x1,x2,p,q; scanf(%lf%lf%lf,&a,&b,&c); disc=b*b-4*a*c;計算b2-4ac,disc的值變?yōu)?15 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;-150為真#include #include int main ( ) double a,b,c,disc,x1,x2,p,q;

4、 scanf(%lf%lf%lf,&a,&b,&c); disc=b*b-4*a*c;計算b2-4ac,disc的值變?yōu)? if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;80為假p的值變?yōu)?1q的值變?yōu)?.71x1的值變?yōu)?0.29x2的值變?yōu)?1.71 if (disc0) printf(“has not real rootsn

5、”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;選擇結(jié)構(gòu),用if語句實現(xiàn)的 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;復合語句4.2.1

6、用if語句處理選擇結(jié)構(gòu)舉例 例4.2 輸入兩個實數(shù),按代數(shù)值由小到大的順序輸出這兩個數(shù)。解題思路:只需要做一次比較,然后進行一次交換即可用if語句實現(xiàn)條件判斷關(guān)鍵是怎樣實現(xiàn)兩個變量值的互換AB互換前AB互換后4.2.1 用if語句處理選擇結(jié)構(gòu)舉例ABC4.2.1 用if語句處理選擇結(jié)構(gòu)舉例ABC4.2.1 用if語句處理選擇結(jié)構(gòu)舉例ABC4.2.1 用if語句處理選擇結(jié)構(gòu)舉例#include int main() float a,b,t; scanf(%f,%f,&a,&b); if(ab) t=a; a=b; b=t; printf(%5.2f,%5.2fn,a,b); return 0;將

7、a和b的值互換如果ab#include int main() float a,b,t; scanf(%f,%f,&a,&b); if(ab) t=a; a=b; b=t; printf(%5.2f,%5.2fn,a,b); return 0;選擇結(jié)構(gòu),用if語句實現(xiàn)的 例4.3 輸入3個數(shù)a,b,c,要求按由小到大的順序輸出。解題思路:可以先用偽代碼寫出算法:if ab,a和b對換 (a是a、b中的小者)if ac,a和c對換 (a是三者中最小者)if bc,b和c對換 (b是三者中次小者)順序輸出a,b,c#include int main() float a,b,c,t; scanf(%f

8、,%f,%f,&a,&b,&c); if(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; if(bc) t=b; b=c; c=t; printf(%5.2f,%5.2f,%5.2fn,a,b,c); return 0;如果 ab,將a和b對換a是a、b中的小者#include int main() float a,b,c,t; scanf(%f,%f,%f,&a,&b,&c); if(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; if(bc) t=b; b=c; c=t; printf(%5.2f,%5.2f,%5.2fn

9、,a,b,c); return 0;如果 ac,將a和c對換a是三者中的小者#include int main() float a,b,c,t; scanf(%f,%f,%f,&a,&b,&c); if(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; if(bc) t=b; b=c; c=t; printf(%5.2f,%5.2f,%5.2fn,a,b,c); return 0;如果 bc,將b和c對換b是三者中的次小者4.2.2 if語句的一般形式 if (表達式) 語句1 else 語句2 關(guān)系表達式邏輯表達式數(shù)值表達式方括號內(nèi)的部分為可選的4.2.2 i

10、f語句的一般形式 if (表達式) 語句1 else 語句2 簡單的語句復合語句另一個if語句等最常用的3種if語句形式:1. if (表達式) 語句1 (沒有else子句)2. if (表達式) 語句1 else 語句2 (有else子句)3. if(表達式) 語句 else if(表達式) 語句 else if(表達式) 語句 else if(表達式) 語句 else 語句m+1 (在else部分又嵌套了多層的if語句)if(number 500) cost = 0.15;else if (number 300) cost = 0.10;else if (number 100) cost

11、= 0.075;else if (number 50) cost = 0.05;else cost=0;if (number 500) cost = 0.15;else if (number 300) cost = 0.10; else if (number 100) cost = 0.075; else if (number 50) cost = 0.05; else cost = 0;等價于分號不能丟說明:(1)整個if語句可寫在多行上,也可寫在一行上 但都是一個整體,屬于同一個語句(2)“語句1”“語句m”是if中的內(nèi)嵌語句 內(nèi)嵌語句也可以是一個if語句(3)“語句1”“語句m”可以是簡

12、單的語句,也可以是復合語句4.3關(guān)系運算符和關(guān)系表達式4.3.1關(guān)系運算符及其優(yōu)先次序4.3.2 關(guān)系表達式4.3.1關(guān)系運算符及其優(yōu)先次序關(guān)系運算符:用來對兩個數(shù)值進行比較的比較運算符語言提供種關(guān)系運算符: (小于) = (小于或等于) (大于) = (大于或等于) = (等于) != (不等于) 優(yōu)先級相同 (高)優(yōu)先級相同 (低)4.3.1關(guān)系運算符及其優(yōu)先次序關(guān)系、算術(shù)、賦值運算符的優(yōu)先級算術(shù)運算符 (高)賦值運算符 (低)關(guān)系運算符 4.3.1關(guān)系運算符及其優(yōu)先次序ca+b 等效于 c(a+b)ab=c 等效于 (ab)=ca=bc 等效于 a=(bc 等效于 a=(bc)4.3.2

13、 關(guān)系表達式關(guān)系表達式用關(guān)系運算符將兩個數(shù)值或數(shù)值表達式連接起來的式子關(guān)系表達式的值是一個邏輯值,即“真”或“假”在C的邏輯運算中,以“”代表“真”,以“”代表“假”4.4 邏輯運算符和邏輯表達式4.4.1 邏輯運算符及其優(yōu)先次序4.4.2 邏輯表達式4.4.3 邏輯型變量4.4.1 邏輯運算符及其優(yōu)先次序3種邏輯運算符:&(邏輯與) |(邏輯或) !(邏輯非)&和|是雙目(元)運算符!是一目(元)運算符邏輯表達式用邏輯運算符將關(guān)系表達式或其他邏輯量連接起來的式子4.4.1 邏輯運算符及其優(yōu)先次序判斷年齡在13至17歲之內(nèi)?age=13 & age=17判斷年齡小于12或大于65?age654

14、.4.1 邏輯運算符及其優(yōu)先次序ab! a! ba & ba | b 真真假假真真真假假真假真假真真假假真假假真真假假邏輯運算的真值表4.4.1 邏輯運算符及其優(yōu)先次序邏輯運算符的優(yōu)先次序! & | (!為三者中最高)與其他運算符的優(yōu)先次序 ! (高)算術(shù)運算符關(guān)系運算符 & 和 |賦值運算符 (低)4.4.2 邏輯表達式邏輯表達式的值應(yīng)該是邏輯量“真”或“假”編譯系統(tǒng)在表示邏輯運算結(jié)果時以數(shù)值1代表“真”,以0代表“假”但在判斷一個量是否為“真”時以0代表“假”,以非0代表“真”注意:將一個非零的數(shù)值認作為“真”4.4.2 邏輯表達式(1) 若a=4,則!a的值為0(2) 若a=4,b=5,

15、則a & b的值為1(3) a和b值分別為4和5,則a|b的值為1(4) a和b值分別為4和5,則!a|b的值為1(5) 4 & 0 | 2的值為14.4.2 邏輯表達式修改后的邏輯運算真值表ab! a! ba & ba | b 非0非00011非000101假非01001假011004.4.2 邏輯表達式判別某一年是否閏年,用邏輯表達式表示閏年的條件是符合下面二者之一:能被4整除,但不能被100整除,如2008能被400整除,如2000(year % 4 = 0 & year 100 !=0) | year % 400 = 0如果表達式值為1,則閏年;否則為非閏年4.4.3 邏輯型變量這是C

16、99所增加的一種數(shù)據(jù)類型可以將關(guān)系運算和邏輯運算的結(jié)果存到一個邏輯型變量中,以便于分析和運算4.5 條件運算符和條件表達式有一種if語句,當被判別的表達式的值為“真”或“假” 時,都執(zhí)行一個賦值語句且向同一個變量賦值如:if (ab) max=a; else max=b;max = (a b) ? a : b;條件運算符4.5 條件運算符和條件表達式有一種if語句,當被判別的表達式的值為“真”或“假” 時,都執(zhí)行一個賦值語句且向同一個變量賦值如:if (ab) max=a; else max=b;max = (a b) ? a : b;條件表達式4.5 條件運算符和條件表達式條件表達式的一般形

17、式為表達式?表達式: 表達式4.5 條件運算符和條件表達式條件運算符的執(zhí)行順序:求解表達式1若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件表達式的值4.5 條件運算符和條件表達式 例4.4 輸入一個字符,判別它是否大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。4.5 條件運算符和條件表達式解題思路:用條件表達式來處理,當字母是大寫時,轉(zhuǎn)換成小寫字母,否則不轉(zhuǎn)換4.5 條件運算符和條件表達式#include int main() char ch; scanf(%c,&ch)

18、; ch=(ch=A & ch=Z)?(ch+32):ch; printf(%cn,ch); return 0;4.6 選擇結(jié)構(gòu)的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套一般形式:if( ) if( ) 語句1 else 語句2 else if( ) 語句3 else 語句4 內(nèi)嵌ifelse總是與它上面最近的未配對的if配對4.6 選擇結(jié)構(gòu)的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套if () if () 語句1 else語句2內(nèi)嵌if 限定了內(nèi)嵌if范圍4.6 選擇結(jié)構(gòu)的嵌套 例4.5有一函數(shù): 編一程序,輸入一個x值,要求輸出相應(yīng)的y值。4.6 選擇結(jié)構(gòu)

19、的嵌套解題思路:用if語句檢查x的值,根據(jù)x的值決定賦予y的值由于y的可能值不是兩個而是三個,因此不可能只用一個簡單的(無內(nèi)嵌if)的if語句來實現(xiàn)4.6 選擇結(jié)構(gòu)的嵌套解題思路:方法1(1) 先后用3個獨立的if語句處理:輸入x若 x 0, 則y = 1輸出x和yscanf(%d,&x);if(x0) y = 1;printf(x=%d,y=%dn,x,y);4.6 選擇結(jié)構(gòu)的嵌套解題思路:方法2(2) 用一個嵌套的if語句處理:輸入x若x 0, 則y = -1 否則 若 x = 0, 則y = 0 否則 y = 1輸出x和yscanf(%d,&x);if(x0) y=-1;else if(

20、x=0) y=0; else y=1;printf(x=%d,y=%dn,x,y);4.6 選擇結(jié)構(gòu)的嵌套解題思路:方法2(2) 用一個嵌套的if語句處理:輸入x若x 0, 則y = -1 否則 若 x = 0, 則y = 0 否則 y = 1輸出x和yscanf(%d,&x);if(x=0) if (x0) y=1; else y=0;else y=-1;printf(x=%d,y=%dn,x,y);提倡內(nèi)嵌if放在else中 程序3: y=-1; if(x!=0) if(x0) y=1; else y=0; 4.7 用switch語句實現(xiàn)多分支選擇結(jié)構(gòu)switch語句用來實現(xiàn)多分支選擇結(jié)構(gòu)

21、學生成績分類85分以上為A等7084分為B等6069分為C等人口統(tǒng)計分類 按年齡分為老、中、青、少、兒童4.7 用switch語句實現(xiàn)多分支選擇結(jié)構(gòu) 例4.6 要求按照考試成績的等級輸出百分制分數(shù)段,A等為85分以上,B等為7084分,C等為6069分 ,D等為 60分以下 。成績的等級由鍵盤輸入。4.7 用switch語句實現(xiàn)多分支選擇結(jié)構(gòu)解題思路:判斷出這是一個多分支選擇問題根據(jù)百分制分數(shù)將學生成績分為4個等級如果用if語句,至少要用3層嵌套的if,進行3次檢查判斷用switch語句進行一次檢查即可得到結(jié)果#include int main() char grade; scanf(%c,&

22、grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 值為A#include int main() char grade; scanf(%c,&grade); printf(Your score:); switch(grade) case A:

23、 printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 不能少#include int main() char grade; scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break

24、; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 值為C#include int main() char grade; scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n)

25、;break; default: printf(enter data error!n); return 0; 值為Fswitch語句的作用是根據(jù)表達式的值,使流程跳轉(zhuǎn)到不同的語句switch語句的一般形式:switch(表達式) case 常量1 :語句1 case 常量2 :語句2 case 常量n :語句n default : 語句n+1整數(shù)類型(包括字符型)switch語句的作用是根據(jù)表達式的值,使流程跳轉(zhuǎn)到不同的語句switch語句的一般形式:switch(表達式) case 常量1 :語句1 case 常量2 :語句2 case 常量n :語句n default : 語句n+1不能相

26、同 scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); scanf(%c,&grade); printf(Your score:); switch(grade) case A: printf(85100n);break; case B: pr

27、intf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); scanf(%c,&grade); printf(Your score:); switch(grade) case A: case B: case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); 例4.7 編寫程序,用switch語句處理菜單命令。

28、解題思路:在許多應(yīng)用程序中,用菜單對流程進行控制,例如從鍵盤輸入一個A或a字符,就會執(zhí)行A操作,輸入一個B或b字符,就會執(zhí)行B操作,等等。#include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case A: action1(a,b);break; case b: case B: action2(a,b);break; default: putchar(a); return 0;輸入a或A調(diào)用action1函數(shù),執(zhí)行A

29、操作void action1(int x,int y) printf(x+y=%dn,x+y);#include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case A: action1(a,b);break; case b: case B: action2(a,b);break; default: putchar(a); return 0;輸入b或B調(diào)用action2函數(shù),執(zhí)行B操作void action2(int x,

30、int y) printf(x*y=%dn,x*y);#include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case A: action1(a,b);break; case b: case B: action2(a,b);break; default: putchar(a); return 0;輸入其他字符發(fā)出警告這是一個非常簡單的示意程序?qū)嶋H應(yīng)用中,所指定的操作可能比較復雜: A:輸入全班學生各門課的成績B:計算并

31、輸出每個學生各門課的平均成績C:計算并輸出各門課的全班平均成績D:對全班學生的平均成績由高到低排序并輸出可以按以上思路編寫程序,把各action函數(shù)設(shè)計成不同的功能以實現(xiàn)各要求4.8選擇結(jié)構(gòu)程序綜合舉例例4.8 寫一程序,判斷某一年是否閏年。解題思路:在前面已介紹過判別閏年的方法本例用不同的方法編寫程序4.8選擇結(jié)構(gòu)程序綜合舉例用變量leap代表是否閏年的信息。若閏年,令leap=1;非閏年,leap=0。最后判斷l(xiāng)eap是否為(真),若是,則輸出“閏年”信息參見教材圖4.13#include int main()int year,leap; printf(enter year:); scan

32、f(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;標志變量與if (leap!=0)含義相同#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4

33、=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;采取鋸齒形式#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if (year%4=0) if(year%100=0) if(year%400=0) leap

34、=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;if(year%4!=0) leap=0;else if (year%100!=0) leap=1;else if(year%400!=0) leap=0;else leap=1;#include int main()int year,leap; printf(enter year:); scanf(%d,&year); if

35、 (year%4=0) if(year%100=0) if(year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(%d is ,year); else printf(%d is not ,year); printf(a leap year.n); return 0;if(year%4=0 & year%100!=0) | (year%400=0) leap=1;else leap=0; 例4.9 求 方程的解。解題思路:處理以下各情況 ,不是二次方程 ,有兩個相等實根 ,有兩個不等實根。 ,有兩個

36、共軛復根。 應(yīng)當以p+qi和p-qi的形式輸出復根 其中,p=-b/2a,q=( )/2a參見教材圖4.14#include #include int main() double a,b,c,disc,x1,x2,realpart, imagpart; scanf(%lf,%lf,%lf,&a,&b,&c); printf(The equation ); if(fabs(a)=1e-6) printf(is not a quadraticn);實型不能用if (a=0) else disc=b*b-4*a*c; if(fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(has distinct real roots:%8.4f and %8.4fn,x1,x2); else realpart=-b/(2*a); imagpart=sqrt(-disc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論