版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
選擇結(jié)構(gòu)程序設(shè)計(jì)第一節(jié)單分支選擇結(jié)構(gòu)第二節(jié)雙分支選擇結(jié)構(gòu)第三節(jié)多分支選擇結(jié)構(gòu)第四節(jié)項(xiàng)目任務(wù):軟件用戶界面設(shè)計(jì)優(yōu)化第一節(jié)單分支選擇結(jié)構(gòu)順序結(jié)構(gòu)程序自上而下執(zhí)行,程序中的每一條語句都被執(zhí)行一次,而且只能執(zhí)行一次,完成簡(jiǎn)單的運(yùn)算。而在許多情況下,語句執(zhí)行的順序常常依賴于輸入的數(shù)據(jù)或中間運(yùn)算結(jié)果,即只能根據(jù)當(dāng)時(shí)的具體情況和需要采取不同的處理方式,這種程序結(jié)構(gòu)稱為選擇結(jié)構(gòu)。例如,輸入三角形的三條邊,首先必須判斷是否能構(gòu)成三角形,若能才求出三角形的面積。這些問題在處理時(shí)都需要根據(jù)判定條件來選擇不同的操作。在C語言程序設(shè)計(jì)中,使用選擇結(jié)構(gòu)需考慮兩個(gè)問題:一是確定要判斷的是什么條件,二是當(dāng)判斷結(jié)果為不同的情況(“真”或“假”)時(shí)應(yīng)該執(zhí)行什么操作。根據(jù)選擇執(zhí)行程序分支的數(shù)目,可以將選擇結(jié)構(gòu)細(xì)分為三類:?jiǎn)畏种нx擇結(jié)構(gòu)、雙分支選擇結(jié)構(gòu)、多分支選擇結(jié)構(gòu)。單分支選擇結(jié)構(gòu)是最簡(jiǎn)單選擇結(jié)構(gòu),一般形式如下:If(表達(dá)式)語句;流程圖如圖3.1所示。圖3.1單分支選擇結(jié)構(gòu)流程圖單分支if語句的執(zhí)行過程是:如果表達(dá)式的值為真(非0),則執(zhí)行其后的語句,否則不執(zhí)行該語句?!景咐?-1】輸入兩個(gè)數(shù),輸出其中的大數(shù)。分析:這是一個(gè)兩個(gè)數(shù)中求較大數(shù)的問題。顯然,兩個(gè)數(shù)為程序的輸入項(xiàng),較大數(shù)為程序的輸出項(xiàng),其算法可以表示如下:(1)輸入兩個(gè)數(shù)a,b;(2)將a賦值給變量max;(3)將b與max比較,如果b>max,將b賦給max;(4)輸出max的值。#include<stdio.h>main(){inta,b,max;printf("\n請(qǐng)輸入第一個(gè)整數(shù):");scanf("%d",&a);printf("\n請(qǐng)輸入第二個(gè)整數(shù):");scanf("%d",&b);max=a;if(max<b)max=b;printf("較大數(shù)為%d",max);}【案例3-2】輸入x,求出并輸出x的絕對(duì)值。分析:在數(shù)學(xué)中,正數(shù)的絕對(duì)值是正數(shù)本身,負(fù)數(shù)的絕對(duì)值是其相反數(shù)。其算法可以表示如下:(1)輸入x;(2)判斷x是否小于0,若是,則取反;(3)輸出x的絕對(duì)值#include<stdio.h>main(){floatx;printf("請(qǐng)輸入一個(gè)數(shù):");scanf("%f",&x);if(x<0)x=-x;printf("這個(gè)數(shù)的絕對(duì)值是:%f\n",x);}【注意】If后面的表達(dá)式一定要有圓括號(hào)?!景咐?-3】輸入3個(gè)數(shù)a、b、c,要求按由小到大的順序輸出。分析:其算法可以表示如下:(1)先將a與b比較,把小者放入a中,大者放入b中;(2)再將a與c比較,把小者放入a中,大者放入c中,此時(shí)a已是三者中最小的;(3)再將b與c比較,把小者放入b中,大者放入c中,此時(shí)a、b、c已按由小到大的順序排列;#include<stdio.h>main(){ floata,b,c,t;printf("請(qǐng)輸入需要排序的三個(gè)實(shí)數(shù):");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);}【注意】if語句表達(dá)式為真時(shí),若只處理一條語句,直接書寫即可;若處理多條語句,則此時(shí)需要用花括號(hào)括起來構(gòu)成復(fù)合語句。第二節(jié)雙分支選擇結(jié)構(gòu)一、if-else語句if語句更常用的形式是雙分支語句,一般形式如下:if(表達(dá)式)
語句1;else
語句2;流程圖如圖3.5所示。雙分支if語句的執(zhí)行過程是:如果表達(dá)式的值為真(非0),則執(zhí)行語句1;若表達(dá)式的值為假(0),執(zhí)行語句2。語句1和語句2可以是一條語句也可以是多條語句。圖3.5雙分支選擇結(jié)構(gòu)流程圖【案例3-4】完善案例3-2。輸入x,求出并輸出x的絕對(duì)值。分析:對(duì)任意數(shù)x,當(dāng)x≥0時(shí),它的絕對(duì)值為x;當(dāng)x<0時(shí),它的絕對(duì)值為-x。這可以用雙分支選擇結(jié)構(gòu)解決。#include<stdio.h>main(){floatx,y;printf("請(qǐng)輸入一個(gè)數(shù):");scanf("%f",&x);if(x<0)y=-x;elsey=x;printf("這個(gè)數(shù)的絕對(duì)值是:%f\n",y);}【說明】if語句和else語句屬于同一個(gè)if語句。else子句不能作為語句單獨(dú)使用,它必須是if語句的一部分,與if配對(duì)使用?!驹囈辉嚒糠抡瞻咐?-4,用雙分支if語句改寫案例3-1?!景咐?-5】完善案例2-12。輸入三角形的邊長(zhǎng),求三角形面積。分析:從數(shù)學(xué)知識(shí)可知,構(gòu)成三角形的必要條件是兩邊之和大于第3邊,因此在計(jì)算三角形面積之前應(yīng)當(dāng)進(jìn)行該條件的判斷。#include<stdio.h>#include<math.h>voidmain(){doublea,b,c,s,area;printf("pleaseentera,b,c:”);scanf("%lf,%lf,%lf",&a,&b,&c);if(a+b>c&&b+c>a&&c+a>b)/*檢查構(gòu)成三角形的必要條件是否滿足*/{s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf("area=%6.2f\n",area);}/*大括號(hào)內(nèi)是一個(gè)復(fù)合語句*/elseprintf("輸入錯(cuò)誤,三邊不能構(gòu)成三角形!.\n");}【說明】在if和else后面可以只含一個(gè)語句,也可以有多個(gè)語句,此時(shí)用花括號(hào)“{}”將幾個(gè)語句括起來成為一個(gè)復(fù)合語句。【案例3-6】身高預(yù)測(cè)。每個(gè)做父母的都關(guān)心自己孩子成人后的身高,據(jù)有關(guān)生理衛(wèi)生知識(shí)與數(shù)理統(tǒng)計(jì)分析表明,影響小孩成人后的身高的因素包括遺傳、飲食習(xí)慣與體育鍛煉等。小孩成人后的身高與其父母的身高和自身的性別密切相關(guān)。設(shè)faHeight為其父身高,moHeight為其母身高,身高預(yù)測(cè)公式為男性成人時(shí)身高=(faHeight+moHeight)×0.54cm女性成人時(shí)身高=(faHeight×0.923+moHeight)/2cm此外,如果喜愛體育鍛煉,那么可增加身高2%;如果有良好的衛(wèi)生飲食習(xí)慣,那么可增加身高1.5%。分析:編程從鍵盤輸入用戶的性別(用字符型變量sex存儲(chǔ),輸入字符F表示女性,輸入字符M表示男性)、父母身高(用實(shí)型變量存儲(chǔ),faHeight為其父身高,moHeight為其母身高)、是否喜愛體育鍛煉(用字符型變量sports存儲(chǔ),輸入字符Y表示喜愛,輸入字符N表示不喜愛)、是否有良好的飲食習(xí)慣等條件(用字符型變量diet存儲(chǔ),輸入字符Y表示良好,輸入字符N表示不好),利用給定公式和身高預(yù)測(cè)方法對(duì)身高進(jìn)行預(yù)測(cè)。程序如下所示:#include<stdio.h>main(){charsex;sports;diet; floatmyHeight; faHeight;moHeight; printf("Areyouaboy(M)oragirl(F)?"); scanf("%c",&sex);scanf("%c",&sex);printf("Pleaseinputyourfather'sheight(cm):");scanf("%f",&faHeight);printf("Pleaseinputyourmother'sheight(cm):");scanf("%f",&moHeight); printf("Doyoulikesports(Y/N)?"); scanf("%c",&sports); printf("Doyouhaveagoodhabitofdiet(Y/N)?");scanf("%c",&diet); if(sex=='M'||sex=='m') myHeight=(faHeight+moHeight)*0.54; else myHeight=(faHeight*0.923+moHeight)/2.0; if(sports=='Y'||sports=='y')myHeight=myHeight*(1+0.02); if(diet=='Y'||diet=='y')myHeight=myHeight*(1+0.015); printf("Yourfutureheightwillbe%f(cm)\n",myHeight);}【想一想】條件(sex=='M'||sex=='m')的作用?與(sex=='M')有何區(qū)別?二、條件運(yùn)算符與條件表達(dá)式C語言中有一種特有的運(yùn)算符稱為條件運(yùn)算符,即“?:”。它在某種程度上可以起到邏輯判斷的作用,一樣可以實(shí)現(xiàn)雙分支選擇結(jié)構(gòu)。由條件運(yùn)算符構(gòu)成的表達(dá)式稱為條件表達(dá)式,與if-else語句具有相同的功能。其一般形式為:表達(dá)式1?表達(dá)式2:表達(dá)式3其運(yùn)算規(guī)則為:先求解表達(dá)式1,若為非0(真)則求解表達(dá)式2,此時(shí)表達(dá)式2的值就作為整個(gè)條件表達(dá)式的值;若表達(dá)式1的值為0(假),則求解表達(dá)式3,表達(dá)式3的值就是整個(gè)條件表達(dá)式的值。【案例3-7】利用條件表達(dá)式改寫案例3-1,輸入兩個(gè)數(shù),輸出其中的大數(shù)。#include<stdio.h>main(){inta,b,max;printf("\n請(qǐng)輸入第一個(gè)整數(shù):");scanf("%d",&a);printf("\n請(qǐng)輸入第二個(gè)整數(shù):");scanf("%d",&b);max=a>b?a:b;printf("\n較大數(shù)為%d",max);}【注意】條件運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符,但低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符。第三節(jié)多分支選擇結(jié)構(gòu)C語言中,可以使用嵌套if-else語句和switch語句來實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。一、嵌套if-else語句前兩種形式的if語句一般都用于兩個(gè)分支的情況。當(dāng)有多個(gè)分支選擇時(shí),可采用if…elseif結(jié)構(gòu),其一般形式為:
if(表達(dá)式1)語句1;
elseif(表達(dá)式2)語句2;
elseif(表達(dá)式3)語句3;
……elseif(表達(dá)式n)語句n;
else語句m;流程圖如圖3.8所示。圖3.8多分支選擇結(jié)構(gòu)流程圖嵌套if-else語句的執(zhí)行過程是:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真時(shí),則執(zhí)行其對(duì)應(yīng)的語句。然后跳到整個(gè)if語句之外繼續(xù)執(zhí)行程序。如果所有的表達(dá)式均為假,則執(zhí)行語句m。然后繼續(xù)執(zhí)行后續(xù)程序?!景咐?-8】商場(chǎng)團(tuán)購促銷活動(dòng)如下:凡買50件以上(含50件)的優(yōu)惠5%,買100件以上(含100件)的優(yōu)惠7.5%,買300件以上(含300件)的優(yōu)惠10%,買500件以上(含500件)的優(yōu)惠15%。請(qǐng)輸入購買的數(shù)量和單價(jià),輸出應(yīng)付貨款。分析:首先檢查所購貨物數(shù)量是否大于或等于500,如是,則確定折扣為15%,如果不是(即少于500件),再檢查是否大于或等于300,如是,則表示在300~499范圍內(nèi),折扣應(yīng)為10%,以此類推。而計(jì)算公式為:應(yīng)付貨款=件數(shù)*單價(jià)*(1-優(yōu)惠折扣)#include<stdio.h>#include<math.h>voidmain(){intnumber;doublecost,price,total;printf("請(qǐng)輸入商品數(shù)量和單價(jià):");scanf("%d,%lf",&number,&price);/*輸入件數(shù)和單價(jià)*/if(number>=500)cost=0.15;/*嵌套的if語句*/elseif(number>=300)cost=0.10;elseif(number>=100)cost=0.075;elseif(number>=50)cost=0.05;elsecost=0;total=number*price*(1-cost);printf("應(yīng)付貨款=%10.2f\n",total);}【提示】為了使程序結(jié)構(gòu)清晰,便于維護(hù),程序盡量寫成鋸齒形式,養(yǎng)成寫程序的良好習(xí)慣。圖3.9案例3-8流程【案例3-9】評(píng)定學(xué)生成績(jī)等級(jí):85分以上為優(yōu)秀,75分至85分之間為良好,60分至75分之間為及格,60分以下為不及格。請(qǐng)輸入學(xué)生成績(jī),輸出相應(yīng)的等級(jí)。#include<stdio.h>main(){floatx;printf("請(qǐng)輸入學(xué)生的成績(jī):");scanf("%f",&x);if(x>=85)printf("成績(jī)優(yōu)秀\n");elseif(x>=75)printf("成績(jī)良好\n");elseif(x>=60)printf("成績(jī)及格\n");elseprintf("成績(jī)不及格\n");}【試一試】仿照案例3-8,繪制案例3-9的流程圖。二、switch語句用嵌套的if語句可以處理多分支選擇,但如果分支較多,則嵌套的if語句層數(shù)就多,程序冗長(zhǎng)而且可讀性降低。C語言提供的switch語句可以直接處理多分支選擇,并且switch語句條理清楚,結(jié)構(gòu)明了。其一般形式為:switch(表達(dá)式){case常量表達(dá)式1:語句1;case常量表達(dá)式2:語句2;...case常量表達(dá)式n:語句n;default:語句n+1;}switch語句的執(zhí)行過程是:先計(jì)算表達(dá)式的值,如果值與哪個(gè)常量相匹配,就執(zhí)行哪個(gè)case后的語句;如果表達(dá)式的值與所有列舉的常量都不同,則執(zhí)行default后的語句?!景咐?-10】利用switch語句改寫案例3-9。分析:案例3-9也可以用switch語句來實(shí)現(xiàn),使用switch語句要簡(jiǎn)潔一些。#include<stdio.h>main(){intk;floatx;printf("輸入一個(gè)百分制成績(jī):");scanf("%f",&x);if(x<0||x>100) /*判斷輸入數(shù)據(jù)的有效性*/{printf("輸入的數(shù)據(jù)無效!\n");exit(0);}/*終止程序*/k=x/10;switch(k){case10:case9:printf("優(yōu)秀\n");break;case8:printf("良好\n");break;case7:case6:printf("合格\n");break;default:printf("不及格\n");
}}【注意】①case語句和default語句后允許使用語句序列,當(dāng)要安排多個(gè)語句時(shí),不必用花括號(hào)括起來。②在switch結(jié)構(gòu)中,每個(gè)case對(duì)應(yīng)的語句中都有一條break語句,最后一個(gè)分支(default)可以不加break語句?!驹囈辉嚒繉咐?-10中的所有break語句刪除,程序結(jié)果會(huì)改變嗎?【案例3-11】編寫程序,從鍵盤輸入兩個(gè)操作數(shù)和一個(gè)運(yùn)算符,由計(jì)算機(jī)輸出運(yùn)算結(jié)果。(運(yùn)算符為:+、-、*、/)分析:這是一個(gè)多分支選擇的問題,根據(jù)運(yùn)算符的不同,分為四種情況進(jìn)行處理。#include<stdio.h>#include<math.h>main(){floatdata1,data2; /*定義兩個(gè)操作符*/charop; /*定義運(yùn)算符*/printf("請(qǐng)輸入算術(shù)表達(dá)式:\n");scanf("%f%c%f",&data1,&op,&data2); /*輸入運(yùn)算表達(dá)式*/switch(op) /*根據(jù)輸入的運(yùn)算符確定要執(zhí)行的運(yùn)算*/ {case'+':printf("%f+%f=%f\n",data1,data2,data1+data2);break; /*處理加法*/case'-': printf("%f-%f=%f\n",data1,data2,data1-data2);break;/*處理減法*/case'*': printf("%f*%f=%f\n",data1,data2,data1*data2);break;/*處理乘法*/case'/': if(fabs(data2)<=1e-7)/*與實(shí)數(shù)0比較*/printf("Divisionbyzero!\n"); elseprintf("%f/%f=%f\n",data1,data2,data1/data2);break;/*處理除法*/default:printf("無效操作符!\n"); }}【思考】為什么要用到語句“fabs(data2)<=1e-7”?【試一試】將星期一、星期二……星期六、星期日依次編號(hào)為1,2,……,6,7,編一程序從鍵盤輸入星期的序號(hào),則輸出其對(duì)應(yīng)的英文。比如,輸入1,則輸出Monday。第四節(jié)項(xiàng)目任務(wù):軟件用戶界面設(shè)計(jì)優(yōu)化【項(xiàng)目案例】“學(xué)生成績(jī)管理系統(tǒng)”軟件用戶界面設(shè)計(jì)優(yōu)化分析:結(jié)合項(xiàng)目案例任務(wù)實(shí)現(xiàn),需對(duì)軟件主界面和功能進(jìn)行更加合理的設(shè)計(jì)。一般在軟件開始主菜單界面中會(huì)讓用戶選擇執(zhí)行不同的功能模塊,程序應(yīng)該能夠處理功能模塊輸入錯(cuò)誤的情況,使軟件初始界面程序更加健壯。可以利用if嵌套語句,多分支語句實(shí)現(xiàn)這種功能。其處理流程如下:(1)用戶界面顯示。顯示進(jìn)入系統(tǒng)的用戶界面,用戶根據(jù)界面的提示選擇不同的操作。(2)用戶輸入功能編號(hào)。(3)判斷輸入功能編號(hào)。若選擇錯(cuò)誤功能編號(hào),輸出提示信息并退出系統(tǒng)。否則執(zhí)行第④步。(4)根據(jù)用戶所選擇的功能編號(hào)執(zhí)行不同的語句塊。算法流程圖如圖3.10所示。圖3.10算法流程圖程序如下:#include<stdio.h>#include<stdlib.h>/*包含雜項(xiàng)函數(shù)及內(nèi)存分配函數(shù)*/main(){charfunc_code;/*存放選擇功能模塊編號(hào)*/
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度品牌形象廣告安裝及宣傳推廣合同范本3篇
- 二零二五年度多媒體教學(xué)設(shè)備集成銷售合同3篇
- 統(tǒng)編版語文九年級(jí)下冊(cè)第一課祖國啊我親愛的祖國練習(xí)題(含答案)
- 陜西省渭南市尚德中學(xué)2024-2025學(xué)年高一上學(xué)期第二次階段性語文試卷(含答案)
- 二十四節(jié)氣之大寒介紹
- Unit 13 My seven days(說課稿)-2024-2025學(xué)年劍橋少兒英語二級(jí)上冊(cè)
- 二零二五年度報(bào)刊亭智能物流配送合作合同2篇
- 二零二五年度大數(shù)據(jù)房地產(chǎn)典當(dāng)服務(wù)協(xié)議3篇
- 二零二五年度勞動(dòng)合同違約責(zé)任與賠償細(xì)則合同3篇
- 新疆昌吉回族自治州(2024年-2025年小學(xué)六年級(jí)語文)統(tǒng)編版摸底考試(上學(xué)期)試卷及答案
- CQI-23模塑系統(tǒng)評(píng)估審核表-中英文
- 2024年大型游樂設(shè)施操作(Y2)特種作業(yè)取證(廣東)考試復(fù)習(xí)題庫(含答案)
- 【教案】Unit+4+My+Favourite+Subject大單元整體教學(xué)設(shè)計(jì)人教版英語七年級(jí)上冊(cè)
- 2024年省國資委選聘兼職外部董事人選高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 2024-2030年中國工控機(jī)行業(yè)需求狀況及發(fā)展趨勢(shì)分析研究報(bào)告
- 離職證明(標(biāo)準(zhǔn)模版)
- 遼寧省名校聯(lián)盟2024年高三9月份聯(lián)合考試 英語試卷(含答案詳解)
- JGJ181-2009T 房屋建筑與市政基礎(chǔ)設(shè)施工程檢測(cè)
- GB/T 20554-2024海帶
- 100以內(nèi)加減法混合題帶括號(hào)
- 《自然生態(tài)降解聚乙烯工業(yè)包裝膜》編制說明
評(píng)論
0/150
提交評(píng)論