官术网_书友最值得收藏!

3.2 選擇結(jié)構(gòu)程序

選擇結(jié)構(gòu)程序體現(xiàn)了程序的判斷能力。運行程序時根據(jù)具體條件決定程序走向,即通過判斷條件決定哪部分程序運行,哪部分不運行。實際中經(jīng)常遇到這類問題,如電表分時段計費,收入繳稅問題等,均屬于選擇結(jié)構(gòu)程序設(shè)計問題。

C語言提供了實現(xiàn)選擇結(jié)構(gòu)功能的語句主要有if和switch語句。

3.2.1 if語句

if語句是選擇結(jié)構(gòu)程序設(shè)計中最常用的一種語句,通常我們也把if語句稱為條件選擇語句。C語言為我們提供了三種形式的if語句:if形式(簡單選擇)、if…else形式(標(biāo)準(zhǔn)雙選擇)、多選擇if語句形式(嵌套選擇)。

1.單選擇if語句

格式:

if(條件表達(dá)式)語句;

功能:計算并判斷條件表達(dá)式的值,若為真(非0),執(zhí)行if后面的語句,然后運行if語句后面的語句;若為假,不執(zhí)行該語句,直接運行if語句后面的語句。執(zhí)行流程如圖3-2所示。

例如:下列程序段輸出字符串x等于y。

x=0;y=0;

if(x==y)printf("x等于y");

因為x與y相等,條件表達(dá)式x==y成立,即為真值(值為1),所以printf("x等于y");執(zhí)行,輸出字符串“x等于y”。

若誤寫成:if (x=y)printf("x等于y");輸出語句就不會執(zhí)行,因為x=y是賦值表達(dá)式,這時,整個條件表達(dá)式的值為0,0是假值,條件不成立,不執(zhí)行輸出語句。

圖3-2 分支結(jié)構(gòu)

【例3.2】輸入一個整數(shù),若大于60則輸出“大于60,及格”字樣,否則不做處理。

程序代碼如下:

也可以寫成兩行:

if(score>60)

printf("大于60,及格\n");

【例3.3】給變量x和y輸入任意整數(shù)值,判斷x和y的大小,使x大于y。

程序代碼如下:

三條賦值語句必須用花括號括起來組成復(fù)合語句,若不用花括號,if(x<y)不成立時,只是不執(zhí)行語句t=x;但語句x=y;y=t;還是執(zhí)行的,這顯然不符合題目要求。

要進(jìn)行兩個變量交換,必須借助第三個變量,如圖3-3所示。而執(zhí)行語句x=y;y=x;后x和y均保留了y的值,沒有起到交換x和y的作用。

復(fù)合語句是由花括號括起來的多條語句組成的語句組,從語法上講是一條語句。語句格式如下:

圖3-3 交換x和y

執(zhí)行時依次運行語句1,語句2等。

復(fù)合語句主要用在選擇和循環(huán)程序中,條件成立要執(zhí)行多條語句時,可將多條語句用復(fù)合語句形式表示,見例3.4。

【例3.4】已知x、y、z三個數(shù),比較他們的大小并排序,使得x>y>z。

3個數(shù)x、y、z排序需要比較3次,將x與y比較,使x>y,將x與z比較,使x>z,這樣x為最大;再將y與z比較,使y>z,這樣就變成x>y>z。

程序代碼如下:

運行結(jié)果如圖3-4所示。

2.雙選擇if語句

格式:

功能:判斷條件表達(dá)式,若為真(非0),執(zhí)行語句1,否則執(zhí)行語句2;執(zhí)行流程如圖3-5所示。

圖3-4 例3.4運行結(jié)果

圖3-5 雙分支結(jié)構(gòu)

很顯然,語句1和語句2有一條且只有一條語句被執(zhí)行到。

【例3.5】計算分段函數(shù)y=的值。

程序代碼如下:

也可將輸出語句嵌入到選擇體內(nèi),但必須加花括號組成復(fù)合語句,否則會出現(xiàn)語法錯誤。

讀者應(yīng)深刻理解這兩段程序中printf()函數(shù)執(zhí)行情況,以及兩段程序的優(yōu)缺點,進(jìn)而深入理解雙選擇程序。

3.多選擇if語句

格式:

功能:判斷條件表達(dá)式1,若為真(非0),執(zhí)行語句1并結(jié)束多選擇if語句運行,若為假,繼續(xù)判斷條件表達(dá)式2;條件表達(dá)式2為真執(zhí)行語句2并結(jié)束多選擇if語句的運行,為假時,繼續(xù)判斷后續(xù)條件;依此類推,若所有條件表達(dá)式均不成立,執(zhí)行語句n+1。語句執(zhí)行流程如圖3-6所示。

圖3-6 多分支結(jié)構(gòu)

可見,多選擇語句運行時,即使有多個條件滿足,也只能執(zhí)行先滿足條件的那個選擇。

【例3.6】編寫程序計算運輸收費問題。計算公式為:f=p*w*s*d。

其中,f為總運輸費,p為每噸公里貨物運費,w為貨物重量,s為公里數(shù),d為費用折扣,折扣標(biāo)準(zhǔn)如下:

公里數(shù)s     折扣d

s<250(km)   0

250≤s<1000   2%

1000≤s<2000  8%

2000≤s<5000  15%

