第4章 選擇結(jié)構(gòu)程序設(shè)計(jì)_第1頁
第4章 選擇結(jié)構(gòu)程序設(shè)計(jì)_第2頁
第4章 選擇結(jié)構(gòu)程序設(shè)計(jì)_第3頁
第4章 選擇結(jié)構(gòu)程序設(shè)計(jì)_第4頁
第4章 選擇結(jié)構(gòu)程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第4章選擇結(jié)構(gòu)程序設(shè)計(jì)if語句2switch語句3任務(wù)2——有節(jié)約要求的水費(fèi)問題1任務(wù)2——有節(jié)約要求的水費(fèi)問題1問

題為提倡節(jié)約用水,按照每月每戶每人3噸水進(jìn)行定量,標(biāo)準(zhǔn)以內(nèi)的用水量水費(fèi)為每噸1.51元,超額的部分2倍付費(fèi)。需要我們編寫程序來解決每戶每個(gè)月要交的水費(fèi)問題。分

析解決這個(gè)問題,首先需要知道每戶的人口數(shù)(用變量person表示),及每個(gè)月所用的水量(用變量water表示)。計(jì)算是否超出了定量標(biāo)準(zhǔn),再進(jìn)行水費(fèi)的計(jì)算。

數(shù)據(jù)需要程序常量DOSAGE3CRITERION1.51輸入數(shù)據(jù)intperson/*存放人口數(shù)*/floatprevious,behind/*存放上個(gè)月水表讀數(shù),這個(gè)月水表讀數(shù)*/

輸出數(shù)據(jù)intration/*每戶標(biāo)準(zhǔn)用水量*/floatwater,charge/*用水總量,總水費(fèi)*/設(shè)計(jì)初始算法:1.獲取數(shù)據(jù):水表上個(gè)月的讀數(shù)和這個(gè)月的讀數(shù),讀入人口數(shù)。2.計(jì)算用水量:water=behind-previous。3.計(jì)算用水標(biāo)準(zhǔn)量:ration=person*DOSAGE4.if沒有超出標(biāo)準(zhǔn)用水量

charge=water*CRITERIONelsecharge=ration*CRITERION+(water-ration)*2*CRITERION5.顯示水費(fèi)總數(shù)。

實(shí)現(xiàn)如果條件water<=ration求值為真,則按上述方法計(jì)算使用費(fèi)用,否則超出部分的費(fèi)用按照基準(zhǔn)費(fèi)率的2倍計(jì)算。#include<stdio.h>#defineDOSAGE3#defineCRITERION1.51main(){intperson,ration;floatprevious,behind,water,charge;printf("請(qǐng)輸入人口數(shù)、上月水表讀數(shù)、本月水表讀數(shù):");scanf("%d%f%f",&person,&previous,&behind);ration=person*DOSAGE;water=behind-previous;if(water<=ration)/*條件判斷,分支選擇*/charge=water*CRITERION;elsecharge=ration*CRITERION+(water-ration)*2*CRITERION;printf("\n用戶水費(fèi)是:%.2f\n",charge);}運(yùn)行結(jié)果:請(qǐng)輸入人口數(shù)、上月水表讀數(shù)、本月水表讀數(shù):5

1251

