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

下載本文檔

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

文檔簡介

第4章

選擇結(jié)構(gòu)程序設(shè)計(jì)4.1if語句4.2switch語句4.3選擇結(jié)構(gòu)程序設(shè)計(jì)舉例本章學(xué)習(xí)目標(biāo)熟悉if語句的格式及應(yīng)用的幾種形式掌握if語句嵌套應(yīng)用的方法掌握條件運(yùn)算符的應(yīng)用掌握switch語句的格式及應(yīng)用掌握選擇結(jié)構(gòu)程序的設(shè)計(jì)方法4.1if語句if語句又叫條件語句,它是通過判別條件是否成立,來決定程序的流程〔在可能執(zhí)行的兩個(gè)流程中選擇執(zhí)行其中的一個(gè)〕。1.if語句的一般格式if(表達(dá)式){語句組1}[else{語句組2}]如:if(a>=b)printf(“%d”,a);elseprintf(“%d”,b);2.if語句的三種形式形式一:〔缺省else子句時(shí)〕格式:if〔表達(dá)式〕語句當(dāng)“表達(dá)式”的值不等于0〔即判定為“邏輯真”〕時(shí),那么執(zhí)行語句,否那么直接轉(zhuǎn)向執(zhí)行下一條。如圖4-1所示。例如:if(x>y)printf("max=%d",x);真(非0)表達(dá)式語句假(0)圖4-1if語句的流程圖形式二:〔指定else子句時(shí)〕格式:if〔表達(dá)式〕語句1else語句2當(dāng)“表達(dá)式”的值不等于0〔即判定為“邏輯真”〕時(shí),那么執(zhí)行語句組1,然后轉(zhuǎn)向下一條語句;否那么,執(zhí)行語句組2。如圖4-2所示。例如:if(x>y)printf("max=%d",x);elseprintf("max=%d",y);真(非0)表達(dá)式語句1假(0)語句2圖4-2if~else語句的流程圖形式三:〔if語句嵌套〕格式:if〔表達(dá)式1〕語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3.....elseif(表達(dá)式m)語句melse語句n語句1語句2語句3語句m語句n…真表達(dá)式1表達(dá)式2表達(dá)式3表達(dá)式m真真真假假假假圖4-3if~else語句嵌套的流程圖例如:if(number>500)const=0.15;elseif(number>300)const=0.10;elseif(number>100)const=0.075;elseif(number>50)const=0.05;elseconst=0;說明:〔1〕if(表達(dá)式)中的“表達(dá)式”一般為邏輯表達(dá)式或關(guān)系表達(dá)式,如:if(a==b&&x==y)printf("a=b,x=y");也允許是其它類型的數(shù)據(jù),如整型、實(shí)型、字符型等。如:if(3)printf("O.K.");if(3.5)printf("%f",3.5);if('a')printf("%d",'a');〔2〕“語句組1””和“語句組2”,可以只包含一個(gè)簡單語句,也可以是復(fù)合語句。復(fù)合語句須在其第一個(gè)語句前用左花括號(hào)“{”開頭,最后一個(gè)語句后以右花括號(hào)“}”結(jié)尾,如:if(a+b>c&&b+c>a&&c+a>b){s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf("area=%8.2f",area);}elseprintf("所輸入的三邊長不能構(gòu)成三角形");

【例4-1】輸入任意三個(gè)整數(shù),求三個(gè)數(shù)中的最大值?!舅悸穼?dǎo)航】定義三個(gè)變量num1、num2、num3,分別表示從鍵盤輸入的任意三個(gè)數(shù),再定義變量max表示三個(gè)數(shù)中的最大值。首先取一個(gè)數(shù)預(yù)置為max〔最大值〕,然后再用max依次與其余的數(shù)逐個(gè)比較,如果發(fā)現(xiàn)有比max大的,就用它給max重新賦值,比較完所有的數(shù)后,max中的數(shù)就是最大值。對(duì)從3個(gè)或3個(gè)以上的數(shù)中找最大值的處理,上述方法是非常好用的。程序如下:單擊此處

