《C程序設(shè)計(jì)》課件第4章_第1頁(yè)
《C程序設(shè)計(jì)》課件第4章_第2頁(yè)
《C程序設(shè)計(jì)》課件第4章_第3頁(yè)
《C程序設(shè)計(jì)》課件第4章_第4頁(yè)
《C程序設(shè)計(jì)》課件第4章_第5頁(yè)
已閱讀5頁(yè),還剩65頁(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)的C程序設(shè)計(jì)4.1分支結(jié)構(gòu)中的表達(dá)式4.2if語(yǔ)句4.3switch語(yǔ)句4.4程序設(shè)計(jì)舉例習(xí)題4.1分支結(jié)構(gòu)中的表達(dá)式在其他高級(jí)語(yǔ)言中,分支結(jié)構(gòu)中的表達(dá)式僅指關(guān)系表達(dá)式和邏輯表達(dá)式,比較簡(jiǎn)單。C語(yǔ)言中要復(fù)雜得多,可以是任何有效的表達(dá)式,如算術(shù)表達(dá)式、賦值表達(dá)式、字符表達(dá)式、條件表達(dá)式,還可以是任意類型的數(shù)據(jù),如整型、實(shí)型、字符型、指針類型等。4.1.1C語(yǔ)言中的邏輯值

C語(yǔ)言中沒(méi)有專門(mén)定義邏輯類型的變量、常量和輸入、輸出格式。但對(duì)邏輯值作了更寬的規(guī)定:表達(dá)式的值非0,則表示邏輯真;表達(dá)式的值為0,則表示邏輯假。這就是說(shuō),不管什么類型的表達(dá)式,只要值不是0就表示真,如1、2、0.5、′a′,都表示真。值只有是0、′\0′(字符′\0′的ASCII值為0)才表示假。對(duì)邏輯真、假值的這種策略,使得所有類型的表達(dá)式都能在分支語(yǔ)句中作條件使用,允許我們編制效率極高的程序。4.1.2關(guān)系表達(dá)式

1.關(guān)系表達(dá)式的概念所謂關(guān)系表達(dá)式是指,用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來(lái),進(jìn)行關(guān)系運(yùn)算的式子。例如,下面的關(guān)系表達(dá)式都是合法的:

a>b,a+b>c-d,(a=3)<=(b=5),′a′>=′b′,(a>b)==

(b>c)

2.關(guān)系表達(dá)式的運(yùn)算結(jié)果——邏輯值(非“真”即“假”)

C語(yǔ)言用整數(shù)“1”表示“邏輯真”,用整數(shù)“0”表示“邏輯假”。所以,關(guān)系表達(dá)式的值,還可以參與其它種類的運(yùn)算,例如算術(shù)運(yùn)算、邏輯運(yùn)算等。例如,假設(shè)num1=3,num2=4,num3=5,則:

(1)num1>num2的值為0。

(2)(num1>num2)!=num3的值為1。

(3)num1<num2<num3的值為1。

(4)(num1<num2)+num3的值為6,因?yàn)閚um1<num2的值為1,1+5=6。4.1.3邏輯表達(dá)式

1.邏輯表達(dá)式的概念關(guān)系表達(dá)式只能描述單一條件,例如“x>=0”。如果需要描述“x>=0”、同時(shí)“x<10”,就要借助于邏輯表達(dá)式了。所謂邏輯表達(dá)式是指,用邏輯運(yùn)算符將一個(gè)或多個(gè)表達(dá)式連接起來(lái),進(jìn)行邏輯運(yùn)算的式子。在C語(yǔ)言中,用邏輯表達(dá)式表示多個(gè)條件的組合。例如,(x>=0)&&(x<10)就是一個(gè)判斷數(shù)x是否大于等于0且小于10的邏輯表達(dá)式。

2.邏輯表達(dá)式的運(yùn)算結(jié)果邏輯表達(dá)式的值也是一個(gè)邏輯值(非“真”即“假”)。例如:

(a>b)&&(x>y)等效于a>b&&x>y

(a==b)||(x==y)等效于a==b||x==y

