《程序設(shè)計(jì)基礎(chǔ)》課件第4章_第1頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第4章_第2頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第4章_第3頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第4章_第4頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第4章_第5頁(yè)
已閱讀5頁(yè),還剩87頁(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)介

第4章選擇程序設(shè)計(jì)4.1關(guān)系運(yùn)算和邏輯運(yùn)算

4.2分支流程控制語(yǔ)句

4.3選擇語(yǔ)句的嵌套

4.4選擇結(jié)構(gòu)程序設(shè)計(jì)舉例

習(xí)題

4.1關(guān)系運(yùn)算和邏輯運(yùn)算

關(guān)系運(yùn)算是邏輯運(yùn)算中比較簡(jiǎn)單的一種。所謂“關(guān)系運(yùn)算”,實(shí)際上是“比較運(yùn)算”。將兩個(gè)值進(jìn)行比較,判斷其比較的結(jié)果是否符合給定的條件。例如,a>3是一個(gè)關(guān)系表達(dá)式,大于號(hào)(>)是一個(gè)關(guān)系運(yùn)算符,如果a的值為5,則滿足給定的“a>3”條件,因此關(guān)系表達(dá)式的值為“真”(即“條件滿足”);如果a的值為2,不滿足“a>3”條件,則稱關(guān)系表達(dá)式的值為“假”。4.1.1關(guān)系運(yùn)算符和關(guān)系表達(dá)式

C語(yǔ)言提供6種關(guān)系運(yùn)算符:

①<?(小于);

②<=?(小于或等于);

③>?(大于);

④>=?(大于或等于);

⑤==(等于);

⑥!=(不等于)。關(guān)于優(yōu)先次序:

(1)前4種關(guān)系運(yùn)算符(<,<=,>,>=)的優(yōu)先級(jí)別相同,后2種的也相同。前4種高于后2種。例如,“>”優(yōu)先于“==”,而“>”與“<”優(yōu)先級(jí)相同。

(2)關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符。

(3)關(guān)系運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符。

以上關(guān)系見(jiàn)圖4-1。

用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式(可以是算術(shù)表達(dá)式或關(guān)系表達(dá)式、邏輯表達(dá)式、賦值表達(dá)式、字符表達(dá)式等)連接起來(lái)的式子,稱為關(guān)系表達(dá)式。例如,下面都是合法的關(guān)系表達(dá)式:

a>b,

a+b>b+c,

(a=3)>(b=5),

'a'<'b',

(a>b)>(b<c)圖4-1優(yōu)先次序圖1關(guān)系表達(dá)式的值是一個(gè)邏輯值,即“真”或“假”。例如,關(guān)系表達(dá)式“5==3”的值為“假”,“5>=0”的值為“真”。C語(yǔ)言沒(méi)有邏輯型數(shù)據(jù)(Pascal語(yǔ)言以True表示“真”,以False表示“假”。Pascal和FORTRAN等語(yǔ)言都有邏輯型變量和邏輯型常量),以1代表“真”,以“0”代表“假”。例如,a=3,b=2,c=1,則:

關(guān)系表達(dá)式“a>b”的值為“真”,表達(dá)式的值為1。

關(guān)系表達(dá)式?(a>b)==c的值為“真”(因?yàn)閍>b的值為1,等于c的值),表達(dá)式的值為1。

關(guān)系表達(dá)式b+c<a的值為“假”,表達(dá)式的值為0。4.1.2邏輯運(yùn)算符和邏輯表達(dá)式

用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)的式子就是邏輯表達(dá)式。在BASIC和Pascal語(yǔ)言中有以下形式的邏輯表達(dá)式(AND是邏輯運(yùn)算符):

(a>b)AND(x>y)

如果a>b且x>y,則上述邏輯表達(dá)式的值為“真”。

下面介紹C語(yǔ)言中的邏輯運(yùn)算符和邏輯運(yùn)算。

C語(yǔ)言提供三種邏輯運(yùn)算符:

①&&邏輯與(相當(dāng)于其他語(yǔ)言中的AND);