/*exam4_1*/intmain(void)

{ intnum1,num2,num3,max; printf("Pleaseinputthreenumbers:");

scanf("%d,%d,%d",&num1,&num2,&num3);

max=num1; if(num2>max)max=num2; if(num3>max)max=num3;

printf("Thethreenumbersare:%d,%d,%d\n",num1,num2,num3);

printf("max=%d\n",max); return0;}[演示]屏幕顯示運(yùn)行結(jié)果為:Pleaseinputthreenumbers:35,100,85↙Thethreenumbersare:35,100,85max=100【例4-2】輸入任意三個(gè)數(shù)num1、num2、num3,按從小到大的順序排序輸出?!舅悸穼?dǎo)航】編程思路與例4-2根本上相同。不同的是:由于本例題要求將所輸入的三個(gè)數(shù)按從小到大的順序排序輸出,故在比較大小時(shí)要注意小數(shù)排在前,大數(shù)排在后,位置不符時(shí)要交換兩數(shù)的位置。程序如下:/*exam4_2*/intmain(void){ intnum1,num2,num3,temp; printf("Pleaseinputthreenumbers:"); scanf("%d,%d,%d",&num1,&num2,&num3); if(num1>num2){temp=num1;num1=num2;num2=temp;} if(num2>num3){temp=num2;num2=num3;num3=temp;} if(num1>num2){temp=num1;num1=num2;num2=temp;} printf("Threenumbersaftersorted:%d,%d,%d\n",num1,num2,num3); return0;}屏幕顯示運(yùn)行結(jié)果為:Pleaseinputthreenumbers:35,100,85↙Threenumbersaftersorted:35,85,1003.if語句的嵌套if語句允許嵌套。〔1〕if語句的嵌套形式所謂if語句的嵌套是指:if語句中包含另一個(gè)if語句,即:在“語句組1”或〔和〕“語句組2”中,又包含有if語句的情況。if語句的嵌套的一般形式:if(表達(dá)式1)if(表達(dá)式2)語句組1/*內(nèi)嵌if語句*/else語句組2elseif(表達(dá)式3)語句組3/*內(nèi)嵌if語句*/else語句組4〔2〕if語句的嵌套與嵌套匹配原那么if語句嵌套時(shí),從最內(nèi)層開始,else總是與它上面距它最近、且尚未匹配的if配對(duì)。為明確匹配關(guān)系,防止if與else配對(duì)錯(cuò)位的最正確方法是將內(nèi)嵌的if語句,一律用花括號(hào)括起來。為了便于閱讀,使用適當(dāng)?shù)目s進(jìn),此時(shí)大括號(hào)能保證if和else不錯(cuò)位配對(duì),而且適當(dāng)?shù)目s進(jìn)便于閱讀程序。例如以下兩組循環(huán)的嵌套因參加大括號(hào)后,所表示的含義不同。if() if()if()語句1 {if()語句1}else else

語句2 語句2加{}改變配對(duì)關(guān)系:

【例4-3】

有一函數(shù)如下,編程實(shí)現(xiàn):輸入一個(gè)x值,即可輸出y值。

下面以if語句嵌套的不同的方法來編寫程序。方法一:/*exam431*/intmain(void){ intx,y; scanf("%d",&x); if(x<0)y=-1; elseif(x==0)y=0; elsey=1; printf("x=%d,y=%d\n",x,y); return0;}屏幕顯示運(yùn)行結(jié)果為:35↙x=35,y=1方法二:/*exam432*/intmain(void){ intx,y; scanf("%d",&x); if(x>=0) if(x>0)y=1; elsey=0; elsey=-1; printf("x=%d,y=%d\n",x,y); return0;}屏幕顯示運(yùn)行結(jié)果為:-35↙x=-35,y=-1

35↙x=35,y=-1

0↙x=0,y=0