(!a)||(a>b)等效于!a||a>b要根據(jù)優(yōu)先級(jí)處理數(shù)值運(yùn)算、關(guān)系運(yùn)算和邏輯運(yùn)算,想提高某運(yùn)算的級(jí)別或增加運(yùn)算關(guān)系的清晰性,可以加括號(hào)。邏輯表達(dá)式求解,在值已能確定的情況下不一定求到最后。如:

(1)表達(dá)式a&&b&&c:當(dāng)a=0時(shí),表達(dá)式的值為0,不必計(jì)算判斷b、c;當(dāng)a=1、b=0時(shí),表達(dá)式的值為0,不必計(jì)算判斷c;只有a=1、b=1,才判斷c。

(2)表達(dá)式a||b||c:當(dāng)a=1(非0)時(shí),表達(dá)式的值為1,不必計(jì)算判斷b、c;當(dāng)a=0時(shí),才判斷b,如b=1,則表達(dá)式的值為1,不必計(jì)算判斷c;只有a=0、b=0,才判斷c。熟練掌握關(guān)系運(yùn)算符和邏輯運(yùn)算符,可以用邏輯表達(dá)式表示一個(gè)復(fù)雜的條件。例如,判斷某年y是否為閏年。y滿足二者之一為閏年:(1)y能被4整除,但不能被100整除;(2)y能被400整除。兩個(gè)條件為或(||)的關(guān)系,條件(1)內(nèi)的兩個(gè)條件為與(&&)的關(guān)系。判斷整除用求余運(yùn)算%,余數(shù)為0,則能整除。表達(dá)式可寫(xiě)成:(y%4==0&&y%100!=0)||y%400==0判斷非閏年,則將上述整個(gè)條件取反即可:?。ǎ▂%4==0&&y%100!=0)||y%400==0)4.1.4其它形式的表達(dá)式

C語(yǔ)言分支的表達(dá)式比較復(fù)雜,因?yàn)樗梢允侨魏斡行У谋磉_(dá)式。常用的還有:

1.算術(shù)表達(dá)式如if(a*b-3*c){…},以算術(shù)表達(dá)式“a*b-3*c”的值是否為真決定程序流向,而不必寫(xiě)成邏輯表達(dá)式“a*b-3*c==1”的形式。

if(a){…}、if(3){…}、if(0){…}使用的都是算術(shù)表達(dá)式。如果寫(xiě)成if(a==1){…}或if(a==0){…},則用的是邏輯表達(dá)式,是有冗余且潛在低效的,不是好風(fēng)格。

2.賦值表達(dá)式用賦值表達(dá)式作表達(dá)式,清晰度不高,最容易使人“上當(dāng)受騙”。例如:“inta=3,b=5;if(a=b){…}”,請(qǐng)問(wèn)條件是否成立?有人說(shuō)不成立,因?yàn)?≠5。錯(cuò)了!這里“a=b”是賦值表達(dá)式,而不是“a==b”,a為5。表達(dá)式取a的值,為真。再如:“inta=3,b=0;if(a=b){…}”,請(qǐng)問(wèn)條件是否成立?有人說(shuō)不成立,因?yàn)?≠0。說(shuō)條件不成立,是正確的,但理由是“a=b”是賦值表達(dá)式,賦值后a為0,表達(dá)式取a的值,故為假。

3.字符表達(dá)式如定義“charc=3;”,則if(c){…}、if(′B′){…}使用的都是字符表達(dá)式,其值同樣是0為假,非0為真。還有其它形式的表達(dá)式,如逗號(hào)表達(dá)式等,其邏輯值的取法與上述相同。4.2

if語(yǔ)句4.2.1if語(yǔ)句的簡(jiǎn)單形式

if語(yǔ)句的簡(jiǎn)單形式如下:

if(表達(dá)式)語(yǔ)句其中表達(dá)式不限于邏輯表達(dá)式或關(guān)系表達(dá)式,可以是各種表達(dá)式,如算術(shù)表達(dá)式等。當(dāng)表達(dá)式的值為非零時(shí)為“真”,當(dāng)表達(dá)式的值為零時(shí)為“假”。

if語(yǔ)句的執(zhí)行過(guò)程如圖4.1所示。圖4.1if語(yǔ)句執(zhí)行過(guò)程當(dāng)表達(dá)式的值為真時(shí),執(zhí)行后面的語(yǔ)句,接著執(zhí)行下一語(yǔ)句;當(dāng)表達(dá)式的值為假時(shí),就直接執(zhí)行下一語(yǔ)句。