②||邏輯或(相當(dāng)于其他語(yǔ)言中的OR);

③!邏輯非(相當(dāng)于其他語(yǔ)言中的NOT)?!?&”和“||”是“雙目(元)運(yùn)算符”,它要求有兩個(gè)運(yùn)算量(操作數(shù)),如(a>b)&&(x>y),(a>b)||(x>y)。“!”是“一目(元)運(yùn)算符”,只要求有一個(gè)運(yùn)算量,如!(a>b)。

邏輯運(yùn)算舉例如下:

a&&b //若a、b為真,則a&&b為真

a||b //若a、b之一為真,則a||b為真

!a //若a為真,則?!a為假

表4-1為邏輯運(yùn)算的“真值表”。用它表示當(dāng)a和b的值為不同組合時(shí),各種邏輯運(yùn)算所得到的值。表4-1邏輯運(yùn)算的真值表1邏輯運(yùn)算符的優(yōu)先次序如下:

(1)?!(非)→&&(與)→(或),即“!”為三者中最高的。

(2)邏輯運(yùn)算符中的“&&”和“||”低于關(guān)系運(yùn)算符,“!”高于算術(shù)運(yùn)算符,見(jiàn)圖4-2。圖4-2優(yōu)先次序圖2例如:

(a>b)&&(x>y) //可寫成a>b&&x>y

(a==b)||(x==y) //可寫成a==b||x==y

(!a)||(a>b) //可寫成!a||a>b

如前所述,邏輯表達(dá)式的值應(yīng)該是一個(gè)邏輯量“真”或“假”。C語(yǔ)言編譯系統(tǒng)在給出邏輯運(yùn)算結(jié)果時(shí),以數(shù)值1代表“真”,以0代表“假”;但在判斷一個(gè)量是否為“真”時(shí),以0代表“假”,以非0代表“真”,即將一個(gè)非零的數(shù)值認(rèn)作為“真”。例如:

(1)若a=4,則!a的值為0。因?yàn)閍的值為非0,被認(rèn)作“真”,對(duì)它進(jìn)行“非”運(yùn)算,得“假”,“假”以0代表。

(2)若a=4,b=5,則a&&b的值為1。因?yàn)閍和b均為非0,被認(rèn)為是“真”,因此a&&b的值也為“真”,值為1。

(3)?a、b值同前,a||b的值為1。

(4)?a、b值同前,!a||b的值為1。

(5)?4&&0||2的值為1。通過(guò)這幾個(gè)例子可以看出,由系統(tǒng)給出的邏輯運(yùn)算結(jié)果不是0就是1,不可能是其他數(shù)值。而在邏輯表達(dá)式中作為參加邏輯運(yùn)算的運(yùn)算對(duì)象(操作數(shù))可以是0(“假”)或任何非0的數(shù)值(按“真”對(duì)待)。如果在一個(gè)表達(dá)式中不同位置上出現(xiàn)數(shù)值,應(yīng)區(qū)分哪些作為數(shù)值運(yùn)算或關(guān)系運(yùn)算的對(duì)象,哪些作為邏輯運(yùn)算的對(duì)象。例如:

5>3&&8<4-!0表達(dá)式自左至右掃描求解。首先處理“5>3”(因?yàn)殛P(guān)系運(yùn)算符優(yōu)先于&&)。在關(guān)系運(yùn)算符兩側(cè)的5和3作為數(shù)值參加關(guān)系運(yùn)算,“5>3”的值為1。再進(jìn)行“1>3&&8<4-!0”的運(yùn)算,8的左側(cè)為“&&”,右側(cè)為“<”運(yùn)算符,根據(jù)優(yōu)先規(guī)則,應(yīng)先進(jìn)行“<”的運(yùn)算,即先進(jìn)行“8<4-!0”的運(yùn)算?,F(xiàn)在4的左側(cè)為“<”,右側(cè)為“-”運(yùn)算符,而“-”優(yōu)先于“<”,因此應(yīng)先進(jìn)行“4-!0”的運(yùn)算。由于“!”的級(jí)別最高,因此先進(jìn)行“!0”的運(yùn)算,得到結(jié)果1。然后進(jìn)行“4-1”的運(yùn)算,得結(jié)果3;再進(jìn)行“8<3”的運(yùn)算,得0;最后進(jìn)行“1&&0”的運(yùn)算,得0。實(shí)際上,邏輯運(yùn)算符兩側(cè)的運(yùn)算對(duì)象不但可以是0和1,或者是0和非0的整數(shù),也可以是任何類型的數(shù)據(jù),包括字符型、實(shí)型或指針型等。系統(tǒng)最終以0和非0來(lái)判定它們屬于“真”或“假”。例如?'c'&&'d'?的值為1(因?yàn)?'c'?和?'d'?的ASCII值都不為0,按“真”處理)。

