




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章項(xiàng)目主菜單的選擇執(zhí)行設(shè)計(jì)
用順序結(jié)構(gòu)只能解決一些簡單的問題,進(jìn)行一些簡單的計(jì)算。在實(shí)際生活中,往往要根據(jù)不同的情況做出不同的選擇,即給出一個(gè)條件,讓計(jì)算機(jī)判斷是否滿足條件,并按照不同的情況進(jìn)行處理。這種程序結(jié)構(gòu)稱為選擇結(jié)構(gòu)。C語言中有兩種選擇結(jié)構(gòu)語句:if語句和switch語句。本章將結(jié)合簡易計(jì)算器項(xiàng)目主菜單的選擇執(zhí)行設(shè)計(jì),詳細(xì)介紹如何在C程序中實(shí)現(xiàn)選擇結(jié)構(gòu)。學(xué)習(xí)目標(biāo):理解選擇結(jié)構(gòu)程序設(shè)計(jì)的基本思想和設(shè)計(jì)方法;理解各種選擇語句的定義格式和執(zhí)行過程;掌握用if語句實(shí)現(xiàn)分支結(jié)構(gòu)的方法;掌握用switch語句實(shí)現(xiàn)多分支結(jié)構(gòu)的方法。4.1任務(wù)三項(xiàng)目主菜單的選擇執(zhí)行設(shè)計(jì)
一、任務(wù)描述分別用if語句和switch語句實(shí)現(xiàn)項(xiàng)目主菜單的選擇執(zhí)行。要求能根據(jù)用戶輸入的主菜單選項(xiàng)進(jìn)行相應(yīng)的運(yùn)算,并輸出運(yùn)算結(jié)果。二、任務(wù)涉及知識要點(diǎn)該任務(wù)涉及到的新知識點(diǎn)主要有:if語句和switch語句三、任務(wù)分析簡易計(jì)算器項(xiàng)目主菜單含有加、減、乘、除和退出五個(gè)菜單項(xiàng),屬于多分支選擇結(jié)構(gòu)。C語言有兩種方法實(shí)現(xiàn)多分支結(jié)構(gòu),一種是用if-else語句實(shí)現(xiàn),另一種是用switch語句實(shí)現(xiàn)。該任務(wù)分別用兩種語句實(shí)現(xiàn)主菜單的選擇執(zhí)行。四、任務(wù)實(shí)現(xiàn)
需要說明的是,為了突出兩種語句的區(qū)別,壓縮源程序的篇幅,將主菜單的顯示部分用程序段A表示,兩個(gè)運(yùn)算數(shù)的輸入部分用程序段B表示。程序段A:system("cls");//調(diào)用清屏函數(shù)。若在TC下運(yùn)行,改用clrscr()printf("\n\n");printf("\t\t|---------------------------------|\n");printf("\t\t|簡易計(jì)算器|\n");printf("\t\t|---------------------------------|\n");printf("\t\t|1---加法|\n");printf("\t\t|2---減法|\n");printf("\t\t|3---乘法|\n");printf("\t\t|4---除法|\n");printf("\t\t|0---退出|\n");printf("\t\t|---------------------------------|\n");printf("\t\t請選擇運(yùn)算類型(0~4):");scanf("%d",&choose);程序段B:if(choose>=1&&choose<=4){ printf("\n\t\t請輸入第一個(gè)運(yùn)算數(shù):"); scanf("%f",&data1); printf("\n\t\t請輸入第二個(gè)運(yùn)算數(shù):"); scanf("%f",&data2); printf("\n\t\t運(yùn)算結(jié)果為:\n");}1.用if語句實(shí)現(xiàn)項(xiàng)目主菜單的選擇執(zhí)行#include<stdio.h>#include<stdlib.h>//使用system("cls")函數(shù)時(shí)需加此行main(){floatdata1,data2;//存放參與運(yùn)算的兩個(gè)操作數(shù)intchoose;//存放用戶輸入的菜單選項(xiàng)程序段A程序段Bif(choose==1)printf("\n\t\t%f+%f=%f\n",data1,data2,data1+data2);elseif(choose==2) printf("\n\t\t%f-%f=%f\n",data1,data2,data1-data2);elseif(choose==3)printf("\n\t\t%f*%f=%f\n",data1,data2,data1*data2);elseif(choose==4){ if(data2==0) printf("\n\t\t除數(shù)不能為零!");else printf("\n\t\t%f÷%f=%f\n",data1,data2,data1/data2);}elseif(choose==0)exit(0);else printf("\n\t\t輸入選項(xiàng)錯(cuò)誤!\n");}2.用switch語句實(shí)現(xiàn)項(xiàng)目主菜單的選擇執(zhí)行#include<stdio.h>#include<stdlib.h>//使用system("cls")函數(shù)時(shí)需加此行main(){floatdata1,data2;//存放參與運(yùn)算的兩個(gè)操作數(shù)intchoose;//存放用戶輸入的菜單選項(xiàng)程序段A程序段Bswitch(choose){case1:printf("\n\t\t%f+%f=%f\n",data1,data2,data1+data2);break;case2:printf("\n\t\t%f-%f=%f\n",data1,data2,data1-data2);break;case3:printf("\n\t\t%f*%f=%f\n",data1,data2,data1*data2);break;case4: if(data2==0) printf("\n\t\t除數(shù)不能為零!");else printf("\n\t\t%f÷%f=%f\n",data1,data2,data1/data2);break;case0:exit(0);default:printf("\n\t\t輸入選項(xiàng)錯(cuò)誤!\n");}}程序說明:(1)程序中exit(0)的功能是結(jié)束程序的執(zhí)行。exit()函數(shù)包含在“stdlib.h”頭文件中。(2)因?yàn)榧印p、乘、除每一種運(yùn)算都要輸入兩個(gè)運(yùn)算數(shù),為了減少程序代碼的重復(fù),在if-else和switch語句之前,增加一個(gè)單分支if語句,即程序段B,對這四種運(yùn)算的運(yùn)算數(shù)輸入進(jìn)行統(tǒng)一處理。(3)當(dāng)運(yùn)算類型為除法時(shí),應(yīng)當(dāng)判斷輸入的除數(shù)(即data2)是否為0。如果除數(shù)為0,則給出錯(cuò)誤信息,并結(jié)束本次運(yùn)算。(4)程序中用來存放用戶輸入菜單選項(xiàng)的變量choose也可以定義為char型。請讀者思考:如果將choose定義為char型,應(yīng)如何修改程序?(5)該任務(wù)只能實(shí)現(xiàn)一次主菜單的選擇執(zhí)行,主菜單的重復(fù)執(zhí)行將在第5章任務(wù)四中詳細(xì)介紹。(6)程序中的程序段A和程序段B在輸入源程序時(shí)要用相應(yīng)的代碼替換。程序段A和程序B也可以寫成函數(shù)的形式。有關(guān)函數(shù)的具體內(nèi)容將在第6章詳細(xì)介紹。五、要點(diǎn)總結(jié)
一個(gè)程序雖然經(jīng)過多次修改、編譯、連接和運(yùn)行,但還不能斷定該程序就是正確的,因?yàn)槌绦蛑锌赡艽嬖谶壿嬪e(cuò)誤,這些錯(cuò)誤往往很難用眼睛檢查出來,因此需要進(jìn)行測試與調(diào)試。在進(jìn)行程序的測試與調(diào)試時(shí),應(yīng)注意精選數(shù)據(jù),既具有代表性,又能涵蓋可能出現(xiàn)的各種情況。如該程序運(yùn)行時(shí),菜單的選項(xiàng)可分別輸入1,2,3,4,0和0~4以外的數(shù)據(jù)來測試程序是否能達(dá)到預(yù)期效果,以保證程序的正確性,提高調(diào)試效率4.2理論知識4.2.1if語句
if語句根據(jù)給定的條件進(jìn)行判斷,以決定執(zhí)行某個(gè)分支程序段。if語句有三種使用形式。一、單分支if語句單分支if語句的一般形式如下:
if(表達(dá)式)語句;
功能:先計(jì)算表達(dá)式的值,如果表達(dá)式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句。其執(zhí)行過程見圖4-1。圖4-1單分支if語句的執(zhí)行過程說明:(1)表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式,但也可以是其他表達(dá)式或任意的數(shù)值類型(包括整型、實(shí)型、字符型等)。因?yàn)樵趫?zhí)行if語句時(shí)先對表達(dá)式求解,若表達(dá)式的值為0,則按“假”處理,若表達(dá)式的值為非0,則按“真”處理。如下面的if語句均為合法的語句:
if(3)printf("O.K.");if('a')printf("%d",'a');(2)表達(dá)式后面的語句可以是一個(gè)單語句,也可以是用花括號“{}”括起來的復(fù)合語句。花括號“}”外面不需要再加分號,但括號內(nèi)最后一個(gè)語句后面的分號不能省略。例如,任務(wù)三中判斷用戶輸入的運(yùn)算類型是否合法的程序段:…if(choose>=1&&choose<=4){ printf("\n\t\t請輸入第一個(gè)運(yùn)算數(shù):"); scanf("%f",&data1); printf("\n\t\t請輸入第二個(gè)運(yùn)算數(shù):"); scanf("%f",&data2); printf("\n\t\t運(yùn)算結(jié)果為:\n");}…【例4.1】輸入三個(gè)整數(shù)x,y,z,按從小到大的順序排序輸出。#include<stdio.h>main(){ intx,y,z,temp; printf("請輸入三個(gè)整數(shù):"); scanf("%d,%d,%d",&x,&y,&z); if(x>y) {temp=x;x=y,y=temp;}//交換x,y的值
if(x>z) {temp=x;x=z;z=temp;}//交換x,z的值
if(y>z) {temp=y;y=z;z=temp;}//交換y,z的值
printf("三個(gè)整數(shù)從小到大排序結(jié)果為:%d,%d,%d\n",x,y,z);}程序運(yùn)行結(jié)果:請輸入三個(gè)整數(shù):3,2,5↙三個(gè)整數(shù)從小到大排序結(jié)果為:2,3,5二、雙分支if語句雙分支if語句的一般形式如下:if(表達(dá)式)語句1;else語句2;
功能:先執(zhí)行表達(dá)式的值,如果表達(dá)式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。其執(zhí)行過程見圖4-2。圖4-2雙分支if語句的執(zhí)行過程例如,任務(wù)三中判斷除數(shù)是否為0的程序段:…if(data2==0) printf("\n\t\t除數(shù)不能為零!");else printf("\n\t\t%f÷%f=%f\n",data1,data2,data1/data2);…說明:(1)雙分支if語句中的else子句不能作為語句單獨(dú)使用,必須與if配對使用。(2)if語句允許嵌套。所謂if語句嵌套,是指在“語句1”和“語句2”中,又包含有if語句的情況。C語言規(guī)定,在嵌套的if語句中,else總是與其上面最近的且尚未匹配的if配對。為明確匹配關(guān)系,避免匹配錯(cuò)誤,建議最好將內(nèi)嵌的if語句一律用花括號“{}”括起來。如:if(…){if(…)語句1;}else
語句2;【例4.2】輸入三個(gè)整數(shù),輸出其中的最大數(shù)。#include<stdio.h>main(){ inta,b,c,max; printf("請輸入三個(gè)整數(shù):"); scanf("%d,%d,%d",&a,&b,&c); if(a>b) max=a; else max=b; if(max<c) max=c; printf("最大數(shù)是%d\n",max);}程序運(yùn)行結(jié)果:請輸入三個(gè)整數(shù):5,8,2↙最大數(shù)是8例4.2也可用兩個(gè)單分支的if語句實(shí)現(xiàn),程序如下:#include<stdio.h>main(){ inta,b,c,max; printf("請輸入三個(gè)整數(shù):"); scanf("%d,%d,%d",&a,&b,&c); max=a; if(max<b) max=b; if(max<c)max=c; printf("最大數(shù)是%d\n",max);}程序運(yùn)行結(jié)果與例4.2相同。
這種方法的基本思想是:首先取一個(gè)數(shù)假定為max(最大值),然后將max依次與其余的數(shù)逐個(gè)比較,如果發(fā)現(xiàn)有比max大的數(shù),就用它給max重新賦值,比較完所有的數(shù)后,max中的數(shù)就是最大值。這種方法,常常用來求多個(gè)數(shù)中的最大值(或最小值)。三、多分支if語句多分支if語句的一般形式如下:if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;elseif(表達(dá)式3)語句3;…elseif(表達(dá)式n)語句n;else語句n+1;
功能:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真時(shí),則執(zhí)行其對應(yīng)的語句,其余語句不被執(zhí)行。如果所有的表達(dá)式均為假,則執(zhí)行語句n+1。其執(zhí)行過程如圖4-3所示?!纠?.3】編寫程序,根據(jù)輸入的學(xué)生成績,給出相應(yīng)的等級。90分以上的等級為優(yōu)秀,60分以下的等級為不及格,其余每10分一個(gè)等級。#include<stdio.h>main(){ intscore; printf("請輸入學(xué)生成績(0-100):"); scanf("%d",&score); if(score>=90) printf("優(yōu)秀!\n");elseif(score>=80) printf("良好!\n"); elseif(score>=70) printf("中等!\n"); elseif(score>=60) printf("及格!\n"); else printf("不及格!\n");}程序運(yùn)行結(jié)果:請輸入學(xué)生成績(0-100):86↙良好!4.2.2switch語句使用if語句實(shí)現(xiàn)復(fù)雜問題的多分支選擇時(shí),程序的結(jié)構(gòu)顯得不夠清晰,因此,C語言提供了一種專門用來實(shí)現(xiàn)多分支選擇結(jié)構(gòu)的switch語句,又稱開關(guān)語句。switch語句的一般形式如下:switch(表達(dá)式){case常量表達(dá)式1:語句1;break;case常量表達(dá)式2:語句2;break;
…case常量表達(dá)式n:語句n;break;[default:語句n+1;]}
功能:首先計(jì)算switch后表達(dá)式的值,然后將該值與各常量表達(dá)式的值相比較。當(dāng)表達(dá)式的值與某個(gè)常量表達(dá)式的值相等時(shí),即執(zhí)行其后的語句,當(dāng)執(zhí)行到break語句時(shí),則跳出switch語句,轉(zhuǎn)向執(zhí)行switch語句下面的語句(即右花括號下面的第一條語句)。如果表達(dá)式的值與所有case后的常量表達(dá)式的值均不相同,則執(zhí)行default后面的語句。若沒有default語句,則退出此開關(guān)語句。說明:(1)switch后面的表達(dá)式可以是int,char和枚舉型中的一種。(2)常量表達(dá)式后的語句可以是一個(gè)語句,也可以是復(fù)合語句或是另一個(gè)switch語句。(3)各case及default子句的先后次序不影響程序執(zhí)行結(jié)果,但default通常作為開關(guān)語句的最后一個(gè)分支。(4)每個(gè)case后面常量表達(dá)式的值必須各不相同,否則會出現(xiàn)相互矛盾的現(xiàn)象。(5)switch語句中允許出現(xiàn)空的case語句,即多個(gè)case共用一組執(zhí)行語句。(6)break語句在switch語句中是可選的,它是用來跳過后面的case語句,結(jié)束switch語句,從而起到真正的分支作用。如果省略break語句,則程序在執(zhí)行完相應(yīng)的case語句后不能退出,而是繼續(xù)執(zhí)行下一個(gè)case語句,直到遇到break語句或switch結(jié)束。使用switch語句還需要注意以下幾點(diǎn):(1)常量表達(dá)式與case之間至少應(yīng)有一個(gè)空格,否則可能被編譯系統(tǒng)認(rèn)為是語句標(biāo)號,如case1,并不出現(xiàn)語法錯(cuò)誤,這類錯(cuò)誤較難查找。(2)每個(gè)case只能列舉一個(gè)整型或字符型常量,否則會出現(xiàn)語法錯(cuò)誤,如下列程序段所示。 floatx=1.5; inta=3,b=4,c; switch(x)//錯(cuò):x為實(shí)型數(shù)據(jù)??筛臑椋簊witch((int)x) { case4.5://錯(cuò):4.5非整型常量??筛臑椋篶ase(int)4.5: c=1;break; casea+b://錯(cuò):a+b不是常量表達(dá)式??筛臑椋篶ase3+4: c=2;break;case1,2,3://錯(cuò):不允許??筛臑椋篶ase1:case2:case3: c=3; }
(3)switch語句結(jié)構(gòu)清晰,便于理解,用switch語句實(shí)現(xiàn)的多分支結(jié)構(gòu)程序,完全可以用if語句來實(shí)現(xiàn),但反之不然。原因是switch語句中的表達(dá)式只能取整型、字符型和枚舉型值,而if語句中的表達(dá)式可取任意類型的值。
【例4.4】用switch語句實(shí)現(xiàn)例4.3#include<stdio.h>main(){ intscore; printf("請輸入學(xué)生成績(0-100):");scanf("%d",&score); switch(score/10) { case10:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教學(xué)課件小圖案
- 易捷加油站運(yùn)營及服務(wù)知識考試試卷
- 教學(xué)課件截圖模板下載
- 2024-2025學(xué)年云南省騰沖市第八中學(xué)高一下學(xué)期期中生物試題及答案
- 臺階教學(xué)設(shè)計(jì)和教學(xué)課件
- 染整過程中織物光澤度變化研究考核試卷
- 農(nóng)產(chǎn)品營銷中的農(nóng)民合作社發(fā)展模式考核試卷
- 農(nóng)業(yè)機(jī)械產(chǎn)業(yè)循環(huán)經(jīng)濟(jì)評價(jià)體系考核試卷
- 心房顫動課件
- 信用評級結(jié)果在信貸市場中的信息傳遞效率研究考核試卷
- 2025年數(shù)字經(jīng)濟(jì)下的創(chuàng)業(yè)政策調(diào)整策略試題及答案
- 第30課 在線安全防范-2024-2025學(xué)年三年級全一冊《信息技術(shù)》教案
- 政治 (道德與法治)八年級下冊自由平等的追求教案
- 山東省濟(jì)南市高新區(qū)學(xué)卷B2024-2025學(xué)年數(shù)學(xué)五下期末教學(xué)質(zhì)量檢測試題含答案
- 訂單外發(fā)合同協(xié)議
- 山東省2024年藝術(shù)類本科批音樂類第1次志愿投檔情況表(公布)
- 《公路運(yùn)營領(lǐng)域重大事故隱患判定標(biāo)準(zhǔn)》知識培訓(xùn)
- 護(hù)理核心制度
- GB/T 45234.302-2025太陽能熱發(fā)電站第3-2部分:系統(tǒng)與部件大尺寸拋物面槽式集熱器通用要求與測試方法
- 2025-2030年中國氯化聚醚市場運(yùn)行態(tài)勢及發(fā)展風(fēng)險(xiǎn)評估報(bào)告
- 金融機(jī)構(gòu)合規(guī)風(fēng)險(xiǎn)管理培訓(xùn)課件
評論
0/150
提交評論