5000≤s      20%

分析:程序運行時需要先輸入p、w、s三個基本數(shù)據(jù),然后根據(jù)距離s的值,利用多選擇結(jié)構(gòu)求出折扣d,最后計算出總費用f.。

程序代碼如下:

編寫多選擇程序時,一定要注意if語句中判斷條件的合理使用,以免存在潛在的邏輯錯誤。分析本例的其他編寫方法:

4.if語句的嵌套

當(dāng)問題比較復(fù)雜,判斷條件比較多時,可能在if或else語句塊中也使用到if語句,稱這種使用方法為if語句的嵌套。例如:

上述程序段中語句“if (條件11)語句11;else語句12;”是嵌套在if塊中的if…else語句。

該程序段的執(zhí)行過程是:條件1和條件11都滿足時執(zhí)行語句11,條件1滿足條件11不滿足時執(zhí)行語句12;條件1不滿足時執(zhí)行語句2。

又如下列程序的輸出結(jié)果為符號串:x>y,y<z

注意:if…else語句嵌套配對問題。

if語句的配對原則:C語言規(guī)定else始終與同一層中上面最接近的if配對。閱讀下面的程序段:

在這里,第一個else與if (y>0)對應(yīng),第二個else與if (x>0)對應(yīng)。

為便于閱讀程序,在書寫if…else嵌套程序時,建議采用層縮進(jìn)格式,如上述程序。但是,if…else的配對原則不是由縮進(jìn)格式?jīng)Q定的,不論縮進(jìn)與否都按上述原則配對,假如要改變上述配對原則,需要用花括號調(diào)整。例如:

這里的else與if (x>0)對應(yīng),而不是與if (y>0)對應(yīng)。

思考:當(dāng)x=5,y=-6和x=-5,y=-6時,上述兩程序段的輸出結(jié)果分別為什么?

3.2.2 switch語句

C專門提供了實現(xiàn)多分支結(jié)構(gòu)的switch語句,該語句根據(jù)測試表達(dá)式的值決定執(zhí)行分支結(jié)構(gòu)中的哪一個分支。

格式:

測試表達(dá)式的類型要求與常量表達(dá)式類型一致,一般要求為整型或字符型;break語句為可選項,break語句的功能是結(jié)束switch語句的運行。

switch語句執(zhí)行流程:

先計算測試表達(dá)式的值,然后自上而下順序判斷哪個常量表達(dá)式的值與測試表達(dá)式的值相等,相等時執(zhí)行對應(yīng)的語句組,若該語句組中沒有執(zhí)行到break語句,就直接執(zhí)行下一個語句組,直到執(zhí)行到break語句時停止switch語句的執(zhí)行,退出switch語句;若沒有與測試表達(dá)式的值相等的常量表達(dá)式,則執(zhí)行default中的語句組n+1。

【例3.7】輸入1~7間的數(shù)字符號,輸出其對應(yīng)星期幾的英文表示。

程序代碼如下:

當(dāng)輸入數(shù)字字符2時輸出Tuesday,輸入數(shù)字字符8時輸出wrong number。

思考:若將case '2'中的break去掉,輸入數(shù)字字符2時,程序輸出結(jié)果為什么是兩個字符串:Tuesday和Wednesday?

一般來說,使用switch語句編寫程序時,在滿足程序功能要求的前提下,最好設(shè)計成每一個case語句組都有一個break語句,迫使switch語句每次只執(zhí)行一個語句組,這樣,程序結(jié)構(gòu)就更加清晰明了,符合結(jié)構(gòu)化程序設(shè)計的思想,如例3.7。當(dāng)然,這樣做的前提是首先要滿足程序的功能要求。當(dāng)每一個語句組都有break語句時,switch語句的執(zhí)行流程如圖3-7所示。

圖3-7 switch語句執(zhí)行流程

【例3.8】閱讀程序,進(jìn)一步加深對switch中出現(xiàn)break語句時的理解;當(dāng)x的輸入值分別為5、6和7時,程序的運行結(jié)果分別為什么?

程序代碼如下:

分析可知:x為5時,x%5為0,case 0語句組執(zhí)行,因該分支中沒有break語句,所以繼續(xù)執(zhí)行下一個分支case 1,當(dāng)運行到case 1語句組中的break時,switch語句結(jié)束執(zhí)行。運行結(jié)果如下:

x輸入5時,x%5值為0,運行結(jié)果為:

x=6,y=5

x=7,y=7

x輸入6時,x%5值為1,運行結(jié)果為:

x=7,y=7

x輸入7時,x%5值為2,運行結(jié)果為:

x=6,y=6

x=5,y=6

主站蜘蛛池模板: 新沂市| 桂阳县| 类乌齐县| 新绛县| 织金县| 新源县| 满洲里市| 大安市| 林甸县| 佛教| 焉耆| 安丘市| 青河县| 嘉峪关市| 芮城县| 桂阳县| 凭祥市| 隆德县| 磐石市| 宜昌市| 定安县| 慈溪市| 敦化市| 剑川县| 马尔康县| 饶平县| 岗巴县| 江川县| 大荔县| 阿克| 克什克腾旗| 黄龙县| 龙门县| 寿宁县| 罗源县| 米林县| 东丽区| 丹凤县| 正蓝旗| 武夷山市| 始兴县|