可以將表4-1改寫成表4-2的形式。表4-2邏輯運(yùn)算的真值表2在邏輯表達(dá)式的求解中,并不是所有邏輯運(yùn)算符都被執(zhí)行的,只是在必須執(zhí)行下一個(gè)邏輯運(yùn)算符才能求出表達(dá)式的解時(shí),才執(zhí)行該運(yùn)算符。例如:

(1)?a&&b&&c:只有a為真(非0)時(shí),才需要判別b的值;只有a和b都為真的情況下才需要判別c的值。只要a為假,就不必判別b和c(此時(shí)整個(gè)表達(dá)式已確定為假)。如果a為真,b為假,則不判別c。執(zhí)行過(guò)程見(jiàn)圖4-3。

(2)?a||b||c:只要a為真(非0),就不必判斷b和c;只有a為假,才判別b;a和b都為假才判別c。執(zhí)行過(guò)程見(jiàn)圖4-4。圖4-3第一種情況執(zhí)行過(guò)程圖圖4-4第二種情況執(zhí)行過(guò)程圖也就是說(shuō),對(duì)&&運(yùn)算符來(lái)說(shuō),只有a≠0,才繼續(xù)進(jìn)行右邊的運(yùn)算;對(duì)運(yùn)算符‖來(lái)說(shuō),只有a=0,才繼續(xù)進(jìn)行其右邊的運(yùn)算。因此,如果有下面的邏輯表達(dá)式:

(m=a>b)

&&

(n=c>d)

當(dāng)a=1,b=2,c=3,d=4,m和n的原值為1時(shí),由于“a>b”的值為0,因此m=0,而“n=c>d”不被執(zhí)行,因此n的值不是0而仍保持原值1。這點(diǎn)應(yīng)加以注意。 4.2分支流程控制語(yǔ)句

C語(yǔ)言中,分支流程控制語(yǔ)句主要有三種,if語(yǔ)句、switch語(yǔ)句和條件運(yùn)算符。

4.2.1if語(yǔ)句

if語(yǔ)句用來(lái)判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種(或多種)操作之一。

C語(yǔ)言提供了三種形式的if語(yǔ)句:

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

例如:

if(x>y)printf("%d",x);

這種if語(yǔ)句的執(zhí)行過(guò)程見(jiàn)圖4-5(a)。②if(表達(dá)式)語(yǔ)句1

else語(yǔ)句2

例如:

if(x>y)printf("%d",x);

elseprintf("%d",y);

這種if語(yǔ)句的執(zhí)行過(guò)程見(jiàn)圖4-5(b)。圖4-5if語(yǔ)句的執(zhí)行過(guò)程圖1③if(表達(dá)式1)語(yǔ)句1

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

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

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

else語(yǔ)句n

這種語(yǔ)句的執(zhí)行過(guò)程見(jiàn)圖4-6。圖4-6if語(yǔ)句的執(zhí)行過(guò)程2例如:

if(number>500)cost=0.15;

elseif(number>300)cost=0.10;

elseif(number>100)cost=0.075;

elseif(number>50)cost=0.05;

elsecost=0;

說(shuō)明:

(1)三種形式的if語(yǔ)句中在if后面都有“表達(dá)式”,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。例如:

if(a==b&&x==y)printf("a=b,x=y");在執(zhí)行if語(yǔ)句時(shí)先對(duì)表達(dá)式求解,若表達(dá)式的值為0,則按“假”處理;若表達(dá)式的值為非0,則按“真”處理;執(zhí)行指定的語(yǔ)句。假如有以下if語(yǔ)句:

if(3)printf("O.k.");

該語(yǔ)句是合法的,執(zhí)行結(jié)果輸出“O.k.”。因?yàn)楸磉_(dá)式的值為3,按“真”處理。由此可見(jiàn),表達(dá)式的類型不限于邏輯表達(dá)式,可以是任意的數(shù)值類型(包括整型、實(shí)型、字符型、指針型數(shù)據(jù))。例如,下面的if語(yǔ)句也是合法的:

if('a')printf("%d",'a');

該語(yǔ)句的執(zhí)行結(jié)果為輸出?'a'?的ASCII碼97。

(2)第②、第③種形式的if語(yǔ)句中,在每個(gè)else前面有一分號(hào),整個(gè)語(yǔ)句結(jié)束處有一分號(hào)。例如:

這是由于分號(hào)是C語(yǔ)句中不可缺少的部分,這個(gè)分號(hào)是if語(yǔ)句中的內(nèi)嵌語(yǔ)句所要求的。如果無(wú)此分號(hào),則出現(xiàn)語(yǔ)法錯(cuò)誤。但應(yīng)注意,不要誤認(rèn)為上面是兩個(gè)語(yǔ)句(if語(yǔ)句和else語(yǔ)句),它們都屬于同一個(gè)if語(yǔ)句。else子句不能作為語(yǔ)句單獨(dú)使用,它必須是if語(yǔ)句的一部分,與if配對(duì)使用。

(3)在if和else后面可以只含一個(gè)內(nèi)嵌的操作語(yǔ)句(如上例),也可以有多個(gè)操作語(yǔ)句,此時(shí)用花括號(hào)“{}”將幾個(gè)語(yǔ)句括起來(lái)構(gòu)成一個(gè)復(fù)合語(yǔ)句,如:

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=%6.2f",area);}

elseprintf("itisnotatrilateral");

注意在第3行的花括號(hào)“}”外面不需要再加分號(hào)。因?yàn)閧}內(nèi)是一個(gè)完整的復(fù)合語(yǔ)句,不需另附加分號(hào)。

例4-1

輸入兩個(gè)實(shí)數(shù),按代數(shù)值由小到大的次序輸出這兩個(gè)數(shù)。

這個(gè)問(wèn)題的算法很簡(jiǎn)單,只需要作一次比較即可。對(duì)類似這樣簡(jiǎn)單的問(wèn)題可以不必先寫出算法或畫流程圖,而直接編寫程序?;蛘哒f(shuō),算法在編程者的腦子里,相當(dāng)于在算術(shù)運(yùn)算中對(duì)簡(jiǎn)單的問(wèn)題可以“心算”而不必在紙上寫出來(lái)。

/*源程序4-1*/

#include"stdio.h"

main()

{

floata,b,t;

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

if(a>b)

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

printf("%5.2f,%5.2f",a,b);

}程序運(yùn)行結(jié)果如下:

例4-2

輸入3個(gè)數(shù)a,b,c,要求按由小到大的順序輸出。

解此題的算法比上一題稍復(fù)雜一些。可以用偽代碼寫出算法:

ifa>b將a和b對(duì)換(a是a,b中的小者)

ifa>c將a和c對(duì)換(a是a,c中的小者,因此a是三者中最小者)

ifb>c將b和c對(duì)換(b是b,c中的小者,也是三者中次小者)

然后順序輸出a,b,c即可。

按此算法編寫程序:

/*源程序4-2*/

#include"stdio.h"

main()

{

floata,b,c,t;

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

if(a>b)

{t=a;a=b;b=t;} /*實(shí)現(xiàn)a和b的互換*/

if(a>c)

{t=a;a=c;c=t;} /*實(shí)現(xiàn)a和c的互換*/

if(b>c)

{t=b;b=c;c=t;} /*實(shí)現(xiàn)b和c的互換*/

printf("%5.2f,%5.2f,%5.2f",a,b,c);

}

