版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
選擇結構程序設計第一節(jié)單分支選擇結構第二節(jié)雙分支選擇結構第三節(jié)多分支選擇結構第四節(jié)項目任務:軟件用戶界面設計優(yōu)化第一節(jié)單分支選擇結構順序結構程序自上而下執(zhí)行,程序中的每一條語句都被執(zhí)行一次,而且只能執(zhí)行一次,完成簡單的運算。而在許多情況下,語句執(zhí)行的順序常常依賴于輸入的數(shù)據(jù)或中間運算結果,即只能根據(jù)當時的具體情況和需要采取不同的處理方式,這種程序結構稱為選擇結構。例如,輸入三角形的三條邊,首先必須判斷是否能構成三角形,若能才求出三角形的面積。這些問題在處理時都需要根據(jù)判定條件來選擇不同的操作。在C語言程序設計中,使用選擇結構需考慮兩個問題:一是確定要判斷的是什么條件,二是當判斷結果為不同的情況(“真”或“假”)時應該執(zhí)行什么操作。根據(jù)選擇執(zhí)行程序分支的數(shù)目,可以將選擇結構細分為三類:單分支選擇結構、雙分支選擇結構、多分支選擇結構。單分支選擇結構是最簡單選擇結構,一般形式如下:If(表達式)語句;流程圖如圖3.1所示。圖3.1單分支選擇結構流程圖單分支if語句的執(zhí)行過程是:如果表達式的值為真(非0),則執(zhí)行其后的語句,否則不執(zhí)行該語句?!景咐?-1】輸入兩個數(shù),輸出其中的大數(shù)。分析:這是一個兩個數(shù)中求較大數(shù)的問題。顯然,兩個數(shù)為程序的輸入項,較大數(shù)為程序的輸出項,其算法可以表示如下:(1)輸入兩個數(shù)a,b;(2)將a賦值給變量max;(3)將b與max比較,如果b>max,將b賦給max;(4)輸出max的值。#include<stdio.h>main(){inta,b,max;printf("\n請輸入第一個整數(shù):");scanf("%d",&a);printf("\n請輸入第二個整數(shù):");scanf("%d",&b);max=a;if(max<b)max=b;printf("較大數(shù)為%d",max);}【案例3-2】輸入x,求出并輸出x的絕對值。分析:在數(shù)學中,正數(shù)的絕對值是正數(shù)本身,負數(shù)的絕對值是其相反數(shù)。其算法可以表示如下:(1)輸入x;(2)判斷x是否小于0,若是,則取反;(3)輸出x的絕對值#include<stdio.h>main(){floatx;printf("請輸入一個數(shù):");scanf("%f",&x);if(x<0)x=-x;printf("這個數(shù)的絕對值是:%f\n",x);}【注意】If后面的表達式一定要有圓括號?!景咐?-3】輸入3個數(shù)a、b、c,要求按由小到大的順序輸出。分析:其算法可以表示如下:(1)先將a與b比較,把小者放入a中,大者放入b中;(2)再將a與c比較,把小者放入a中,大者放入c中,此時a已是三者中最小的;(3)再將b與c比較,把小者放入b中,大者放入c中,此時a、b、c已按由小到大的順序排列;#include<stdio.h>main(){ floata,b,c,t;printf("請輸入需要排序的三個實數(shù):");scanf("%f,%f,%f",&a,&b,&c);if(a>b) {t=a;a=b;b=t;}/*實現(xiàn)a和b的互換*/if(a>c){t=a;a=c;c=t;}/*實現(xiàn)a和c的互換*/if(b>c)
{t=b;b=c;c=t;}/*實現(xiàn)b和c的互換*/printf(“由小到大是:%5.2f,%5.2f,%5.2f",a,b,c);}【注意】if語句表達式為真時,若只處理一條語句,直接書寫即可;若處理多條語句,則此時需要用花括號括起來構成復合語句。第二節(jié)雙分支選擇結構一、if-else語句if語句更常用的形式是雙分支語句,一般形式如下:if(表達式)
語句1;else
語句2;流程圖如圖3.5所示。雙分支if語句的執(zhí)行過程是:如果表達式的值為真(非0),則執(zhí)行語句1;若表達式的值為假(0),執(zhí)行語句2。語句1和語句2可以是一條語句也可以是多條語句。圖3.5雙分支選擇結構流程圖【案例3-4】完善案例3-2。輸入x,求出并輸出x的絕對值。分析:對任意數(shù)x,當x≥0時,它的絕對值為x;當x<0時,它的絕對值為-x。這可以用雙分支選擇結構解決。#include<stdio.h>main(){floatx,y;printf("請輸入一個數(shù):");scanf("%f",&x);if(x<0)y=-x;elsey=x;printf("這個數(shù)的絕對值是:%f\n",y);}【說明】if語句和else語句屬于同一個if語句。else子句不能作為語句單獨使用,它必須是if語句的一部分,與if配對使用?!驹囈辉嚒糠抡瞻咐?-4,用雙分支if語句改寫案例3-1?!景咐?-5】完善案例2-12。輸入三角形的邊長,求三角形面積。分析:從數(shù)學知識可知,構成三角形的必要條件是兩邊之和大于第3邊,因此在計算三角形面積之前應當進行該條件的判斷。#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)/*檢查構成三角形的必要條件是否滿足*/{s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf("area=%6.2f\n",area);}/*大括號內是一個復合語句*/elseprintf("輸入錯誤,三邊不能構成三角形!.\n");}【說明】在if和else后面可以只含一個語句,也可以有多個語句,此時用花括號“{}”將幾個語句括起來成為一個復合語句?!景咐?-6】身高預測。每個做父母的都關心自己孩子成人后的身高,據(jù)有關生理衛(wèi)生知識與數(shù)理統(tǒng)計分析表明,影響小孩成人后的身高的因素包括遺傳、飲食習慣與體育鍛煉等。小孩成人后的身高與其父母的身高和自身的性別密切相關。設faHeight為其父身高,moHeight為其母身高,身高預測公式為男性成人時身高=(faHeight+moHeight)×0.54cm女性成人時身高=(faHeight×0.923+moHeight)/2cm此外,如果喜愛體育鍛煉,那么可增加身高2%;如果有良好的衛(wèi)生飲食習慣,那么可增加身高1.5%。分析:編程從鍵盤輸入用戶的性別(用字符型變量sex存儲,輸入字符F表示女性,輸入字符M表示男性)、父母身高(用實型變量存儲,faHeight為其父身高,moHeight為其母身高)、是否喜愛體育鍛煉(用字符型變量sports存儲,輸入字符Y表示喜愛,輸入字符N表示不喜愛)、是否有良好的飲食習慣等條件(用字符型變量diet存儲,輸入字符Y表示良好,輸入字符N表示不好),利用給定公式和身高預測方法對身高進行預測。程序如下所示:#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ū)別?二、條件運算符與條件表達式C語言中有一種特有的運算符稱為條件運算符,即“?:”。它在某種程度上可以起到邏輯判斷的作用,一樣可以實現(xiàn)雙分支選擇結構。由條件運算符構成的表達式稱為條件表達式,與if-else語句具有相同的功能。其一般形式為:表達式1?表達式2:表達式3其運算規(guī)則為:先求解表達式1,若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值;若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件表達式的值?!景咐?-7】利用條件表達式改寫案例3-1,輸入兩個數(shù),輸出其中的大數(shù)。#include<stdio.h>main(){inta,b,max;printf("\n請輸入第一個整數(shù):");scanf("%d",&a);printf("\n請輸入第二個整數(shù):");scanf("%d",&b);max=a>b?a:b;printf("\n較大數(shù)為%d",max);}【注意】條件運算符的優(yōu)先級高于賦值運算符,但低于關系運算符和算術運算符。第三節(jié)多分支選擇結構C語言中,可以使用嵌套if-else語句和switch語句來實現(xiàn)多分支選擇結構。一、嵌套if-else語句前兩種形式的if語句一般都用于兩個分支的情況。當有多個分支選擇時,可采用if…elseif結構,其一般形式為:
if(表達式1)語句1;
elseif(表達式2)語句2;
elseif(表達式3)語句3;
……elseif(表達式n)語句n;
else語句m;流程圖如圖3.8所示。圖3.8多分支選擇結構流程圖嵌套if-else語句的執(zhí)行過程是:依次判斷表達式的值,當出現(xiàn)某個值為真時,則執(zhí)行其對應的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。如果所有的表達式均為假,則執(zhí)行語句m。然后繼續(xù)執(zhí)行后續(xù)程序。【案例3-8】商場團購促銷活動如下:凡買50件以上(含50件)的優(yōu)惠5%,買100件以上(含100件)的優(yōu)惠7.5%,買300件以上(含300件)的優(yōu)惠10%,買500件以上(含500件)的優(yōu)惠15%。請輸入購買的數(shù)量和單價,輸出應付貨款。分析:首先檢查所購貨物數(shù)量是否大于或等于500,如是,則確定折扣為15%,如果不是(即少于500件),再檢查是否大于或等于300,如是,則表示在300~499范圍內,折扣應為10%,以此類推。而計算公式為:應付貨款=件數(shù)*單價*(1-優(yōu)惠折扣)#include<stdio.h>#include<math.h>voidmain(){intnumber;doublecost,price,total;printf("請輸入商品數(shù)量和單價:");scanf("%d,%lf",&number,&price);/*輸入件數(shù)和單價*/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("應付貨款=%10.2f\n",total);}【提示】為了使程序結構清晰,便于維護,程序盡量寫成鋸齒形式,養(yǎng)成寫程序的良好習慣。圖3.9案例3-8流程【案例3-9】評定學生成績等級:85分以上為優(yōu)秀,75分至85分之間為良好,60分至75分之間為及格,60分以下為不及格。請輸入學生成績,輸出相應的等級。#include<stdio.h>main(){floatx;printf("請輸入學生的成績:");scanf("%f",&x);if(x>=85)printf("成績優(yōu)秀\n");elseif(x>=75)printf("成績良好\n");elseif(x>=60)printf("成績及格\n");elseprintf("成績不及格\n");}【試一試】仿照案例3-8,繪制案例3-9的流程圖。二、switch語句用嵌套的if語句可以處理多分支選擇,但如果分支較多,則嵌套的if語句層數(shù)就多,程序冗長而且可讀性降低。C語言提供的switch語句可以直接處理多分支選擇,并且switch語句條理清楚,結構明了。其一般形式為:switch(表達式){case常量表達式1:語句1;case常量表達式2:語句2;...case常量表達式n:語句n;default:語句n+1;}switch語句的執(zhí)行過程是:先計算表達式的值,如果值與哪個常量相匹配,就執(zhí)行哪個case后的語句;如果表達式的值與所有列舉的常量都不同,則執(zhí)行default后的語句?!景咐?-10】利用switch語句改寫案例3-9。分析:案例3-9也可以用switch語句來實現(xiàn),使用switch語句要簡潔一些。#include<stdio.h>main(){intk;floatx;printf("輸入一個百分制成績:");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語句后允許使用語句序列,當要安排多個語句時,不必用花括號括起來。②在switch結構中,每個case對應的語句中都有一條break語句,最后一個分支(default)可以不加break語句。【試一試】將案例3-10中的所有break語句刪除,程序結果會改變嗎?【案例3-11】編寫程序,從鍵盤輸入兩個操作數(shù)和一個運算符,由計算機輸出運算結果。(運算符為:+、-、*、/)分析:這是一個多分支選擇的問題,根據(jù)運算符的不同,分為四種情況進行處理。#include<stdio.h>#include<math.h>main(){floatdata1,data2; /*定義兩個操作符*/charop; /*定義運算符*/printf("請輸入算術表達式:\n");scanf("%f%c%f",&data1,&op,&data2); /*輸入運算表達式*/switch(op) /*根據(jù)輸入的運算符確定要執(zhí)行的運算*/ {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ù)0比較*/printf("Divisionbyzero!\n"); elseprintf("%f/%f=%f\n",data1,data2,data1/data2);break;/*處理除法*/default:printf("無效操作符!\n"); }}【思考】為什么要用到語句“fabs(data2)<=1e-7”?【試一試】將星期一、星期二……星期六、星期日依次編號為1,2,……,6,7,編一程序從鍵盤輸入星期的序號,則輸出其對應的英文。比如,輸入1,則輸出Monday。第四節(jié)項目任務:軟件用戶界面設計優(yōu)化【項目案例】“學生成績管理系統(tǒng)”軟件用戶界面設計優(yōu)化分析:結合項目案例任務實現(xiàn),需對軟件主界面和功能進行更加合理的設計。一般在軟件開始主菜單界面中會讓用戶選擇執(zhí)行不同的功能模塊,程序應該能夠處理功能模塊輸入錯誤的情況,使軟件初始界面程序更加健壯??梢岳胕f嵌套語句,多分支語句實現(xiàn)這種功能。其處理流程如下:(1)用戶界面顯示。顯示進入系統(tǒng)的用戶界面,用戶根據(jù)界面的提示選擇不同的操作。(2)用戶輸入功能編號。(3)判斷輸入功能編號。若選擇錯誤功能編號,輸出提示信息并退出系統(tǒng)。否則執(zhí)行第④步。(4)根據(jù)用戶所選擇的功能編號執(zhí)行不同的語句塊。算法流程圖如圖3.10所示。圖3.10算法流程圖程序如下:#include<stdio.h>#include<stdlib.h>/*包含雜項函數(shù)及內存分配函數(shù)*/main(){charfunc_code;/*存放選擇功能模塊編號*/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房屋財產(chǎn)分割及共有權轉讓協(xié)議3篇
- 課程設計游標卡尺
- 2025年銷售年終工作總結參考(三篇)
- 二零二五年度創(chuàng)業(yè)投資對賭協(xié)議書范本及退出機制
- 二零二五年度建筑水暖消防工程監(jiān)理分包合同2篇
- 市場總監(jiān)主要職責模版(2篇)
- 課程設計醫(yī)療急救
- 2025年牛津上海版高二地理下冊階段測試試卷
- 2025年人教版七年級物理上冊階段測試試卷
- 2025版頂樓物業(yè)買賣合同書3篇
- (八省聯(lián)考)云南省2025年普通高校招生適應性測試 物理試卷(含答案解析)
- 統(tǒng)編版2024-2025學年第一學期四年級語文期末學業(yè)質量監(jiān)測試卷(含答案)
- 小紅書食用農(nóng)產(chǎn)品承諾書示例
- GB/T 5237.1-2017鋁合金建筑型材第1部分:基材
- GB/T 2317.1-2000電力金具機械試驗方法
- 供應商ROHs審核表
- 五大發(fā)電公司及所屬電廠列表及分部精編版
- 小學數(shù)學聽課記錄 精選(范文20篇)
- 光伏電站設備監(jiān)造與性能驗收
- 10kV架空線路施工方案
- 2018江蘇蘇州中考英語真題解析
評論
0/150
提交評論