方法三:/*exam433*/intmain(void){intx,y;scanf("%d",&x);y=-1;if(x>=0)if(x>0)y=1;elsey=0;printf("x=%d,y=%d\n",x,y);return0;}方法四:/*exam434*/intmain(void){intx,y;scanf("%d",&x);y=0;if(x!=0)if(x>0)y=1;elsey=-1;printf("x=%d,y=%d\n",x,y);return0;}4.條件運(yùn)算符——"?"運(yùn)算符在if語句中,當(dāng)“表達(dá)式”的值為“真”和“假”時(shí),都只執(zhí)行一個(gè)賦值語句給同一個(gè)變量賦值,例如:if(a>b)max=a;elsemax=b;那么可以用條件運(yùn)算符構(gòu)成一個(gè)條件表達(dá)式來處理,如下所示:max=(a>b)?a:b;其中,“(a>b)?a:b”是一個(gè)條件表達(dá)式,其含義是:假設(shè)條件〔a>b〕成立,那么條件表達(dá)式取值a;否那么,取值b?!?〕條件表達(dá)式的一般格式:表達(dá)式1?表達(dá)式2:表達(dá)式3例如:intmain(void){ intx,y; x=80; y=x>70?100:0; printf("y=%d",y); return0;}※注意:條件運(yùn)算符要求有三個(gè)操作對(duì)象,稱為“三目運(yùn)算符”〔它是C語言中唯一的一個(gè)三目運(yùn)算符〕。條件表達(dá)式中的“表達(dá)式1”、“表達(dá)式2”、“表達(dá)式3”缺一不可,其類型可以各不相同。屏幕顯示運(yùn)行結(jié)果為:y=100

〔2〕條件表達(dá)式的運(yùn)算規(guī)那么如果“表達(dá)式1”的值為非0(即邏輯真),那么運(yùn)算結(jié)果等于“表達(dá)式2”的值;否那么,運(yùn)算結(jié)果等于“表達(dá)式3”的值。條件表達(dá)式的流程圖如圖4-4所示。真(非0)表達(dá)式1條件表達(dá)式取表達(dá)式2的值假(0)條件表達(dá)式取表達(dá)式3的值圖4-4條件表達(dá)式的流程圖②條件運(yùn)算符的結(jié)合方向條件運(yùn)算符的結(jié)合方向?yàn)椤皬挠业阶蟆薄布从医Y(jié)合性〕。如:a>b?a:c>d?c:d等介于:(a>b)?a:(c>d?c:d)③if語句一般都可以用條件表達(dá)式代替。如:if(a>b)printf("%d",a);elseprintf("%d",b);等介于:(a>b)?printf("%d",a):printf("%d",b);或:

printf("%d",a>b?a:b);①條件運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符,但低于算術(shù)運(yùn)算符和關(guān)系運(yùn)算符。如:max=(a>b)?a:b;等介于:max=a>b?a:b;a>b?a:b+1等介于:(a>b)?a:(b+1)〔3〕說明:【例4-4】從鍵盤上輸入一個(gè)字符,判別它是否為大寫字母,如果是,那么把它轉(zhuǎn)換成小寫字母輸出;否那么不轉(zhuǎn)換,直接輸出?!舅悸穼?dǎo)航】字符在計(jì)算機(jī)內(nèi)是用ASCII表示,大寫字母的ASCII值正好比相應(yīng)的小寫字母小32,因此,假設(shè)能判斷出所輸入的字符為大寫字母,那么將該字符的ASCII值加上32后,即轉(zhuǎn)換為相應(yīng)的小寫字母。判斷字符ch是否為大寫字母的條件是:ch>='A'&&ch<='Z'為真。/*exam4_4*/intmain(void){ charch; printf("Inputacharacter:"); scanf("%c",&ch);

ch=(ch>='A'&&ch<='Z')?(ch+32):ch; printf("ch=%c\n",ch); return0;}屏幕顯示運(yùn)行結(jié)果為:Inputacharacter:D↙ch=d