if語(yǔ)句中的“語(yǔ)句”從語(yǔ)法上講必須也只能是一條語(yǔ)句,它可以是第三章中介紹過(guò)的各種語(yǔ)句。很多情況下它不止一句,當(dāng)超過(guò)一句時(shí),必須用花括號(hào)括起來(lái),構(gòu)成一個(gè)復(fù)合語(yǔ)句。例4.1

打印出不及格的成績(jī)。

#include<stdio.h>

voidmain()

{

floatscore;

scanf("%f",&score);

if(score<60.0)printf("score=%5.1f\n",score);

}運(yùn)行:

68↙(輸入,不滿足條件,無(wú)輸出)再次運(yùn)行:

50↙(輸入)

score=┗┛50.0(輸出)

if結(jié)構(gòu)中也可以采用復(fù)合語(yǔ)句。

例4.2輸入三角形的三條邊長(zhǎng)a、b、c,若能構(gòu)成三角形,則利用海倫公式求出三角形的面積。(海倫公式:S=sqrt(l*(l-a)*(l-b)*(l-c)),其中l(wèi)=(a+b+c)/2。

#include<stdio.h>

#include<math.h>

voidmain()

{floata,b,c,l,S;

printf("Inputa,b,c:");

scanf("%f%f%f",&a,&b,&c);

if(a<=0||b<=0||c<=0)

{

printf("Illegalinput!\n");

return;

}

if(a+b>c&&a+c>b&&b+c>a)

{

l=(a+b+c)/2;

S=sqrt(l*(l-a)*(l-b)*(l-c));/*sqrt是庫(kù)函數(shù),其功能是求平方根*/

printf("areaS=%.2f\n",S);

}

}運(yùn)行結(jié)果:

Inputa,b,c:345↙ areaS=6.004.2.2if~else結(jié)構(gòu)

1.if~else結(jié)構(gòu)的形式

if~else結(jié)構(gòu)是if語(yǔ)句的基本形式,形式如下:

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

else語(yǔ)句2其執(zhí)行過(guò)程如圖4.2所示。圖4.2if~else語(yǔ)句執(zhí)行過(guò)程當(dāng)表達(dá)式的結(jié)果為真(非零)時(shí),執(zhí)行語(yǔ)句1,執(zhí)行完后跳到下一語(yǔ)句;當(dāng)表達(dá)式的結(jié)果為假(零)時(shí),執(zhí)行語(yǔ)句2,執(zhí)行完后順序執(zhí)行下一語(yǔ)句。此屬二中選一的情況,必選其一,只選其一。其中語(yǔ)句1和語(yǔ)句2可以是單個(gè)語(yǔ)句,也可以是復(fù)合語(yǔ)句(即用花括號(hào)括起來(lái)的一組語(yǔ)句)。復(fù)合語(yǔ)句中又可以含有if語(yǔ)句,這就是后面要講的if嵌套。子句else是任選的,當(dāng)沒(méi)有else子句時(shí),就變成第一種形式了。在書(shū)寫(xiě)格式上語(yǔ)句1、elsc、語(yǔ)句2都可以另起一行,但仍看做是在同一個(gè)if語(yǔ)句內(nèi)。

例4.3

打印成績(jī)≥60分為“Pass”,否則為“Fail”。

解我們可以使用兩種方法編程。方法一:用兩個(gè)簡(jiǎn)單的if語(yǔ)句實(shí)現(xiàn)。

#inchde<stdio.h>

voidmain()

{

floatscore;

scanf("%f",&score);

if(score<60.0)printf("score=%5.1f---Fail\n",score);

if(score>=60.0)printf("score=%5.1f---Pass\n",score);

}運(yùn)行:

50↙

score=┗┛50.0---Fail再次運(yùn)行:

80↙

score=┗┛80.0---Pass在第二個(gè)if語(yǔ)句中,if(score>=60.0)是不能缺少的,否則不管score是否小于60,都將打印出第二行的結(jié)果。方法二:用if~else語(yǔ)句實(shí)現(xiàn)。

#include<stdio.h>

voidmain()

{

floatscore;

scanf("%f",&score);

if(score<60.0)printf("score=%5.1f---Fail\n",score);

elseprintf("score=%5.1f---Pass\n",score);

}運(yùn)行:

50↙

score=┗┛50.0---Fail再次運(yùn)行:

80↙

score=┗┛80.0---Pass從例4.3中可看出,if~else結(jié)構(gòu)較兩個(gè)if語(yǔ)句簡(jiǎn)單、清晰,也不易出錯(cuò)。上例if語(yǔ)句和else語(yǔ)句后都有一個(gè)分號(hào),該分號(hào)是C語(yǔ)言語(yǔ)句語(yǔ)法所要求的。if語(yǔ)句后的分號(hào)并不是表示if結(jié)構(gòu)已結(jié)束,而是其后的printf語(yǔ)句要求的分號(hào);else語(yǔ)句后的分號(hào)也是其后的printf語(yǔ)句要求的,同時(shí)表示此if語(yǔ)句到此結(jié)束,而不必連用兩個(gè)分號(hào)來(lái)表示if~else結(jié)構(gòu)的結(jié)束。

2.條件運(yùn)算符的使用當(dāng)if~else結(jié)構(gòu)中的語(yǔ)句是表達(dá)式語(yǔ)句時(shí),就可以使用條件運(yùn)算符“?:”,即下列if~else語(yǔ)句:

if(表達(dá)式1)表達(dá)式2;else表達(dá)式3;用條件運(yùn)算符寫(xiě)成通用形式即為:表達(dá)式1?表達(dá)式2:表達(dá)式3說(shuō)明:

(1)條件運(yùn)算符的執(zhí)行順序:先解表達(dá)式1,若為非0(真),則求解表達(dá)式2,此時(shí)表達(dá)式2的值就作為整個(gè)條件表達(dá)式的值。若表達(dá)式1的值為0(假),則求解表達(dá)式3,此時(shí)表達(dá)式3的值就作為整個(gè)條件表達(dá)式的值。

max=(a>b)?a:b執(zhí)行結(jié)果就是將條件表達(dá)式的值賦給max。也就是將a和b兩者中大者賦給max。

(2)條件運(yùn)算符優(yōu)先于賦值運(yùn)算符,因此上面賦值表達(dá)式的求解過(guò)程是先求解條件表達(dá)式,再將它的值賦給max。條件運(yùn)算符的優(yōu)先級(jí)比關(guān)系運(yùn)算符和算術(shù)運(yùn)算符都低。因此,

max=(a>b)?a:b等效于max=a>b?a:b

a>b?a:b+1等效于a>b?a:(b+1)

(3)條件運(yùn)算符的結(jié)合方向?yàn)椤白杂蚁蜃蟆?。如果有以下條件表達(dá)式:

a>b?a:c>d?c:d相當(dāng)于

a>b?a:(c>d?c:d)如果a=1,b=2,c=3,d=4,則條件表達(dá)式的值為4。由于函數(shù)調(diào)用也返回一個(gè)值,因此表達(dá)式2,3也可出現(xiàn)函數(shù)的調(diào)用。如以下形式:表達(dá)式?函數(shù)調(diào)用1:函數(shù)調(diào)用2

例4.4

輸入x的值,當(dāng)x>0時(shí)調(diào)用sqrt(x),否則調(diào)用fabs(x)。程序:

#include<math.h>

#include<stdio.h>

voidmain()

{

floatx,y;

scanf("%f",&x);

y=x>0?sqrt(x):fabs(x);/*fabs是庫(kù)函數(shù),其功能是取絕對(duì)值*/

printf("x=%f,y=%f\n",x,y);

}

運(yùn)行:

9.0↙

x=9.000000,y=3.000000再次運(yùn)行:-9.0↙

x=-9.000000,y=9.000000本例中使用了數(shù)學(xué)函數(shù)sqrt(開(kāi)平方根)和fabs(求絕對(duì)值),因此在程序頭部要加上文件包含命令#include<math.h>。這兩個(gè)函數(shù)的函數(shù)值和自變量均為雙精度類型,因此x最好定義成雙精度型。取整型數(shù)的絕對(duì)值可使用abs(x)函數(shù)。這些可查附錄二的庫(kù)函數(shù)表。例4.5

