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

下載本文檔

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

文檔簡(jiǎn)介

第四章

選擇結(jié)構(gòu)4.1if語(yǔ)句 4.2switch語(yǔ)句 4.3應(yīng)用程序舉例4.4常見(jiàn)錯(cuò)誤解析4.5本章小結(jié)4.1if語(yǔ)句4.1.1if語(yǔ)句中的表達(dá)式 4.1.2單分支if語(yǔ)句 4.1.3雙分支if語(yǔ)句 4.1.4多分支if語(yǔ)句 4.1.5if語(yǔ)句的嵌套 4.1.6條件運(yùn)算符實(shí)現(xiàn)選擇結(jié)構(gòu) 4.1.1if語(yǔ)句中的表達(dá)式

if語(yǔ)句根據(jù)給定的條件即表達(dá)式進(jìn)行判斷,表達(dá)式的值為真(非0)或假(0),決定了if后緊跟的語(yǔ)句是否被執(zhí)行。if語(yǔ)句的基本形式:if(表達(dá)式)語(yǔ)句if關(guān)鍵字之后的表達(dá)式就是用來(lái)描述條件的有以下類(lèi)型:邏輯表達(dá)式或關(guān)系表達(dá)式賦值表達(dá)式變量

4.1.1if語(yǔ)句中的表達(dá)式1.關(guān)系表達(dá)式表示條件關(guān)系表達(dá)式通常用來(lái)比較兩個(gè)操作數(shù)的大小,其結(jié)果是一個(gè)邏輯值,操作數(shù)關(guān)系成立則結(jié)果為真,否則為假。如下程序段(1):

if(m==n)

printf(“%dequalto%d”,m,n);程序段(2):

if(n%2!=0)

sum=sum+n;若表達(dá)式值為真則執(zhí)行求和語(yǔ)句。否則不執(zhí)行該語(yǔ)句。

2.邏輯表達(dá)式表示條件邏輯表達(dá)式就是用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)的有意義的式子,邏輯表達(dá)式的值是一個(gè)邏輯值,即“真”或“假”。它可以表示較為復(fù)雜的條件,如下例判別year是否閏年。閏年的條件:能被4整除,但不能被100整除,或者能被4整除,又能被400整除。表達(dá)式為:(year%4==0)&&(year%100!=0)||(year%400==0)滿足條件則為閏年。4.1.1if語(yǔ)句中的表達(dá)式4.1.1if語(yǔ)句中的表達(dá)式3.任意的數(shù)值類(lèi)型表示條件if(5)printf(“ok”);表達(dá)式的值為5,是一個(gè)非0的數(shù)即為真,輸出ok;if(0)printf(“ok”);則不執(zhí)行輸出語(yǔ)句。常見(jiàn)的還有實(shí)型、字符型、指針型數(shù)據(jù)作表達(dá)式。4.1.2單分支if語(yǔ)句單分支if語(yǔ)句的形式為:if(表達(dá)式)語(yǔ)句執(zhí)行過(guò)程如圖所示首先判斷表達(dá)式的值是否為真,若表達(dá)式的值非0,則執(zhí)行其后的語(yǔ)句;否則不執(zhí)行該語(yǔ)句。在if語(yǔ)句中,if關(guān)鍵字后的表達(dá)式必須用括號(hào)括起來(lái),且之后不加分號(hào)。表達(dá)式語(yǔ)句真(非0)假(0)【例4-1】輸入兩個(gè)整數(shù),按從大到小的順序輸出這兩個(gè)數(shù)。

#include<stdio.h>intmain(){

inta,b,t;printf("enteronenumber:"); scanf("%d",&a,);

printf("entertheothernumber:"); scanf("%d",&b,);if(a<b)/*如果a的值小于b,交換a,b順序*/

{t=a;a=b;b=t;}

printf("thesortednumbers:%d%d",a,b);

return0;}4.1.2單分支if語(yǔ)句4.1.3雙分支if語(yǔ)句雙分支if語(yǔ)句的形式為:if(表達(dá)式)語(yǔ)句1else語(yǔ)句2其語(yǔ)義是:如果表達(dá)式的值為真,則執(zhí)行語(yǔ)句1,否則執(zhí)行語(yǔ)句2。例:

if(x>y)

printf(“%d”,x);else

printf(“%d”,y);

表達(dá)式

語(yǔ)句1