程序運(yùn)行結(jié)果如下:4.2.2switch語(yǔ)句

switch語(yǔ)句是多分支選擇語(yǔ)句。if語(yǔ)句只有兩個(gè)分支可供選擇,而實(shí)際問(wèn)題中常常需要用到多分支的選擇。例如,學(xué)生成績(jī)分類(90分以上為a等,80~89分為b等,70~79分為c等,…),人口統(tǒng)計(jì)分類(按年齡分為老、中、青、少、兒童),工資統(tǒng)計(jì)分類,銀行存款分類,等等。

當(dāng)然這些都可以用嵌套的if語(yǔ)句來(lái)處理,但如果分支較多,則嵌套的if語(yǔ)句層數(shù)多,程序冗長(zhǎng)而且可讀性降低。C語(yǔ)言提供switch語(yǔ)句可直接處理多分支選擇,相當(dāng)于Pascal語(yǔ)言中的case語(yǔ)句。它的一般形式如下:switch(表達(dá)式)

{

case常量表達(dá)式1:語(yǔ)句1

case常量表達(dá)式2:語(yǔ)句2

case常量表達(dá)式n:語(yǔ)句n

default: ?語(yǔ)句n+1

}例如,要求按照考試成績(jī)的等級(jí)打印出百分制分?jǐn)?shù)段,可以用switch語(yǔ)句實(shí)現(xiàn):

switch(grade)

{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");

}說(shuō)明:

(1)?switch后面括號(hào)內(nèi)的“表達(dá)式”在ANSI標(biāo)準(zhǔn)中允許為任何類型。

(2)當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式的值相等時(shí),就執(zhí)行此case后面的語(yǔ)句;若所有的case中的常量表達(dá)式的值都沒(méi)有與表達(dá)式的值匹配的,就執(zhí)行default后面的語(yǔ)句。

(3)每一個(gè)case的常量表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)互相矛盾的現(xiàn)象(對(duì)表達(dá)式的同一個(gè)值,有兩種或多種執(zhí)行方案)。

(4)各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:…”,再出現(xiàn)“case'd':…”,然后是“case'a':…”。

(5)執(zhí)行完一個(gè)case后面的語(yǔ)句后,流程控制轉(zhuǎn)移到下一個(gè)case繼續(xù)執(zhí)行。“case常量表達(dá)式”只是起語(yǔ)句標(biāo)號(hào)作用,并不是在該處進(jìn)行條件判斷。在執(zhí)行switch語(yǔ)句時(shí),根據(jù)switch后面表達(dá)式的值找到匹配的入口標(biāo)號(hào),就從此標(biāo)號(hào)開(kāi)始執(zhí)行下去,不再進(jìn)行判斷。例如,上面的例子中,若grade的值等于?'a',則將連續(xù)輸出:

85~100

70~84

60~69

<60

error

因此,應(yīng)該在執(zhí)行一個(gè)case分支后,使流程跳出switch結(jié)構(gòu),即終止switch語(yǔ)句的執(zhí)行??梢杂靡粋€(gè)break語(yǔ)句來(lái)達(dá)到此目的。將上面的switch結(jié)構(gòu)改寫如下:

switch(grade)

{

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");

}

最后一個(gè)分支(default)可以不加break語(yǔ)句。如果grade的值為'b',則只輸出“70~84”。流程圖見(jiàn)圖4-7。圖4-7多分支語(yǔ)句執(zhí)行過(guò)程在case后面雖然包含一個(gè)以上執(zhí)行語(yǔ)句,但可以不必用花括號(hào)括起來(lái),會(huì)自動(dòng)順序執(zhí)行本case后面所有的執(zhí)行語(yǔ)句。當(dāng)然,加上花括號(hào)也可以。

(6)多個(gè)case可以共用一組執(zhí)行語(yǔ)句,如:

case

'a':

case

'b':

case

'c':

printf(">60\n");break;

grade的值為'a'、'b'或'c'時(shí),都執(zhí)行同一組語(yǔ)句。4.2.3條件運(yùn)算符