打印a,b兩個(gè)數(shù)中較大的一個(gè)數(shù)。方法一:用if~else結(jié)構(gòu)實(shí)現(xiàn)。

#include<stdio.h>

voidmain()

{

inta,b;

scanf("%d,%d",&a,&b);

if(a>b)printf("max=%d\n",a);

elseprintf("max=%d\n",b);

}方法二:用條件運(yùn)算符實(shí)現(xiàn)。

#include<stdio.h>

voidmain()

{

inta,b;

scanf("%d,%d",&a,&b);

printf("max=%d\n",a>b?a:b);

}以上兩種方法運(yùn)行結(jié)果完全一致,可選用。

3.if語(yǔ)句的嵌套

if語(yǔ)句的嵌套是if~else結(jié)構(gòu)中的語(yǔ)句1或(和)語(yǔ)句2,又是一個(gè)if~else結(jié)構(gòu)。我們直接由例子來(lái)說(shuō)明。

例4.6

輸入一個(gè)學(xué)生成績(jī),當(dāng)成績(jī)≥90時(shí),打印“VeryGood”;當(dāng)80≤成績(jī)<90時(shí),打印“Good”;當(dāng)60≤成績(jī)<80時(shí),打印“Pass”;當(dāng)成績(jī)<60時(shí),打印“Fail”。

#include<stdio.h>

voidmain()

{

floatscore;

scanf("%f",&score);

if(score>=80)

if(score>=90)printf("VeryGood\n");

elseprintf("Good\n");

elseif(score>=60)printf("Pass\n");

elseprintf("Fail\n");

}運(yùn)行:

85↙

Good嵌套的if語(yǔ)句很容易出錯(cuò),原因在于不知道哪個(gè)else與哪個(gè)if配對(duì)。C語(yǔ)言提供了一個(gè)簡(jiǎn)單規(guī)則:從內(nèi)層開(kāi)始,else總是與它上面最近的(未曾配對(duì)的)if配對(duì)。例如語(yǔ)句段:

if(x)

if(y)printf("A");

elseprintf("B");其中else語(yǔ)句是與if(y)相匹配的。如果else語(yǔ)句與if(x)相匹配,則if(y)子句必須加花括號(hào)寫(xiě)成:

if(x)

{if(y)printf("A");}

