版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房地產(chǎn)買賣與房地產(chǎn)權(quán)屬轉(zhuǎn)移服務(wù)協(xié)議3篇
- 2025-2030全球電磁運(yùn)動(dòng)追蹤系統(tǒng)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)交易平臺(tái)系統(tǒng)軟件行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 二零二五年度農(nóng)業(yè)產(chǎn)業(yè)化按揭服務(wù)協(xié)議3篇
- 2025年度時(shí)尚品牌開(kāi)業(yè)慶典全方位服務(wù)合同書2篇
- 二零二五年度護(hù)理信息化系統(tǒng)建設(shè)與維護(hù)合同3篇
- 二零二五版多媒體展廳設(shè)計(jì)制作與安裝服務(wù)合同2篇
- 2025年度陪護(hù)服務(wù)投訴處理合同3篇
- 輕便型假肢行業(yè)深度研究報(bào)告
- 2025年度高效施工土方運(yùn)輸工程承包合同樣本2篇
- 2024版中國(guó)臺(tái)球行業(yè)市場(chǎng)規(guī)模及投資策略研究報(bào)告(智研咨詢)
- 2024年國(guó)家公安部直屬事業(yè)單位招錄人民警察及工作人員696人筆試(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 初中必背古詩(shī)文138首
- 上海生活垃圾分類現(xiàn)狀調(diào)查報(bào)告
- 小升初中簡(jiǎn)歷模板
- 【深信服】PT1-AF認(rèn)證考試復(fù)習(xí)題庫(kù)(含答案)
- GB/T 43824-2024村鎮(zhèn)供水工程技術(shù)規(guī)范
- 2024年10月自考00058市場(chǎng)營(yíng)銷學(xué)押題及答案匯總
- 初中地理學(xué)法指導(dǎo)課
- 體檢中心質(zhì)控工作計(jì)劃
- 車路云一體化智能網(wǎng)聯(lián)汽車產(chǎn)業(yè)產(chǎn)值增量預(yù)測(cè)-2024-03-智能網(wǎng)聯(lián)
評(píng)論
0/150
提交評(píng)論