if語(yǔ)句中,在表達(dá)式為“真”和“假”,且都只執(zhí)行一個(gè)賦值語(yǔ)句給同一個(gè)變量賦值時(shí),可以用簡(jiǎn)單的條件運(yùn)算符來(lái)處理。例如,若有以下if語(yǔ)句:

if

(a>b)

max=a;

else

max=b;

則可以用下面的條件運(yùn)算符來(lái)處理:

max=(a>b)?a:b;

其中(a>b)?a:b是一個(gè)“條件表達(dá)式”。它是這樣執(zhí)行的:如果(a>b)條件為真,則條件表達(dá)式取值a,否則取值b。條件運(yùn)算符要求有3個(gè)操作對(duì)象,稱為三目(元)運(yùn)算符,它是C語(yǔ)言中唯一的一個(gè)三目運(yùn)算符。條件表達(dá)式的一般形式為

表達(dá)式1?表達(dá)式2:表達(dá)式3

它的執(zhí)行過(guò)程見(jiàn)圖4-8。圖4-8條件表達(dá)式的執(zhí)行過(guò)程說(shuō)明:

(1)條件運(yùn)算符的執(zhí)行順序:先求解表達(dá)式1,若為非0(真)則求解表達(dá)式2,此時(shí)表達(dá)式2的值就作為整個(gè)條件表達(dá)式的值。若表達(dá)式1的值為0(假),則求解表達(dá)式3,表達(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)算符都低,因此對(duì)于

max=(a>b)?a:b

括號(hào)可以不要,可寫成

max=a>b?a:b

如果有

a>b?a:b+1

則相當(dāng)于a>b?a:(b+1),而不相當(dāng)于(a>b?a:b)+1。

(3)條件運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆薄H绻幸韵聴l件表達(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。

(4)條件表達(dá)式不能取代一般的if語(yǔ)句,只有在if語(yǔ)句中內(nèi)嵌的語(yǔ)句為賦值語(yǔ)句(且兩個(gè)分支都給同一個(gè)變量賦值)時(shí)才能代替if語(yǔ)句。像下面的if語(yǔ)句就無(wú)法用一個(gè)條件表達(dá)式代替:

if(a>b)

printf("%d",a);

elseprintf("%d",b);

上面語(yǔ)句可以用下面語(yǔ)句代替:

printf("%d",a>b?a:b);

即將條件表達(dá)式的值輸出。

(5)條件表達(dá)式中,表達(dá)式1的類型可以與表達(dá)式2和表達(dá)式3的類型不同,如:

x?'a':'b'

x是整型變量,若x=0,則條件表達(dá)式的值為?'b'。表達(dá)式2和表達(dá)式3的類型也可以不同,此時(shí)條件表達(dá)式的值的類型為二者中較高的類型。如:

x>y?1:1.5

如果x≤y,則條件表達(dá)式的值為1.5;若x>y,值應(yīng)為1,由于1.5是實(shí)型,比整型高,因此,將1轉(zhuǎn)換成實(shí)型值1.0。

例4-3

輸入一個(gè)字符,判別它是否為大寫字母。如果是,則將它轉(zhuǎn)換成小寫字母;如果不是,則不轉(zhuǎn)換。然后輸出最后得到的字符。

關(guān)于大小寫字母之間的轉(zhuǎn)換方法,在本書前例中已做了介紹,因此可直接編寫程序:

/*源程序4-3*/

#include"stdio.h"

main()

{

charch;

scanf("%c",&ch);

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

printf("%c",ch);

}程序運(yùn)行結(jié)果如下:

條件表達(dá)式中的(ch+32),其中32是小寫字母和大寫字母ASCII碼的差值。

4.3選擇語(yǔ)句的嵌套

在這里介紹if語(yǔ)句的嵌套。

在if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句,稱為if語(yǔ)句的嵌套,一般形式如下:應(yīng)當(dāng)注意if與else的配對(duì)關(guān)系。else總是與它上面最近的if配對(duì)。假如寫成:編程序者把else寫在與第一個(gè)if(外層if)同一列上,希望else與第一個(gè)if對(duì)應(yīng),但實(shí)際上else是與第二個(gè)if配對(duì)的,因?yàn)樗鼈兿嗑嘧罱R虼俗詈檬箖?nèi)嵌if語(yǔ)句也包含else部分(如本節(jié)(4.2.1節(jié))最早列出的形式),這樣if的數(shù)目和else的數(shù)目相同,從內(nèi)層到外層一一對(duì)應(yīng),不致出錯(cuò)。