elseprintf("B");此時(shí)else語(yǔ)句不知道if(y)語(yǔ)句,因?yàn)樗[藏在一個(gè)復(fù)合語(yǔ)句中。從本質(zhì)上講,if(y)和else不在同一個(gè)塊程序中。為了能區(qū)分嵌套的層次,我們常用縮進(jìn)的方式來(lái)表示不同的層次,這樣寫(xiě)程序便于閱讀,便于查錯(cuò)。我們要求在程序書(shū)寫(xiě)時(shí)采用按層縮進(jìn)的格式,使同一層在同一起始位置。嵌套最多可達(dá)15層。當(dāng)一個(gè)if~else結(jié)構(gòu)嵌在if子句中,即語(yǔ)句1又是一個(gè)if~else結(jié)構(gòu)時(shí),非常容易出錯(cuò),而嵌在else子句中,即語(yǔ)句2是if~else結(jié)構(gòu)時(shí),則不易出錯(cuò)。故建議初學(xué)者在寫(xiě)if嵌套語(yǔ)句時(shí),盡量寫(xiě)成:

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

elseif(表達(dá)式2)…這就是if語(yǔ)句的第三種常用形式,即elseif結(jié)構(gòu)。4.2.3

elseif結(jié)構(gòu)

elseif結(jié)構(gòu)的形式如下:

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

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

elseif(表達(dá)式3)語(yǔ)句3

elseif(表達(dá)式n)語(yǔ)句n

else語(yǔ)句n+1其中語(yǔ)句1~語(yǔ)句n+1的解釋同前。表達(dá)式1到n的值應(yīng)相互獨(dú)立、無(wú)重疊。其執(zhí)行過(guò)程如圖4.3所示。圖4.3elseif結(jié)構(gòu)的執(zhí)行過(guò)程該結(jié)構(gòu)的執(zhí)行過(guò)程是按從上到下的次序逐個(gè)進(jìn)行判斷的,一旦發(fā)現(xiàn)條件滿足時(shí)(表達(dá)式值為非零)就執(zhí)行與它有關(guān)的語(yǔ)句,并跳過(guò)其它剩余的語(yǔ)句結(jié)束本if語(yǔ)句,若逐一判斷卻沒(méi)有一個(gè)條件被滿足,則執(zhí)行最后一個(gè)else語(yǔ)句。這個(gè)最后else語(yǔ)句常起著“缺省條件”的作用。如果沒(méi)有最后的else語(yǔ)句,則其它條件都不滿足時(shí),什么也不執(zhí)行。此屬多中選一的情況,必選其一,只選其一。從if(表達(dá)式1)到語(yǔ)句n+1,不管n多大,只算一個(gè)語(yǔ)句。無(wú)論執(zhí)行的是哪個(gè)語(yǔ)句,執(zhí)行完都轉(zhuǎn)到elseif下面的語(yǔ)句執(zhí)行。不難看出,當(dāng)n=1時(shí),就變成了ifelse形式了。

例4.7

將例4.6用elseif結(jié)構(gòu)來(lái)實(shí)現(xiàn)。程序:

#include<stdio.h>

voidmain()

{

floatscore;

scanf("%f",&score);

if(score>=90)printf("VeryGood\n");

elseif(score>=80)printf("Good\n");

elseif(score>=60)printf("Pass\n");

elseprintf("Fail\n");

}

運(yùn)行:

58↙

Fail說(shuō)明:

(1)在elseif結(jié)構(gòu)中,if語(yǔ)句…elseif語(yǔ)句…else語(yǔ)句屬于同一程序模塊。程序每運(yùn)行一次,僅有一個(gè)分支的語(yǔ)句能得到執(zhí)行。

(2)各個(gè)表達(dá)式所表示的條件必須是互相排除的,也就是說(shuō),只有條件1(表達(dá)式1)不滿足時(shí)才會(huì)判斷條件2,只有條件2也不滿足時(shí)才會(huì)判斷條件3,其余依次類推,只有所有條件都不滿足時(shí)才執(zhí)行最后的else語(yǔ)句。例4.7的程序也可寫(xiě)成:

#include<stdio.h>

voidmain()

{

floatscore;

Printf("Inputscore:"),

scanf("%f",&score);

if(score<60)printf("Fail\n");

elseif(score<80)printf("Pass\n");

elseif(score<90)printf("Good\n");

elseprintf("VeryGood\n");

}

如寫(xiě)成以下形式就錯(cuò)了:

#include<stdio.h>

voidmain()

{

floatscore;

printf("Inputscore:");

scanf("%f",&score);

if(score<60)printf("Fail\n");

elseif(score>=60)printf("Pass\n");

elseif(score>=80)printf("Good\n");

elseprintf("VeryGood\n");

}因?yàn)樵趀lseif(score>=60)這個(gè)條件中包含了score>=80,也包含了score>=90,所以后兩個(gè)語(yǔ)句再也沒(méi)有機(jī)會(huì)執(zhí)行了。4.3

switch語(yǔ)句

if語(yǔ)句和if~else結(jié)構(gòu)常解決二分支問(wèn)題,if結(jié)構(gòu)的嵌套和elseif結(jié)構(gòu)可解決多分支的問(wèn)題。此外,C語(yǔ)言還提供一種用于多分支選擇的switch語(yǔ)句,又稱開(kāi)關(guān)語(yǔ)句。表達(dá)式的取值有特點(diǎn)、有規(guī)律,易于統(tǒng)一表示。實(shí)際問(wèn)題如:按成績(jī)分類、年齡分類、數(shù)學(xué)函數(shù)按定義域分類、菜單選項(xiàng)等。這類問(wèn)題可用if語(yǔ)句或其嵌套解決,但往往顯得冗長(zhǎng),或嵌套層數(shù)多,可讀性差。

switch語(yǔ)句的形式:

switch(表達(dá)式)

{

case常量1:語(yǔ)句段1;[break]

case常量2:語(yǔ)句段2;[break]

default:語(yǔ)句段n

}

switch語(yǔ)句的執(zhí)行過(guò)程如圖4.4所示。圖4.4switch語(yǔ)句的執(zhí)行過(guò)程