4.2switch語句1.switch語句的一般格式:switch(表達(dá)式){case常量表達(dá)式1:語句(組)1;break;

case常量表達(dá)式2:語句(組)2;break;

......case常量表達(dá)式n:語句(組)n;break;

[default:語句(組)n+1;[break;]] }C語言提供了switch語句直接處理多個(gè)分支的選擇結(jié)構(gòu)。例如:switch(ch){ case'A':printf("85~100\n");break;

case'B':printf("70~84\n");break;

case'C':printf("60~69\n");break;

case'D':printf("<60\n");break;

default:printf("error\n");}其他'D''B''A'ch輸出“85~100”輸出“70~84”輸出“60~69”switch的下一條語句輸出“<60”輸出“error”'C'圖4-52.switch語句的功能包括以下兩方面?!?〕當(dāng)switch后面“表達(dá)式”的值,與某個(gè)case后面的“常量表達(dá)式”的值相同時(shí),就執(zhí)行該case后面的語句〔組〕;當(dāng)執(zhí)行到break語句時(shí),那么跳出switch語句,轉(zhuǎn)向執(zhí)行switch語句的下一條?!?〕如果沒有任何一個(gè)case后面的“常量表達(dá)式”的值與switch后面“表達(dá)式”的值相同,那么執(zhí)行default后面的語句〔組〕。然后,跳出switch語句,執(zhí)行switch語句的下一條。3.說明:〔1〕switch后面的“表達(dá)式”和case后面的“常量表達(dá)式”可以是整型、字符型和枚舉型中的任意一種,程序執(zhí)行時(shí)將自動(dòng)計(jì)算其值?!?〕為了防止程序執(zhí)行時(shí)出現(xiàn)自相矛盾的現(xiàn)象,對(duì)switch后面的“表達(dá)式”的值只能有一種執(zhí)行方案,因此,每個(gè)case后面“常量表達(dá)式”的值,必須各不相同?!?〕case后的語句中break語句不能缺。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)判斷,所以在每個(gè)case的語句〔組〕后面必須加上break語句,以便結(jié)束switch語句。

想一想想一想:假設(shè)switch后面的“表達(dá)式”的值為B,那么下面這段程序輸出的結(jié)果是什么?為什么?switch(ch){ case'A':printf("85~100\n"); case'B':printf("70~84\n"); case'C':printf("60~69\n"); case'D':printf("<60\n"); default:printf("error\n");}結(jié)果是70~8460~69<60error[演示]〔4〕當(dāng)每一個(gè)case語句后均有break語句時(shí),各case出現(xiàn)的先后次序不影響執(zhí)行結(jié)果。Default語句總是放在所有的case語句后面,它后面不需要寫break語句。〔5〕多個(gè)case子句,可共用同一語句〔組〕。如:switch(ch){case'A':case'B':case'C':printf(">60\n");break;}在變量ch的值為A、B、C三種情況下,均執(zhí)行相同的語句組“printf(">60\n");break;”?!?〕用switch語句實(shí)現(xiàn)的多分支結(jié)構(gòu)程序,完全可以用if語句或if語句的嵌套來實(shí)現(xiàn)?!纠?-5】從鍵盤上輸入一個(gè)百分制成績score,按以下原那么輸出其等級(jí):score≥90,等級(jí)為A;80≤score<90,等級(jí)為B;70≤score<80,等級(jí)為C;60≤score<70,等級(jí)為D;score<60,等級(jí)為E。/*exam4-5*/intmain(void){ intscore,grade; printf(“Inputascore(0~100):”); scanf(“%d”,&score); grade=score/10;

switch(grade) { case10: case9:printf(“grade=A\n”);break; case8:printf("grade=B\n");break; case7:printf("grade=C\n");break; case6:printf("grade=D\n");break; case5: case4: case3: case2: case1: case0:printf(“grade=E\n”);break; default:printf(“Thescoreisoutofrange!\n”); }

return0;}屏幕顯示運(yùn)行結(jié)果為:Inputascore(0~100):95↙grade=A4.3選擇結(jié)構(gòu)程序設(shè)計(jì)舉例【例4-6】求任一元二次方程ax2+bx+c=0的解?!瞐、b、c為方程的系數(shù),其中a≠0〕【思路導(dǎo)航】求解一元二次方程的根有以下幾種可能性:①