如果if與else的數(shù)目不一樣,那么為實(shí)現(xiàn)程序設(shè)計(jì)者的企圖,可以加花括號(hào)來(lái)確定配對(duì)關(guān)系,例如:

if()

{if()語(yǔ)句1}(內(nèi)嵌if)

else語(yǔ)句2

這時(shí){}限定了內(nèi)嵌if語(yǔ)句的范圍,因此else與第一個(gè)if配對(duì)。

例4-4

有一函數(shù):

編一程序,輸入一個(gè)值,輸出值。可以先寫出算法:

輸入x

若x<0,y=-1;

若x=0,y=0;

若x>0,y=1

輸出y或

輸入x

若x<0,y=-1;

否則

若x=0,y=0;

輸出y

也可以用流程圖表示,見(jiàn)圖4-9。圖4-9程序1流程圖有以下幾個(gè)程序,請(qǐng)讀者判斷哪個(gè)是正確的。

程序1:

/*源程序4-4*/

#include"stdio.h"

main()

{

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);

}程序2:將上面程序的if語(yǔ)句(第4~6行)改為(流程圖見(jiàn)圖4-10):

if

(x>=0)

if

(x>0)y=1;

else

y=0;

else

y=-1;圖4-10程序2流程圖程序3:將上述if語(yǔ)句改為(流程圖見(jiàn)圖4-11):圖4-11程序3流程圖

y=-1;

if(x!=0)

if(x>0)

y=1;

elsey=0;

程序4:將上述語(yǔ)句改為(流程圖見(jiàn)圖4-12):

y=0;

if(x>=0)

if(x>0)

y=1;

elsey=-1;圖4-12程序4流程圖只有程序1和程序2是正確的。程序1體現(xiàn)了圖4-9的流程,顯然它是正確的。程序2的流程圖見(jiàn)圖4-10,它也能實(shí)現(xiàn)題目的要求。程序3的流程圖見(jiàn)圖4-11,程序4的流程圖見(jiàn)圖4-12,它們不能實(shí)現(xiàn)題目的要求。請(qǐng)注意程序中的else與if的配對(duì)關(guān)系。例如程序3中的else子句是和它上一行內(nèi)嵌的if語(yǔ)句配對(duì)的,而不與第2行的if語(yǔ)句配對(duì)。為了使邏輯關(guān)系清晰,避免出錯(cuò),一般把內(nèi)嵌的if語(yǔ)句放在外層的else子句中(如程序1那樣),這樣由于有外層的else相隔,內(nèi)嵌的else不會(huì)被誤認(rèn)為和外層的if配對(duì),而只能與內(nèi)嵌的if配對(duì),這樣就不會(huì)搞混,如像程序3和程序4那樣寫就很容易出錯(cuò)。

4.4選擇結(jié)構(gòu)程序設(shè)計(jì)舉例

例4-5

寫程序,判斷某一年是否是閏年。

用圖4-13來(lái)表示判別閏年的算法。以變量leap代表是否閏年的信息。若某年為閏年,則令leap=1;若為非閏年,則令leap=0。最后判斷l(xiāng)eap是否為1(真),若是,則輸出“閏年”信息。圖4-13判別閏年的算法(N-S圖)

/*源程序4-5*/

#include"stdio.h"

main()

{

intyear,leap;

scanf("%d",&year);

if(year%4==0)

{if

(year%100==0)

{if

(year%400==0)

leap=1;

elseleap=0;}

elseleap=1;}

else

leap=0;

if(leap)

printf("%dis",year);

else

printf("%disnot",year);

printf("aleapyear.\n");

}