switch語(yǔ)句先計(jì)算表達(dá)式的值,然后同多個(gè)case語(yǔ)句后的常量比較,找到相等的case常量則執(zhí)行該常量冒號(hào)后的語(yǔ)句段,并從這個(gè)入口一直執(zhí)行下面所有冒號(hào)后的語(yǔ)句,如果遇到break語(yǔ)句則跳出switch結(jié)構(gòu)。如果沒(méi)有break語(yǔ)句,則不再判斷后面case后的條件,直接執(zhí)行下面所有case后的語(yǔ)句,直到碰到break語(yǔ)句或switch語(yǔ)句結(jié)束。如果switch語(yǔ)句后表達(dá)式的值找不到匹配的case常量,就執(zhí)行default后面的語(yǔ)句段直到結(jié)束。default是任選項(xiàng),如果沒(méi)有該語(yǔ)句,則在所有配對(duì)都失敗時(shí),什么也不執(zhí)行。說(shuō)明:

(1)switch后面的表達(dá)式可以是整型、字符型、枚舉型。

(2)若語(yǔ)句1~語(yǔ)句n中存在break語(yǔ)句,則程序執(zhí)行到break時(shí)會(huì)跳出switch語(yǔ)句,執(zhí)行其后的語(yǔ)句n+1。

(3)每個(gè)case分支只是一個(gè)入口,若無(wú)break語(yǔ)句,則一直執(zhí)行其后所有case后的語(yǔ)句,直至switch語(yǔ)句的結(jié)束處。因此,若希望只執(zhí)行一個(gè)開(kāi)關(guān),則必須在case后的語(yǔ)句中加break語(yǔ)句。

(4)每個(gè)case分支后也可有多條語(yǔ)句,但不必用{},這一點(diǎn)與之前的if語(yǔ)句、之后的while和for語(yǔ)句不同。

(5)switch語(yǔ)句可以允許有257個(gè)case常量,但同一級(jí)的case常量不能有相同的值。

(6)switch語(yǔ)句允許嵌套,即在某一case常量后的語(yǔ)句段中又包含一個(gè)switch語(yǔ)句,此時(shí)內(nèi)、外層的case語(yǔ)句可以有相同的常量值。

(7)當(dāng)若干分支需要執(zhí)行相同操作時(shí),可利用空語(yǔ)句,將幾個(gè)case分支寫(xiě)在一起,使多個(gè)case分支共用一組語(yǔ)句。

(8)switch語(yǔ)句非常適合于菜單的編程,如下例。

例4.8

在顯示器上顯示一個(gè)菜單程序的模型。程序:

#include<conio.h>

#include<stdio.h>

voidmain()

{

voiddummy();

charch;

printf("1.輸入記錄\n");

printf("2.記錄列表\n");

printf("3.刪除記錄\n");

printf("4.修改記錄\n");

printf("請(qǐng)輸入選擇:\n");

ch=getche();

switch(ch)

{

case′1′:printf("輸入記錄\n");

dummy();break;

case′2′:printf("記錄列表\n");

dummy();break;

case′3′:printf("刪除記錄\n");

dummy();break;

case′4′:printf("修改記錄\n");

dummy();break;

default:printf("選擇錯(cuò)!\n");

}

}

voidfun1(){}

voidfun2(){}

voidfun3(){}

voidfun4(){}

運(yùn)行:

1.輸入記錄

2.記錄列表

3.刪除記錄

4.修改記錄請(qǐng)輸入選擇(1~4):↙