當(dāng)a=0時(shí),不能構(gòu)成一元二次方程。②

當(dāng)b2-4ac=0時(shí),一元二次方程有兩個(gè)相等的實(shí)根。③

當(dāng)b2-4ac>0時(shí),一元二次方程有兩個(gè)不等的實(shí)根。④

當(dāng)b2-4ac<0時(shí),一元二次方程有兩個(gè)共軛復(fù)根。為了編程方便,設(shè)變量disc表示一元二次方程判別式b2-4ac,由于實(shí)數(shù)在計(jì)算機(jī)中運(yùn)算和存儲(chǔ)時(shí),不可防止地有會(huì)有一些微小誤差,因此在判別disc〔為實(shí)數(shù)〕是否為零時(shí),不能直接與零比較,正確的方法是判斷其絕對(duì)值小于一個(gè)很小的常數(shù),如采用方法:if(fabs(disc)<=1E-6),而不是:if(disc==0.0)。N-S流程圖如圖4-7所示:圖4-7/*exam4_6*/#include"math.h"

intmain(void)

{ floata,b,c,disc,x1,x2,p,q; printf("Pleaseinputa,b,c="); scanf(“%f,%f,%f”,&a,&b,&c);/*輸入一元二次方程系數(shù)*/ printf("Theequation:"); printf("%fx*x+%fx+%f=0”,a,b,c); if(fabs(a)<=1E-6)/*判斷系數(shù)a=0*/ { printf(“isnotquadratic\n”);exit(0);}/*輸出不能構(gòu)成方程的信息后,退出*/ else程序如下: disc=b*b-4*a*c;/*定義判別式△*/ if(fabs(disc)<=1e-6) /*fabs()為求絕對(duì)值庫函數(shù),判斷△==0*/

{printf(“hastwoequalroot:\n”); printf(“x1=x2=%8.2f\n”,-b/(2*a));/*輸出兩個(gè)相等的實(shí)根*/ }

else

if(disc>1e-6)/*判斷△>0*/

{x1=(-b+sqrt(disc))/(2*a);/*求出兩個(gè)不相等的實(shí)根*/

x2=(-b-sqrt(disc))/(2*a);

printf("hasdistinctrealroots:\n"); printf("x1=%8.2f,x2=%8.2f\n",x1,x2);

} else {p=-b/(2*a);/*求出兩個(gè)共軛復(fù)根,其中p表示實(shí)部*/

q=sqrt(fabs(disc))/(2*a);/*q表示虛部*/ printf("hascomplexroots:\n");

printf(“x1=%7.2f+%7.2fi\n“,p,q); /*輸出兩個(gè)共軛復(fù)根之一:x1*/

printf(”x2=%7.2f-%7.2fi\n“,p,q);/*輸出兩個(gè)共軛復(fù)根之二:x2*/

} return0;} 運(yùn)行情況Pleaseinputa,b,c=1,6,2↙Theequation:1.000000x*x+6.000000x+2.000000=0hasdistinctrealroots:x1=-0.35,x2=-5.56Pleaseinputa,b,c=1,2,3↙Theequation:1.000000x*x+2.000000x+3.000000=0hascomplexroots:x1=-1.00+1.41ix2=-1.00-1.41i假設(shè)從鍵盤上輸入方程系數(shù)a、b、c分別為:1,6,2,那么屏幕顯示程序運(yùn)行情況如下:假設(shè)從鍵盤上輸入方程系數(shù)a、b、c分別為:1,2,3,那么屏幕顯示程序運(yùn)行情況如下:想一想:如果將系數(shù)a、b、c定義成整數(shù),能否直接判斷一元二次方程判別式disc是否等于0?【例4-7】某公司員工的保底薪水salary為500,某月所接工程的利潤profit〔整數(shù)〕與利潤提成的關(guān)系如下〔計(jì)量單位:元〕:profit≤1000 沒有提成;1000<profit≤2000 提成10%;200

溫馨提示

  • 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)論