程序運(yùn)行結(jié)果如下:例4-6

求方程ax2+bx+c=0的解。

實(shí)際上應(yīng)該有以下幾種可能:

(1)?a=0,不是二次方程。

(2)?b2-4ac=0,有兩個(gè)相等實(shí)根。

(3)?b2-4ac>0,有兩個(gè)不等實(shí)根。

(4)?b2-4ac<0,有兩個(gè)共軛復(fù)根。

畫出算法流程圖,如圖4-14所示。圖4-14解方程根的算法(N-S圖)

/*源程序4-6*/

#include"stdio.h"

#include"math.h"

main()

{

floata,b,c,d,disc,x1,x2,realpart,imagpart;

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

printf("Theequation");

if(fabs(a)<=le-6)

printf("isnotaquadratic");else

disc=b*b-4*a*c;

if(fabs(disc)<=le-6)

printf("hastwoequalroots:%8.4\n",-b/(2*a));

elseif(disc>le-6)

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

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

printf("hasdistinctrealroots:%8.4fand%8.4f\n",x1,x2);

}

else

{

realpart=-b/(2*a);

imagpart=sqrt(-disc)/(2*a);

printf("hascomplexroots:\n");

printf("%8.4f+%8.4fi\n",realpart,imagpart);

printf("%8.4f-%8.4fi\n",realpart,imagpart);

}

}程序中用disc代表b2-4ac。先計(jì)算disc的值,以減少以后的重復(fù)計(jì)算。對(duì)于判斷b2-4ac是否等于0時(shí),要注意一個(gè)問(wèn)題:由于disc(即b2-4ac)是實(shí)數(shù),而實(shí)數(shù)在計(jì)算和存儲(chǔ)時(shí)會(huì)有一些微小的誤差,因此不能直接進(jìn)行如下判斷:if(disc==0),因?yàn)檫@樣可能會(huì)出現(xiàn)本來(lái)是零的量,由于上述誤差而被判別為不等于零,從而導(dǎo)致結(jié)果錯(cuò)誤。所以采取的辦法是判別disc的絕對(duì)值(fabs(disc))是否小于一個(gè)很小的數(shù)(例如10-6),如果小于此數(shù),就認(rèn)為disc=0。程序中以realpart代表實(shí)部p,以imagpart代表虛部q,以增加可讀性。程序運(yùn)行結(jié)果如下:例4-7運(yùn)輸公司對(duì)用戶計(jì)算運(yùn)費(fèi)。路程(S)越遠(yuǎn),每公里運(yùn)費(fèi)越低。標(biāo)準(zhǔn)如下:

S<250?km 沒(méi)有折扣

250≤S<500 2%折扣

500≤S<10005%折扣

1000≤S<2000 8%折扣

2000≤S<3000 10%折扣

3000≤S 15%折扣設(shè)每公里每噸貨物的基本運(yùn)費(fèi)為P(Price的縮寫),貨物重為w(weight的縮寫),距離為S,折扣為d(discount的縮寫),則總運(yùn)費(fèi)f(freight的縮寫)的計(jì)算公式為

f=P*w*S*(1-d)

分析此問(wèn)題,折扣的變化是有規(guī)律的:從圖4-15可以看到,折扣的“變化點(diǎn)”都是250的倍數(shù)(250,500,1000,2000,3000)。利用這一特點(diǎn),可以在橫軸上加一種坐標(biāo)c,c的值為S/250。c代表250的倍數(shù)。當(dāng)c<1時(shí),表示S<250,無(wú)折扣;1≤c<2時(shí),表示250≤S<500,折扣d=2%;2≤c<4時(shí),d=5%;4≤c<8時(shí),d=8%;8≤c<12時(shí),d=10%;c≥12時(shí),d=15%。圖4-15折扣變化規(guī)律圖

/*源程序4-7*/

#include"stdio.h"

main()

{

intc,S;

floatP,w,d,f;

scanf("%f,%f,%d",&P,&w,&S);

if(S>=3000)c=12;

else

c=S/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)論