1321↙用戶水費(fèi)是:188.75if語句2if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。if語句的三種形式1.單分支if語句if(表達(dá)式)語句例如:if(x>y)printf(“%d”,x);2.雙分支if語句if(表達(dá)式)語句1else語句2例如:if(x>y)printf("%d",x);elseprintf("%d",y);3.多分支if語句if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3……elseif(表達(dá)式m)語句melse語句例如: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;說明:(1)三種形式的if語句中,在if后面都有“表達(dá)式”,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。例如,if(a==b&&x==y)printf("a=b,x=y");在執(zhí)行if語句時(shí)先對(duì)表達(dá)式求解,若表達(dá)式的值為0,按“假”處理,若表達(dá)式的值為非0,按“真”處理,執(zhí)行指定的語句。假如有以下if語句:if(5)pritnf("YES.");是合法的,執(zhí)行結(jié)果輸出“YES.”,因?yàn)楸磉_(dá)式的值為5,按“真”處理。由此可見,表達(dá)式的類型不限于邏輯表達(dá)式,可以是任意的數(shù)值類型(包括整型、實(shí)型、字符型、指針型數(shù)據(jù))。例如,下面的if語句也是合法的:if('a')printf("%d",'a');執(zhí)行結(jié)果:97/*輸出“a”的ASCII值*/(2)第二、第三種形式的if語句中,在每個(gè)else前面有一分號(hào),整個(gè)語句結(jié)束處有一分號(hào)。例如:if(x>0)printf("%f",x);elseprintf("%f",-x);這是由于分號(hào)是C語句中不可缺少的部分,這個(gè)分號(hào)是if語句中的內(nèi)嵌語句所要求的。如果無此分號(hào),則將出現(xiàn)語法錯(cuò)誤。但應(yīng)注意,不要誤認(rèn)為上面是兩個(gè)語句(if語句和else語句),它們都屬于同一個(gè)if語句。else子句不能作為語句單獨(dú)使用,它必須是if語句的一部分,與if配對(duì)使用。兩處分號(hào)不可少(3)在if和else后面可以只含一個(gè)內(nèi)嵌的操作語句(如上例),也可以有多個(gè)操作語句,此時(shí)用花括號(hào)“{}”將幾個(gè)語句括起來成為一個(gè)復(fù)合語句。如: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));pritnf("area=%6.2f",area);}elsepritnf("itisnotatrilateral");注意在第3行的花括號(hào)“}”外面不需要再加分號(hào)。因?yàn)閧}內(nèi)是一個(gè)完整的復(fù)合語句,不需另附加分號(hào)。例4-1輸入兩個(gè)實(shí)數(shù),按代數(shù)值由小到大的次序輸出這兩個(gè)數(shù)。程序如下: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)行情況如下:2.8,-6.3↙-6.30,2.80例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即可。按此算法編寫程序:main(){floata,b,c,t;scanf("%f,%f,%f",&a,&b,&c);if(a>b){t=a;a=b;a=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)行情況如下:5,-3,2↙-3.00,2.00,5.00if()語句3else語句4if()語句1else語句2elseif語句的嵌套在if語句中又包含一個(gè)或多個(gè)if語句稱為if語句的嵌套。一般形式如下:if()內(nèi)嵌if內(nèi)嵌if應(yīng)當(dāng)注意if與else的配對(duì)關(guān)系。else總是與它上面的最近的if配對(duì)。if()

{if()語句1}(內(nèi)嵌if)else語句2這時(shí){}限定了內(nèi)嵌if語句的范圍,因此else與第一個(gè)if配對(duì)。if()語句1elseif()語句2else語句3編程序者把else寫在與第一個(gè)if(外層if)同一列上,希望else與第一個(gè)if對(duì)應(yīng),但實(shí)際上else是與第二個(gè)if配對(duì),因?yàn)樗鼈兿嗑嘧罱R虼俗詈檬箖?nèi)嵌if語句也包含else部分,這樣if的數(shù)目和else的數(shù)目相同,從內(nèi)層到外層一一對(duì)應(yīng),不致出錯(cuò)。如果if與else的數(shù)目不一樣,為實(shí)現(xiàn)程序設(shè)計(jì)者的意圖,可以加花括號(hào)來確定配對(duì)關(guān)系。例如:if()內(nèi)嵌if-1(x<0)y=0(x=0)1(x>0)編一個(gè)程序,輸入一個(gè)x值,輸出y值。例4-3

有一個(gè)函數(shù)輸入x若x<0y=-1若x=0y=0若x>0y=1輸出y輸入x若x<0y=-1否則:

若x=0y=0