語(yǔ)句2非004.1.3雙分支if語(yǔ)句【例1】輸入一個(gè)十進(jìn)制正整數(shù),判斷該數(shù)是否是7的倍數(shù),若是輸出"Yes!",否則輸出"No!“#include<stdio.h>intmain(){inta;printf("Enteraninteger:");scanf("%d",&a);if(a%7==0)printf("Yes!\n");elseprintf("No!\n");return0;

}

【例2】根據(jù)收入,計(jì)算納稅金額。其中收入高于20000人民幣的納稅金額分兩部分,20000以下部分按2%收取,高于20000部分按2.5%收取。#include<stdio.h>#defineLOWRATE0.02/*低于標(biāo)準(zhǔn)收入部分納稅率*/#defineHIGHRATE0.025/*高于標(biāo)準(zhǔn)收入部分納稅率*/#defineCUTOFF20000.0/*標(biāo)準(zhǔn)收入*/intmain(){floattaxable,taxes;printf("Pleasetypeinthetaxableincome:");scanf("%f",&taxable);if(taxable<=CUTOFF)/*收入小于等于標(biāo)準(zhǔn)收入*/taxes=LOWRATE*taxable;else/*收入大于標(biāo)準(zhǔn)收入*/taxes=HIGHRATE*(taxable-CUTOFF)+20000*0.02;printf("Taxesare¥%7.2f",taxes);return0;}使用if-else語(yǔ)句的注意事項(xiàng):雖然if和else之間加了分號(hào),但if…else仍是一條語(yǔ)句,都同屬于一個(gè)if語(yǔ)句。每一個(gè)else語(yǔ)句之前必須加分號(hào),整個(gè)語(yǔ)句結(jié)束處也必須有分號(hào)。else子句是if語(yǔ)句的一部分,必須和if語(yǔ)句配對(duì)使用,不能單獨(dú)使用。

4.1.4多分支if語(yǔ)句

if(表達(dá)式1)語(yǔ)句1elseif(表達(dá)式2)語(yǔ)句2

……elseif(表達(dá)式n)語(yǔ)句nelse語(yǔ)句n+1

【例1】根據(jù)月銷(xiāo)售額(人民幣),計(jì)算工資,具體計(jì)算辦法如下:月銷(xiāo)售額 工資sales>=50000 底薪380+月銷(xiāo)售額的16%30000<=sales<50000 底薪320+月銷(xiāo)售額的12%30000<sales<=10000 底薪260+月銷(xiāo)售額的7%sales<10000 底薪200+月銷(xiāo)售額的3%#include<stdio.h>intmain(){floatsales,pay;printf("Enterthevalueofmonthlysales:");scanf("%f",&sales);if(sales>=50000)

/*月銷(xiāo)售額5萬(wàn)以上*/pay=380+0.16*sales;elseif(sales>=30000)/*月銷(xiāo)售額5萬(wàn)以下3萬(wàn)以上*/pay=320+0.12*sales;elseif(sales>=10000)/*月銷(xiāo)售額3萬(wàn)以下1萬(wàn)以上*/pay=260+0.07*sales;else

/*月銷(xiāo)售額1萬(wàn)以下*/pay=200+0.03*sales;printf("Thepayis¥%7.2f.\n",pay);return0;}4.1.5if語(yǔ)句的嵌套當(dāng)if語(yǔ)句的分支語(yǔ)句又是if語(yǔ)句時(shí),就構(gòu)成了if語(yǔ)句的嵌套。其一般形式如下:if(表達(dá)式)if(表達(dá)式)語(yǔ)句1;else語(yǔ)句2;elseif(表達(dá)式)語(yǔ)句3;else語(yǔ)句4;4.1.5if語(yǔ)句的嵌套多個(gè)if和多個(gè)else重疊的這時(shí)要特別注意if和else的配對(duì)問(wèn)題。例如以下程序段,共五行:1) if(表達(dá)式)2) if(表達(dá)式)語(yǔ)句1;3) else4) if(表達(dá)式)語(yǔ)句2;else語(yǔ)句3;C語(yǔ)言規(guī)定:else總是與它同一個(gè){}內(nèi)前面最近的未配對(duì)的if配對(duì)。因此這個(gè)例子中的第3行的else應(yīng)該和第2行的if配對(duì)。需要注意的是:

else和if是成對(duì)出現(xiàn)的,有else出現(xiàn),必定有if語(yǔ)句。 有if語(yǔ)句,不一定有else語(yǔ)句。

