- C程序設(shè)計簡明教程(第二版)
- 雷新賢 黃榮保
- 2401字
- 2020-06-18 18:07:06
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
- AngularJS Testing Cookbook
- Redis入門指南(第3版)
- 軟件界面交互設(shè)計基礎(chǔ)
- Learning Docker
- Access 數(shù)據(jù)庫應(yīng)用教程
- Unity 3D/2D移動開發(fā)實戰(zhàn)教程
- HTML+CSS+JavaScript網(wǎng)頁設(shè)計從入門到精通 (清華社"視頻大講堂"大系·網(wǎng)絡(luò)開發(fā)視頻大講堂)
- 從零開始學(xué)Python網(wǎng)絡(luò)爬蟲
- OpenCV 3 Blueprints
- 平面設(shè)計經(jīng)典案例教程:CorelDRAW X6
- Python函數(shù)式編程(第2版)
- Java EE項目應(yīng)用開發(fā)
- Blender 3D Cookbook
- Opa Application Development
- Developing RESTful Web Services with Jersey 2.0