若x>0y=1輸出y可以先寫出算法:或:程序1: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);}請(qǐng)學(xué)生按照以下四個(gè)程序,畫出流程圖,判斷哪幾個(gè)程序是正確的?程序2:將上面程序的if語句(第4—6行)改為:if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;程序3:將上述if語句改為:y=-1;if(x!=0)if(x>0)y=1;elsey=0;程序4:y=0;if(x>=0)if(x>0)y=1;elsey=-1;正確:程序1和程序2switch語句3switch語句是多分支選擇語句,用來實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。一般形式如下:switch(表達(dá)式){case常量表達(dá)式1:語句1case常量表達(dá)式2:語句2

…case常量表達(dá)式n:語句ndefault:語句n+1}例如,要求按照考試成績(jī)的等級(jí)打印出百分制分?jǐn)?shù)段,可以用switch語句實(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");defaultprintf("error\n");}說明:(1)switch后面括弧內(nèi)的“表達(dá)式”,ANSI標(biāo)準(zhǔn)允許它為任何類型。(2)當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式的值相等時(shí),就執(zhí)行此case后面的語句,若所有的case中的常量表達(dá)式的值都沒有與表達(dá)式的值匹配的,就執(zhí)行default后面的語句。(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后面的語句后,流程控制轉(zhuǎn)移到下一個(gè)case繼續(xù)執(zhí)行?!癱ase常量表達(dá)式”只是起語句標(biāo)號(hào)作用,并不是在該處進(jìn)行條件判斷。在執(zhí)行switch語句時(shí),根據(jù)switch后面表達(dá)式的值找到匹配的入口標(biāo)號(hào),就從此標(biāo)號(hào)開始執(zhí)行下去,不再進(jìn)行判斷。例如,上面的例子中,若grade的值等于A,則將連續(xù)輸出:85~10070~8460~69<60error因此,應(yīng)該在執(zhí)行一個(gè)case分支后,使流程跳出switch結(jié)構(gòu),即終止switch語句的執(zhí)行??梢杂靡粋€(gè)break語句來達(dá)到此目的。將上面的switch結(jié)構(gòu)改寫如下:(6)多個(gè)case可以共用一組執(zhí)行語句,如:…case'A':case'B':case'C':printf(">60\n");break;…grade的值為“A”、“B”或“C”時(shí)都執(zhí)行同一組語句。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語句。如果grade的值為B,則只輸出“70~84”。

小型案例問題運(yùn)輸公司對(duì)用戶計(jì)算運(yùn)費(fèi)。路程(s)越遠(yuǎn),每公里運(yùn)費(fèi)越低。標(biāo)準(zhǔn)如下:s<250km 沒有折扣250≤s<500 2%折扣500≤s<1000 5%折扣1000≤s<2000 8%折扣2000≤s<3000 10%折扣3000≤s 15%折扣分析設(shè)每公里每噸貨物的基本運(yùn)費(fèi)為p(price的縮寫),貨物重為w(weight的縮寫),距離為s(space的縮寫),折扣為d(discount的縮寫),則總運(yùn)費(fèi)f(freight的縮寫)的計(jì)算公式為:f=p*w*s*(1-d)折扣變化規(guī)律圖設(shè)計(jì)分析此問題,折扣的變化是有規(guī)律的:從圖4-9可以看到,折扣的“變化點(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,無折扣;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%。實(shí)現(xiàn)據(jù)此寫出程序如下:main(){intc,s;floatp,w,d,f;printf("\n請(qǐng)輸入基本運(yùn)費(fèi),貨物重量,運(yùn)輸距離:");scanf("%f%f%d",&p,&w,&s);if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case4:case5:

case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0);printf("貨物運(yùn)費(fèi)為:%15.4f\n",f);}運(yùn)行示例:100,20,300↙freight=588000.0000測(cè)試通過設(shè)置不同的基本運(yùn)費(fèi)、運(yùn)輸路程與貨重,檢驗(yàn)解決問題的正確性,輸入數(shù)據(jù)要求具有實(shí)際應(yīng)用價(jià)值。程序能滿足解決實(shí)際問題的功能。小結(jié)選擇結(jié)構(gòu)是構(gòu)成程序的三種基本結(jié)構(gòu)之一,C語言中實(shí)現(xiàn)選擇結(jié)構(gòu)的語句有兩種,即if語句和switch語句。本章主要討論了它們的使用語法及相關(guān)內(nèi)容。學(xué)習(xí)的重點(diǎn)有:1.if語句的三種基本形式(1)單分支if語

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論