#include<math.h>#include<stdio.h>intmain(){floata,b,c,deta,x1,x2,p,q;printf(“inputa,b,c:”);scanf(“%f,%f,%f”,&a,&b,&c);deta=b*b-4*a*c;if(fabs(deta)<=1e-6) /*fabs():求絕對(duì)值庫(kù)函數(shù)*/printf(“x1=x2=%7.2f\n”,-b/(2*a)); /*輸出兩個(gè)相等的實(shí)根*/else{if(deta>1e-6)/*求出兩個(gè)不相等的實(shí)根*/

{x1=(-b+sqrt(deta))/(2*a);

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

printf("x1=%7.2f,x2=%7.2f\n",x1,x2);}else/*求出兩個(gè)共軛復(fù)根*/{

p=-b/(2*a); q=sqrt(fabs(deta))/(2*a);printf(“x1=%7.2f+%7.2fi\n“,p,q); /*輸出兩個(gè)共軛復(fù)根*/printf(”x2=%7.2f-%7.2fi\n“,p,q);}

}return0;}

【例1】求一元二次方程ax2+bx+c=0的解(a≠0)注意:

if語(yǔ)句允許嵌套,但嵌套的層數(shù)不宜太多。在實(shí)際編程時(shí),應(yīng)適當(dāng)控制嵌套層數(shù)(2~3層)?!罢Z(yǔ)句組1”和“語(yǔ)句組2”,可以只包含一個(gè)簡(jiǎn)單語(yǔ)句,也可以是復(fù)合語(yǔ)句。務(wù)必牢記:不管是簡(jiǎn)單語(yǔ)句,還是復(fù)合語(yǔ)句中的各個(gè)語(yǔ)句,每個(gè)語(yǔ)句后面的分號(hào)必不可少!例如:

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

語(yǔ)句if行后面的賦值語(yǔ)句“max=num1;”分號(hào)不能省略。但不要誤認(rèn)為if和else是2個(gè)獨(dú)立的語(yǔ)句,它們都屬于if語(yǔ)句中的一部分,else是if語(yǔ)句的子句。4.1.6條件運(yùn)算符實(shí)現(xiàn)選擇結(jié)構(gòu)【例】從鍵盤(pán)上輸入一個(gè)字符,如果它是大寫(xiě)字母,則把它轉(zhuǎn)換成小寫(xiě)字母輸出;否則,直接輸出。#include<stdio.h>intmain(){

charch;

printf("inputacharacter:");

scanf("%c",&ch);

ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch;

printf("ch=%c\n",ch);

return0;}如果分支太多,if語(yǔ)句嵌套的層次數(shù)太多,勢(shì)必會(huì)造成程序的冗長(zhǎng),可讀性差。C語(yǔ)言提供了switch語(yǔ)句直接處理多分支選擇。switch語(yǔ)句一般與break語(yǔ)句配合使用。其一般形式為:switch(表達(dá)式){case常量表達(dá)式1:語(yǔ)句1;break;case常量表達(dá)式2:語(yǔ)句2;break;…case常量表達(dá)式n:語(yǔ)句n;break;default:語(yǔ)句n+1;}4.2switch語(yǔ)句switch語(yǔ)句的執(zhí)行過(guò)程即:switch語(yǔ)句計(jì)算表達(dá)式的值,將其逐個(gè)同case關(guān)鍵字后的常量表達(dá)式進(jìn)行比較,當(dāng)表達(dá)式的值與某個(gè)常量表達(dá)式的值相等時(shí),即執(zhí)行其后的語(yǔ)句,然后跳出switch語(yǔ)句。如果表達(dá)式的值與所有case后的常量表達(dá)式均不相同時(shí),則執(zhí)行default后的語(yǔ)句,然后跳出switch語(yǔ)句。【例】成績(jī)等級(jí)與分?jǐn)?shù)范圍有如下對(duì)應(yīng)關(guān)系:等級(jí)‘A’,對(duì)應(yīng)分?jǐn)?shù)范圍80~100;等級(jí)‘B’,對(duì)應(yīng)分?jǐn)?shù)范圍70~79;等級(jí)‘C’,對(duì)應(yīng)分?jǐn)?shù)范圍60~69,等級(jí)‘D’,對(duì)應(yīng)分?jǐn)?shù)范圍0~59,根據(jù)成績(jī)等級(jí)輸出分?jǐn)?shù)范圍。程序段:

scanf(“%c”,&grade);switch(grade)

{

case'A':printf("score:80~100\n");break;case'B':printf("score:70~79\n");break;case'C':printf("score:60~69\n");break;case'D':printf("score:0~59\n");break;default:printf("score:dataerror!\n");}