1輸入記錄說(shuō)明:程序運(yùn)行后,當(dāng)執(zhí)行到ch=getche()時(shí),屏幕停留在此,等待用戶鍵入字符。當(dāng)我們從鍵盤(pán)鍵入字符“1”后,開(kāi)始執(zhí)行“case′1′:”后的語(yǔ)句段。程序中的fun1、fun2、fun3和fun4四個(gè)函數(shù)分別表示在輸入相應(yīng)選項(xiàng)時(shí)將執(zhí)行的函數(shù),為簡(jiǎn)化程序,我們?cè)谠摾袑⑦@四個(gè)函數(shù)定義為空函數(shù),讀者可在學(xué)習(xí)了函數(shù)的相關(guān)知識(shí)后補(bǔ)充完善。程序前面的5個(gè)printf語(yǔ)句用于顯示提示信息即菜單,switch語(yǔ)句進(jìn)行判斷,case后的常量必須是字符常量。當(dāng)然′1′可以寫(xiě)成49,但若寫(xiě)成1則匹配不上,所以case后的常量不能是1,2,3,4。由于在4個(gè)分支中只執(zhí)行1個(gè)分支,因此每個(gè)case結(jié)束都必須有break語(yǔ)句跳出switch語(yǔ)句。當(dāng)ch與′1′、′2′、′3′、′4′都不匹配時(shí),就執(zhí)行default語(yǔ)句并結(jié)束switch語(yǔ)句。4.4程序設(shè)計(jì)舉例例4.9編寫(xiě)一個(gè)可由用戶鍵入簡(jiǎn)單表達(dá)式的程序,形式如下:

numberoperatornumber該程序要計(jì)算該表達(dá)式并以兩位小數(shù)顯示結(jié)果。我們要識(shí)別的運(yùn)算符operator為加、減、乘、除。程序:

#include<stdio.h>

voidmain()

{

floatvalue1,value2;

charoperator;

printf("Inputyourexpression:\n");

scanf("%f%c%f",&value1,&operator,&value2);

if(operator==′+′)

printf("%.2f\n",value1+value2);

elseif(operator==′-′)

printf("%.2f\n",value1-value2);

elseif(operator==′*′)

printf("%.2f\n",value1*value2);

elseif(operator==′/′)

if(value2==0.0)

printf("Divisionbyzero.\n");

esle

printf("%.2f\n",value1/value2);

else

printf("Unknownoperator.\n");

}運(yùn)行:

Inputyourexpression:

123.5+59.3↙

182.80再次運(yùn)行:

Inputyourexpression:

198.7/0↙

Divisionbyzero.再次運(yùn)行:

Inputyourexpression:

125$28↙

Unknownoperator.例4.10用switch語(yǔ)句改寫(xiě)例4.9。

#include<stdio.h>

voidmain()

{

floatvalue1,value2;

charoperator;

printf("Inputyourexpression:\n");

scanf("%f%c%f",&value1,&operator,&value2);

switch(operator)

{

case′+′:printf("%.2f\n",value1+value2);

break;

case′-′:printf("%.2f\n",value1-value2);

break;

case′*′:printf("%.2f\n",value1*value2);

break;

case′/′:if(value2==0.0)

printf("Divisionbyzero.\n");

else

printf("%.2f\n",value1/value2);

break;

default:printf("Unknownoperator.\n");

}

}本程序運(yùn)行結(jié)果與例4.9的結(jié)果完全一樣。

例4.11輸入一個(gè)字符,請(qǐng)判斷是字母、數(shù)字還是特殊字符。程序:

#include<stdio.h>

#include<conio.h>

voidmain()

{

charch;

printf("請(qǐng)輸入一個(gè)字符:");/*在雙引號(hào)內(nèi)的字符串中,可以出現(xiàn)漢字,不影響程序運(yùn)行*/

ch=getche();

if((ch>=′a′&&ch<=′z′)||(ch>=′A′&&ch<=′Z′))

printf("\n它是一個(gè)字母!\n");/*注意前后的\n,養(yǎng)成良好的編輯習(xí)慣*/

elseif(ch>=′0′&&ch<=′9′)

printf("\n它是一個(gè)數(shù)字!\n");

esle

printf("\n它是一個(gè)特殊字符!\n");

}運(yùn)行:請(qǐng)輸入一個(gè)字符:A它是一個(gè)字母!再次運(yùn)行:請(qǐng)輸入一個(gè)字符:+它是一個(gè)特殊字符!說(shuō)明:本程序能鍵入可見(jiàn)的ASCII字符有95個(gè),由于需羅列的情況太多而不適合用switch語(yǔ)句。例4.12假設(shè)獎(jiǎng)金稅率如下(a代表獎(jiǎng)金,r代表稅率): a<500部分 r=0

500≤a<1000部分 r=5% 1000≤a<2000部分 r=8% 2000≤a<3000部分 r=10% a≥3000部分 r=15

溫馨提示

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