4.2switch語(yǔ)句4.2switch語(yǔ)句使用switch語(yǔ)句時(shí)需注意:switch關(guān)鍵字后表達(dá)式可以是任何結(jié)果為整型或字符型(long、int或char)的表達(dá)式。case關(guān)鍵字后面只能是整型或字符型的常量或常量表達(dá)式。在case后的各常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)錯(cuò)誤。每個(gè)case語(yǔ)句的結(jié)尾絕對(duì)不要忘了加

break,否則將導(dǎo)致多個(gè)分支重疊(除非有意使多個(gè)分支重疊)。最后必須使用default分支??梢员苊庾屓苏`以為忘了

default處理?!纠枯斎?005年的一個(gè)月份,輸出這個(gè)月的天數(shù)。(2005年為平年)

分析:根據(jù)輸入的月份數(shù)判斷,當(dāng)月份為1、3、5、7、8、10、12時(shí),天數(shù)為31,當(dāng)月份為4、6、9、11時(shí),天數(shù)為30,2005年不是閏年,所以,當(dāng)月份為2時(shí),天數(shù)為28。#include<stdio.h>intmain(){intmonth,days;printf("inputthemonthnumber:");scanf("%d",&month);switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;break;case4:

case6:case9:case11:days=30;break;case2:days=28;break;default:days=-1;}if(days==-1)printf("inputerror!");elseprintf("2005years%dmonthhas%ddays\n",month,days);}注意:switch語(yǔ)句允許多情況執(zhí)行相同的語(yǔ)句。例如4、6、9和11月均執(zhí)行

days=30;可以寫(xiě)成:case4:case6:case9:case11:days=30;但不能寫(xiě)成:case4,6,9,11:days=30;也不能寫(xiě)成:case4,case6,case9,case11:days=30;【例1】溫度轉(zhuǎn)換。如果輸入一個(gè)華氏溫度,把它轉(zhuǎn)換成攝氏溫度;如果輸入一個(gè)攝氏溫度,把它轉(zhuǎn)換成華氏溫度。#include<stdio.h>intmain(){chartempType;floattemp,fahren,celsius;printf("Enterthetemperaturetobeconverted:");scanf("%f",&temp);printf("EnteranfifthetemperatureisinFahrenheit");printf("\noracifthetemperatureisinCelsius:");/*利用兩個(gè)printf實(shí)現(xiàn)一句較長(zhǎng)英文的換行輸出*/scanf("\n%c",&tempType);if(tempType=='f')/*輸入字符‘f’則代表輸入的是華氏溫度*/{celsius=(5.0/9.0)*(temp-32.0);/*根據(jù)數(shù)學(xué)公式進(jìn)行溫度轉(zhuǎn)換*/printf("\nTheequivalentCelsiustemperatureis%6.2fc.\n",celsius);}else{

fahren=(9.0/5.0)*temp+32.0;/*根據(jù)數(shù)學(xué)公式進(jìn)行溫度轉(zhuǎn)換*/printf("\nTheequivalentFahrenheittemperatureis%6.2fF.\n",fahren);}return0;}【例4-12】

x*x+2x-5(x<0且x!=-3)f(x)=

x*x-3x+6(0<=x<20且x!=5及x!8)

x*x-3x-10(x為其它值)#include<stdio.h>#include<math.h>intmain()

實(shí)現(xiàn)上述分段函數(shù),要求自變量與函數(shù)值均為雙精度類(lèi)型{doublex,y;intk=0;printf("inputvaluex:");scanf("%lf",&x);if(x<0&&fabs(x+3)>1e-6)y=x*(x+2)-5;elseif(x>=0&&x<20&&fabs(x-5)>1e-6&&fabs(x-8)>1e-6)y=x*(x-3)+6;elsey=x*(x-3)-10;printf("%f\n",y);return0;}【例3】由年份判斷某一年是否閏年。分析:閏年的條件:1)年份能被4整除,但不能被100整除,是閏年;2)年份能被100整除,又能被400整除,是閏年。不滿足這兩個(gè)條件的不是閏年。以變量leap代表是否閏年的信息。若閏年,令leap=1;非閏年,leap=0。#include<stdio.h>intmain(){intyear,leap=0;printf(“inputyear:”);scanf(“%d”,&year);if((year%4==0&&year%100!=0)||(year%100=0&&year%400==0))leap=1;elseleap=0;if(leap)printf("%disaleapyear.\n",year);elseprintf("%disnotaleapyear.\n",year);return0;}4.4常見(jiàn)錯(cuò)誤解1.if-else語(yǔ)句與空語(yǔ)句的連用。例如:if(NULL!=p);fun();

2

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論