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

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)任務(wù)式教程(微課版)

VisualC++1計(jì)算機(jī)工程學(xué)院模塊2結(jié)構(gòu)化程序設(shè)計(jì)任務(wù)1順序結(jié)構(gòu)程序設(shè)計(jì)和程序的基本結(jié)構(gòu)任務(wù)2選擇結(jié)構(gòu)程序設(shè)計(jì)任務(wù)3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)

2計(jì)算機(jī)工程學(xué)院

任務(wù)1順序結(jié)構(gòu)程序設(shè)計(jì)和程序的基本結(jié)構(gòu)

學(xué)習(xí)目標(biāo)

掌握程序設(shè)計(jì)的三種基本結(jié)構(gòu),掌握流程圖的繪制方法。3計(jì)算機(jī)工程學(xué)院案例1計(jì)算課程總評成績1.問題描述已知某學(xué)生課程A的平時(shí)成績、實(shí)驗(yàn)成績和期末考試成績,求該課程的總評成績。其中平時(shí)、實(shí)驗(yàn)和期末成績分別占20%、30%和50%。2.1.1案例講解

4計(jì)算機(jī)工程學(xué)院2.編寫程序

(1)定義整型變量score1、score2和score3分別存放課程A的平時(shí)成績、實(shí)驗(yàn)成績和期末考試成績;定義實(shí)型變量total存放總評成績;(2)輸入score1、score2和score3的值;(3)根據(jù)比例計(jì)算總評成績:

total=score1*0.2+score2*0.3+score3*0.5;(4)輸出總評成績total。

5計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX2_1.cpp*/#include"stdio.h"voidmain(){intscore1,score2,score3;floattotal;printf("請輸入成績:");scanf("%d%d%d",&score1,&score2,&score3);

total=score1*0.2+score2*0.3+score3*0.5;

printf("總評成績是%.1f\n",total);}6計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果7圖2-1案例1運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院5.歸納分析案例1程序的執(zhí)行過程是按照源程序中語句的書寫順序逐條執(zhí)行的,這樣的程序結(jié)構(gòu)稱為順序結(jié)構(gòu)。模塊1中的程序均屬于順序結(jié)構(gòu)。順序結(jié)構(gòu)在程序自上而下執(zhí)行時(shí),程序中的每一條語句都要執(zhí)行一次,并且只執(zhí)行一次,以這樣固定的處理方式只能解決一些簡單的任務(wù)。但實(shí)際應(yīng)用中,往往會(huì)出現(xiàn)一些特別的要求,比如根據(jù)某個(gè)條件來決定下面該進(jìn)行什么操作,或根據(jù)某個(gè)要求不斷地重復(fù)執(zhí)行若干動(dòng)作,這就需要控制程序的執(zhí)行順序。

8計(jì)算機(jī)工程學(xué)院

2.1.2基礎(chǔ)理論

1.三種基本控制結(jié)構(gòu)

程序中語句的執(zhí)行順序是由程序設(shè)計(jì)語言中的控制結(jié)構(gòu)規(guī)定的。控制結(jié)構(gòu)有順序結(jié)構(gòu)、選擇結(jié)構(gòu)及循環(huán)結(jié)構(gòu)三種基本結(jié)構(gòu)。

順序結(jié)構(gòu)是最簡單的結(jié)構(gòu)。

選擇結(jié)構(gòu)又稱為分支結(jié)構(gòu),當(dāng)程序執(zhí)行時(shí),計(jì)算機(jī)按一定的條件選擇下一步要執(zhí)行的操作。例如:輸入三角形的三條邊計(jì)算面積時(shí),要判斷三條邊是否能構(gòu)成三角形,若能則計(jì)算面積,否則要告訴用戶輸入錯(cuò)誤。

9計(jì)算機(jī)工程學(xué)院循環(huán)結(jié)構(gòu)又稱為重復(fù)結(jié)構(gòu),它是程序中需要按某一條件反復(fù)執(zhí)行一定的操作而采用的控制結(jié)構(gòu)。例如,從鍵盤上輸入20個(gè)整數(shù),求其累加和。三種結(jié)構(gòu)之間可以是平行關(guān)系,也可以相互嵌套,結(jié)構(gòu)之間通過復(fù)合可以形成復(fù)雜的結(jié)構(gòu)。已經(jīng)證明,由以上三種基本結(jié)構(gòu)順序組成的程序結(jié)構(gòu),可以解決任何復(fù)雜的問題。由三種基本結(jié)構(gòu)構(gòu)成的程序稱為結(jié)構(gòu)化程序。2.程序流程圖10計(jì)算機(jī)工程學(xué)院在對一個(gè)復(fù)雜問題求解時(shí),程序的結(jié)構(gòu)比較復(fù)雜,所以在程序設(shè)計(jì)階段為了表示程序的操作順序往往先畫出程序流程圖,這樣有助于最終寫出完整正確的程序。下面介紹流程圖的有關(guān)概念。流程圖是用規(guī)定的圖形、連線和文字說明表示問題求解步驟(算法)的一組圖形,具有直觀、形象、易于理解等優(yōu)點(diǎn)。流程圖使用的圖形符號(hào)見表2-1。流程圖中的每一個(gè)框表示一段程序(包括一個(gè)或多個(gè)語句)的功能,各框內(nèi)必須寫明

11計(jì)算機(jī)工程學(xué)院要做的操作,說明要簡單明確,不能含糊不清。如在框內(nèi)只寫“計(jì)算”,但卻不寫出計(jì)算什么,就不容易讓人明白。一般來說,用得最多的是矩形框和菱形框。矩形框表示處理,不進(jìn)行比較和判斷,只有一個(gè)入口和一個(gè)出口;菱形框表示進(jìn)行檢查判別,有一個(gè)入口,兩個(gè)出口,即比較后形成兩個(gè)分支,在兩個(gè)出口處必須注明哪一個(gè)分支是對應(yīng)滿足條件的,哪個(gè)分支是對應(yīng)不滿足條件的。

12計(jì)算機(jī)工程學(xué)院表2-1流程圖圖形符號(hào)13計(jì)算機(jī)工程學(xué)院前面介紹的三種基本結(jié)構(gòu)的流程圖可分別用圖2-2、圖2-3和圖2-4表示。其中循環(huán)結(jié)構(gòu)有兩種形式:當(dāng)型(圖2-4(a))和直到型(圖2-4(b))。

圖2-4循環(huán)結(jié)構(gòu)14計(jì)算機(jī)工程學(xué)院3.語句在模塊1中,我們已經(jīng)了解了C語言程序的基本構(gòu)成。其中語句是程序的主要部分。C語句一般可分為:表達(dá)式語句、控制語句、復(fù)合語句和空語句。

(1)表達(dá)式語句表達(dá)式語句由一個(gè)表達(dá)式加上分號(hào)構(gòu)成,一般格式為:

表達(dá)式;最常用的表達(dá)式語句是賦值表達(dá)式語句,例如:total=score1*0.2+score2*0.3+score*0.5;15計(jì)算機(jī)工程學(xué)院

在C語言中,任何一個(gè)合法的C語言表達(dá)式后面加上一個(gè)分號(hào)就成了一個(gè)語句,例如:

m=a+b

是表達(dá)式,不是語句

i++;

是語句,作用是使i加1

x+y;

也是語句,作用是完成x+y的操作,它是合法的,但并不把結(jié)果賦給變量,所以沒有實(shí)際意義。

案例1中出現(xiàn)的以下語句:

printf("請輸入成績:");scanf("%d%d%d",&score1,&score2,&score3);16計(jì)算機(jī)工程學(xué)院稱為函數(shù)調(diào)用語句,是由一次函數(shù)調(diào)用加上一個(gè)分號(hào)構(gòu)成。函數(shù)調(diào)用語句也屬于表達(dá)式語句。

(2)控制語句控制語句是用于控制程序執(zhí)行流程的。C語言中有以下九種控制語句,它們是:

(1)if()~else~ 條件語句(2)switch 多分支選擇語句(3)for()~ 循環(huán)語句(4)while()~ 循環(huán)語句17計(jì)算機(jī)工程學(xué)院

(5)do~while() 循環(huán)語句(6)continue 結(jié)束本次循環(huán)語句(7)break 中止執(zhí)行switch或循環(huán)語句(8)goto 轉(zhuǎn)向語句(9)return 函數(shù)返回語句其中語句(1)和(2)用于實(shí)現(xiàn)程序的選擇結(jié)構(gòu),語句(3)~(5)用于實(shí)現(xiàn)程序的循環(huán)結(jié)構(gòu)。(3)復(fù)合語句18計(jì)算機(jī)工程學(xué)院

復(fù)合語句是用一對花括號(hào)括起來的一組語句,又稱塊語言。一般格式為:

{

語句1

語句2

······

語句n}

在以后的案例程序中將會(huì)經(jīng)常使用到復(fù)合語句。

19計(jì)算機(jī)工程學(xué)院

(4)空語句

空語句是僅有一個(gè)分號(hào)的語句,格式為:;空語句被執(zhí)行時(shí)實(shí)際上什么也不做。但在后面的案例程序中我們將會(huì)看到它的特殊用途。20計(jì)算機(jī)工程學(xué)院2.1.3技能訓(xùn)練

【實(shí)驗(yàn)2.1.1】編寫程序,求一個(gè)三位正整數(shù)的各位數(shù)字之和。例如756的各位數(shù)字之和為7+5+6=18.【指導(dǎo)】(1)問題分析首先要正確分離出三位正整數(shù)的個(gè)位數(shù)、十位數(shù)和百位數(shù):百位數(shù)可用對100整除的方法求得,如756/100=7;十位數(shù)用對100求余的結(jié)果再對10整除求得,如756%100/10=5;個(gè)位數(shù)用對10求余求得,如756%10=6。21計(jì)算機(jī)工程學(xué)院(2)求解步驟定義變量num存放三位正整數(shù);變量n1、n2和n3分別存放個(gè)位數(shù)、十位數(shù)和百位數(shù);變量sum

存放和;分離正整數(shù)num;求和;輸出結(jié)果。(3)編寫源程序22計(jì)算機(jī)工程學(xué)院

/*EX2_2.cpp*/

#include"stdio.h"voidmain(){intnum,n1,n2,n3,sum;printf("請輸入一個(gè)三位正整數(shù):");scanf("%d",&num);n1=num%10;/*分離個(gè)位數(shù)*/n2=num%100/10;/*分離十位數(shù)*/n3=num/100;/*分離百位數(shù)*/sum=n1+n2+n3;printf("%d+%d+%d=%d\n",n1,n2,n3,sum);}23計(jì)算機(jī)工程學(xué)院(4)運(yùn)行結(jié)果圖2-5實(shí)驗(yàn)2-1運(yùn)行結(jié)果24計(jì)算機(jī)工程學(xué)院【實(shí)驗(yàn)2.1.2】用流程圖表示求解下述問題的程序流程。(1)問題描述根據(jù)人體的身高和體重因素,可以按以下“體重指數(shù)”對人的肥胖程度進(jìn)行劃分:體重指數(shù)t=體重w/(身高h(yuǎn))2

(w單位為kg,h單位為m)當(dāng)t<18時(shí),為低體重;當(dāng)t介于18和25之間時(shí),為正常體重;當(dāng)t介于25和27之間時(shí),為超體重;當(dāng)t>27時(shí),為肥胖。25計(jì)算機(jī)工程學(xué)院

(2)問題分析該問題需要采用選擇結(jié)構(gòu)來實(shí)現(xiàn)。具體步驟如下:輸入體重w和身高h(yuǎn);計(jì)算體重指數(shù)t;根據(jù)體重指數(shù)t判斷體型。(3)流程圖26計(jì)算機(jī)工程學(xué)院圖2-6實(shí)驗(yàn)2-2流程圖

開始定義w,h,t輸入w,h計(jì)算tt<18t<25t<27肥胖偏胖正常偏低結(jié)束YNYYNN27計(jì)算機(jī)工程學(xué)院【實(shí)驗(yàn)2.1.3】用流程圖表示輸入10個(gè)整數(shù),輸出其中最大數(shù)的求解步驟。

(1)問題分析該問題采用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)反復(fù)輸入數(shù)據(jù)和比較數(shù)據(jù),數(shù)據(jù)的比較則用選擇結(jié)構(gòu)完成。具體步驟如下:設(shè)變量a存放輸入的數(shù)據(jù),變量max存放最大數(shù);輸入第一數(shù)a,并將它設(shè)為最大值(默認(rèn)為最大),即max=a;28計(jì)算機(jī)工程學(xué)院依次讀入數(shù)據(jù),與max比較,若比max大,則用當(dāng)前數(shù)代替max中的值,如此循環(huán)9次;輸出最大數(shù)。(2)流程圖29計(jì)算機(jī)工程學(xué)院圖2-7實(shí)驗(yàn)2-3流程圖NNYYi=1i<=9a>maxmax=a開始結(jié)束i=i+1輸入a輸出max輸入amax=a30計(jì)算機(jī)工程學(xué)院

2.1.4拓展與練習(xí)

【練習(xí)1】編寫程序求解一元二次方程ax2+bx+c=0的根(假定方程有實(shí)根)。編程要求:

(1)畫出流程圖;(2)從鍵盤輸入系數(shù)a、b、c,輸入前要有如下提示:“請輸入系數(shù)”;(3)以“x1=...”和“x2=...”的格式輸出方程的根。

31計(jì)算機(jī)工程學(xué)院【練習(xí)2】用流程圖表示判斷一個(gè)數(shù)能否同時(shí)被3和5整除?!揪毩?xí)3】從鍵盤輸入20學(xué)生的成績,統(tǒng)計(jì)合格和不合格學(xué)生的人數(shù)。成績大于等于60為合格,否則為不合格。用流程圖表示求解步驟。32計(jì)算機(jī)工程學(xué)院

2.1.5編程規(guī)范與常見錯(cuò)誤

1.編程規(guī)范(1)表達(dá)式比較復(fù)雜時(shí),可以在運(yùn)算符的兩邊各加一個(gè)空格,使源程序更加清晰。例如:

total=score1*0.2+score2*0.3+score3*0.5;

age>=20&&sex==’M’。(2)輸入數(shù)據(jù)前要加提示信息。例如:

intnum;printf("請輸入一個(gè)三位正整數(shù):");

scanf("%d",&num);

33計(jì)算機(jī)工程學(xué)院

避免這樣的書寫習(xí)慣:

intnum;

scanf("%d",&num);。(3)輸出結(jié)果要有文字說明。例如:

total=score1*0.2+score2*0.3+score3*0.5;

printf("總評成績是%.1f\n",total);

不要只輸出一個(gè)值,例如:

printf("%.1f\n",total);。34計(jì)算機(jī)工程學(xué)院2.常見錯(cuò)誤(1)表達(dá)式漏括號(hào)。例如計(jì)算x=,寫成x=-b/2*a。源程序能通過編譯,但運(yùn)行結(jié)果會(huì)出錯(cuò)。正確的寫法是x=-b/(2*a),或x=-b/2/a。(2)語句漏分號(hào)。這是初學(xué)者上機(jī)時(shí)遇到的最多問題。例如程序中有以下語句:

sum=num1+num2;ave=sum/2.0;編譯時(shí)會(huì)出現(xiàn)出錯(cuò)提示:syntaxerror:

missing';'beforeidentifier'ave'。表示由于前一語句漏分號(hào)引起語法錯(cuò)誤。35計(jì)算機(jī)工程學(xué)院一、算法1、算法的概念:為解決某一個(gè)問題而采取的方法和步驟。補(bǔ)充:

算法及其表示2、算法的五大特性:⑴有窮性:有限步驟內(nèi)結(jié)束⑵確定性:不能產(chǎn)生歧義⑶可行性⑷0個(gè)或多個(gè)輸入:從外界獲取必要信息⑸1個(gè)或多個(gè)輸出:算法必須有結(jié)果①計(jì)算出5??;②輸入一個(gè)正整數(shù)n,然后判斷n是否為素?cái)?shù);③計(jì)算任意兩個(gè)整數(shù)的最大公約數(shù)。示例程序=算法+數(shù)據(jù)結(jié)構(gòu)將成績優(yōu)秀的學(xué)生名單打印計(jì)算機(jī)工程學(xué)院運(yùn)算符的優(yōu)先級別及結(jié)合性【例3-1】c>a+b等價(jià)于c>(a+b);關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符a>b==c等價(jià)于(a>b)==c;“>”優(yōu)先級高于“==”a==b<c等價(jià)于a==(b<c);“<”優(yōu)先級高于“==”a=b>c 等價(jià)于a=(b>c);關(guān)系運(yùn)算符的優(yōu)先級高于賦值運(yùn)算符計(jì)算機(jī)工程學(xué)院二、算法的表示1、自然語言:易懂但不直觀2、流程圖:自然圖形3、N-S圖:矩形框4、偽代碼:介于自然語言和計(jì)算機(jī)語言之間的文字和符號(hào)【示例】求a,b的最大值max。自然語言:如果a的值比b的值大,把a(bǔ)的值賦給max;否則,把b的值賦給max。符號(hào)形狀名稱圓角矩形起止框平行四邊形輸入、輸出框矩形處理框菱形判斷框帶箭頭的(折)線段流程線a>ba=>maxb=>maxYN流程圖【例2-1】⑴用偽代碼方式表示算法“打印出x的絕對值”;⑵用偽代碼方式表示算法“求5!”;⑵開始置t的值為1置i的值為2當(dāng)<=5時(shí)t=t×ii=i﹢1輸出t結(jié)束N-S圖a>ba=>maxb=>max成立不成立⑴開始若x為正數(shù)打印x的值否則打印-x的值結(jié)束計(jì)算機(jī)工程學(xué)院

典型實(shí)例【例】求一元二次方程ax2+bx+c=0的兩個(gè)不同的實(shí)數(shù)根,要求:a、b、c三個(gè)系數(shù)從鍵盤輸入,保證a≠0且b2-4ac>0。分析:由高中數(shù)學(xué)可知,當(dāng)判別式?=b2-4ac>0時(shí),方程有兩個(gè)不相等的實(shí)數(shù)根,并可用求根公式表示。令p=-b/2a,q=sqrt(?)/2a,兩個(gè)根分別為:x1=p+q,x2=p-q。因此,程序中要用到系統(tǒng)提供的平方根函數(shù)sqrt(),需要將該函數(shù)所在的頭文件math.h包含到程序中。定義變量disc,x1,x2,p,qp+q=>x1b*b-4*a*c=>discsqrt(disc)/(2*a)=>q-b/(2*a)=>pp-q=>x2輸出x1,x2計(jì)算機(jī)工程學(xué)院

2.1.6貫通案例之一

1.問題描述學(xué)生成績管理系統(tǒng)可以分為八個(gè)主要的模塊,包括加載文件模塊、增加學(xué)生成績模塊、顯示學(xué)生成績模塊、刪除學(xué)生成績模塊、修改學(xué)生成績模塊、查詢學(xué)生成績模塊、學(xué)生成績排序模塊和保存文件模塊。2.系統(tǒng)模塊結(jié)構(gòu)40計(jì)算機(jī)工程學(xué)院圖2-8功能模塊結(jié)構(gòu)圖41計(jì)算機(jī)工程學(xué)院3.編寫程序?qū)崿F(xiàn)系統(tǒng)主菜單的顯示

/*EX2_3.cpp*/#include"stdio.h"voidmain(){printf("#=========================#\n");printf(“#學(xué)生成績管理系統(tǒng)#\n");printf("#--------------------------------------------#\n");printf("#copyright@2009-10-1#\n");printf("#=========================#\n");printf(“#1.加載文件#\n");printf(“#2.增加學(xué)生成績#\n");42計(jì)算機(jī)工程學(xué)院

printf(“#3.顯示學(xué)生成績#\n");printf(“#4.刪除學(xué)生成績#\n");printf(“#5.修改學(xué)生成績#\n");printf(“#6.查詢學(xué)生成績#\n");printf(“#7.學(xué)生成績排序#\n");printf(“#8.保存文件#\n");printf(“#0.退出系統(tǒng)#\n");printf("#=============================#\n");}43計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果圖2-9系統(tǒng)主菜單界面

44計(jì)算機(jī)工程學(xué)院

任務(wù)2選擇結(jié)構(gòu)程序設(shè)計(jì)

學(xué)習(xí)目標(biāo)

掌握關(guān)系運(yùn)算符、邏輯運(yùn)算符,熟練掌握if…else的三種用法,領(lǐng)會(huì)switch與break語句的作用。45計(jì)算機(jī)工程學(xué)院

2.2.1案例講解

案例1出租車計(jì)費(fèi)1.問題描述某市出租車3公里的起租價(jià)為10元,3公里以外,按1.8元/公里計(jì)費(fèi)?,F(xiàn)編程輸入行車?yán)锍虜?shù),輸出應(yīng)付車費(fèi)。2.編程分析(1)用實(shí)型變量km存放行車?yán)锍虜?shù),實(shí)型變量fee存放車費(fèi);(2)輸入行車?yán)锍虜?shù);(3)根據(jù)行車?yán)锍虜?shù)作出判斷,進(jìn)行不同的處理;46計(jì)算機(jī)工程學(xué)院(4)輸出車費(fèi)。3.編寫源程序

/*EX2_4.cpp*/#include<stdio.h>voidmain(){floatkm,fee;printf("輸入行車?yán)锍虜?shù):");scanf("%f",&km);if(km<=3.0)47計(jì)算機(jī)工程學(xué)院

fee=10.0;else fee=10.0+(km-3.0)*1.8;printf("%.2f公里,請付¥%.2f\n",km,fee);}48計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果圖2-10案例1運(yùn)行結(jié)果49計(jì)算機(jī)工程學(xué)院5.歸納分析

案例1需要根據(jù)行車?yán)锍虜?shù)作出選擇進(jìn)行不同的兩種計(jì)算。處理此類兩個(gè)分支問題時(shí)常使用if語句。if語句是用來判斷給定的條件是否滿足,根據(jù)判斷的結(jié)果(真或假)決定執(zhí)行某個(gè)分支的操作。

(1)if語句的一般形式

if(<表達(dá)式>)

<語句1>else<語句2>50計(jì)算機(jī)工程學(xué)院

(2)執(zhí)行過程:計(jì)算<表達(dá)式>的值,若結(jié)果為“真”(非0),則執(zhí)行<語句1>,否則,執(zhí)行<語句2>。if-else構(gòu)成了一個(gè)兩路分支結(jié)構(gòu)。流程圖見圖2-11。

(3)注意if后面的<表達(dá)式>必須用圓括號(hào)括起來;if和else同屬于一個(gè)if語句,else不能作為語句單獨(dú)使用,必須與if配對使用。51計(jì)算機(jī)工程學(xué)院案例2計(jì)算三角形的面積1.問題描述

輸入三角形的三個(gè)邊長,判斷能否構(gòu)成三角形,若能則計(jì)算并輸出三角形的面積,否則輸出出錯(cuò)信息。2.編程分析

(1)用實(shí)型變量a、b和c表示三角形的三條邊,實(shí)型變量area表示三角形的面積;(2)構(gòu)成三角形的條件是任意兩邊之和大于第三邊;52計(jì)算機(jī)工程學(xué)院

(3)如滿足構(gòu)成三角形的條件,計(jì)算并輸出三角形的面積;否則輸出出錯(cuò)信息。計(jì)算三角形的面積使用海倫公式:

其中:

3.編寫源程序53計(jì)算機(jī)工程學(xué)院

/*EX2_5.cpp*/#include<stdio.h>#include<math.h>voidmain(){ floata,b,c; floatarea,s;/*s為中間變量,存放三角形的半周長*/ printf("Pleaseinputabc:");

scanf("%f%f%f",&a,&b,&c);

if(a+b>c&&a+c>b&&b+c>a)/*判斷輸入的a,b,c能否構(gòu)成三角形*/54計(jì)算機(jī)工程學(xué)院

{ s=(a+b+c)/2.0; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("areais%f\n",area); } else printf("inputerrer\n");}55計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果圖2-12案例2三邊符合構(gòu)成三角形的運(yùn)行結(jié)果56計(jì)算機(jī)工程學(xué)院圖2-13案例2三邊不符合構(gòu)成三角形的運(yùn)行結(jié)果57計(jì)算機(jī)工程學(xué)院5.歸納分析當(dāng)輸入的三條邊符合構(gòu)成三角形條件時(shí),進(jìn)行計(jì)算并輸出三角形的面積時(shí)需要三條語句完成,此時(shí)必須用一對花括號(hào)把它們括起來,即使用復(fù)合語句的形式。案例3數(shù)制轉(zhuǎn)換1.問題描述

58計(jì)算機(jī)工程學(xué)院輸入一個(gè)無符號(hào)整數(shù),然后按用戶輸入的進(jìn)制代號(hào),分別以十進(jìn)制(代號(hào)d)、八進(jìn)制(代號(hào)o)和十六進(jìn)制(代號(hào)x)數(shù)的形式輸出。2.編程分析

(1)設(shè)變量ua存儲(chǔ)無符號(hào)整數(shù)、變量code表示進(jìn)制代號(hào);(2)根據(jù)輸入的進(jìn)制代號(hào)輸出相應(yīng)的數(shù)據(jù)。流程圖如圖2-14所示。59計(jì)算機(jī)工程學(xué)院圖2-14案例3的流程圖60計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX2_6.cpp*/#include<stdio.h>voidmain(){ intua; charcode; printf("請輸入無符號(hào)整數(shù)和進(jìn)制代號(hào):"); scanf("%d%c",&ua,&code);61計(jì)算機(jī)工程學(xué)院

switch(code){ case'd':printf("十進(jìn)制數(shù):%d\n",ua);break;case'o':printf("八進(jìn)制數(shù):%o\n",ua);break;case'x':printf("十六進(jìn)制數(shù):%x\n",ua);break;default:printf("進(jìn)制代號(hào)錯(cuò)誤!");}}62計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果

圖2-15案例3運(yùn)行結(jié)果163計(jì)算機(jī)工程學(xué)院圖2-16案例3運(yùn)行結(jié)果264計(jì)算機(jī)工程學(xué)院5.歸納分析案例3是一個(gè)多路分支問題,程序中使用了C語言提供的實(shí)現(xiàn)多路選擇的語句—switch語句。

(1)switch語句根據(jù)一個(gè)供進(jìn)行判斷的表達(dá)式的結(jié)果來執(zhí)行多個(gè)分支中的一個(gè),其一般形式如下:switch(<表達(dá)式>){case<常量表達(dá)式1>:<語句序列1>case<常量表達(dá)式2>:<語句序列2>::65計(jì)算機(jī)工程學(xué)院case<常量表達(dá)式n>:<語句序列n>default:<語句序列n+1>

}其中,每個(gè)“case<常量表達(dá)式>:”稱為case子句,代表一個(gè)case分支的入口。因此每個(gè)case后面<常量表達(dá)式>的值必須互不相等。(2)switch語句的執(zhí)行過程先計(jì)算<表達(dá)式>的值,然后依次與每個(gè)case子句后面的<常量表達(dá)式>的值進(jìn)行比較,如果

66計(jì)算機(jī)工程學(xué)院匹配成功,則執(zhí)行該case子句后面的<語句序列>,在執(zhí)行過程中,若遇到break語句,就跳出switch語句,否則就繼續(xù)執(zhí)行后面的<語句序列>,直到遇到break語句或執(zhí)行到switch語句的末尾(‘}’);若表達(dá)式的值不能與任何一個(gè)<常量表達(dá)式>匹配,則執(zhí)行default子句所對應(yīng)的語句。default子句是可選項(xiàng),如果沒有該子句,則表示在所有匹配都失敗時(shí),switch語句什么也不執(zhí)行。67計(jì)算機(jī)工程學(xué)院案例4字符類型判斷。1.問題描述

從鍵盤輸入一個(gè)字符,判斷是英文字母、數(shù)字字符還是其他字符。2.編程分析(1)輸入字符存放在變量ch中;(2)如果是英文字母,輸出“是英文字母”,轉(zhuǎn)(4);否則轉(zhuǎn)(3);(3)如果是數(shù)字字符,輸出“是數(shù)字字符”,否則輸出“是其他字符”;

68計(jì)算機(jī)工程學(xué)院(4)結(jié)束運(yùn)行。

其中英文字母可以用表達(dá)式“ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'”來判斷,而數(shù)字字符的判斷則用表達(dá)式“ch>='0'&&ch<='9'。流程圖見圖2-16所示。69計(jì)算機(jī)工程學(xué)院圖2-17案例4流程圖NNYY英文字符?開始輸入ch“其他字符”結(jié)束數(shù)字字符?“是數(shù)字”“是英文”①②③④⑤70計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX2_7.cpp*/#include<stdio.h>voidmain(){charch;printf("請輸入一個(gè)字符:");scanf("%c",&ch);if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')printf("%c是英文字母.\n",ch);

71計(jì)算機(jī)工程學(xué)院elseif(ch>='0'&&ch<='9')printf("%c是數(shù)字字符.\n",ch);elseprintf("%c是其他字符.\n",ch);}72計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果

圖2-18案例4運(yùn)行結(jié)果173計(jì)算機(jī)工程學(xué)院圖2-19案例4運(yùn)行結(jié)果274計(jì)算機(jī)工程學(xué)院5.歸納分析

本案例中,對給定問題要分三種情況進(jìn)行判斷。這就需要使用嵌套形式的if語句來實(shí)現(xiàn)。if語句的嵌套就是在一個(gè)if語句中又包含另一個(gè)if語句。

(1)if語句的一般嵌套形式

if(<表達(dá)式1>)

if(<表達(dá)式2>)<語句1>內(nèi)嵌if-else語句

else<語句2>else外層if-else語句

if(<表達(dá)式3>)<語句3>內(nèi)嵌if-else語句

else<語句4>75計(jì)算機(jī)工程學(xué)院上面的一般形式中是在if和else

中各自內(nèi)嵌一個(gè)if-else語句。(2)嵌套形式不具有固定的語句格式。本案例中使用的在外層if語句中的else的后面內(nèi)嵌一個(gè)if-else語句的形式。自上而下看流程圖2-16可知,當(dāng)ch是英文字母時(shí),執(zhí)行路徑為①⑤;當(dāng)ch是數(shù)字文字符時(shí),執(zhí)行路徑為②③⑤,ch是其他字符時(shí),執(zhí)行路徑為②④⑤。76計(jì)算機(jī)工程學(xué)院2.2.2基礎(chǔ)理論1.if語句的缺省形式

如果if-else語句中else后面的<語句2>是空語句時(shí),則if語句可簡化為:

if(<表達(dá)式>)

<語句1>其執(zhí)行過程是:計(jì)算<表達(dá)式>的值,如果<表達(dá)式>的值“真”(非0),執(zhí)行<語句1>,否則什么也不做,轉(zhuǎn)去執(zhí)行if語句的后繼語句。流程圖見圖2-20。77計(jì)算機(jī)工程學(xué)院圖2-20流程圖假真求表達(dá)式語句1后繼語句78計(jì)算機(jī)工程學(xué)院用缺省形式的if語句重寫【案例1】。#include<stdio.h>voidmain(){floatkm,fee;printf("輸入行車?yán)锍虜?shù):");scanf("%f",&km); fee=10.0;if(km>3.0)fee=10.0+(km-3.0)*1.8;printf("%.2f公里,請付¥%.2f\n",km,fee);}79計(jì)算機(jī)工程學(xué)院程序中在if語句前加了一條語句fee=10.0;,當(dāng)輸入的行車?yán)锍虜?shù)小于3公里時(shí),不再需要計(jì)算車費(fèi),所以可以采用缺省的if語句。2.if和else的配對規(guī)則使用if語句的嵌套形式時(shí),如果if的數(shù)目和else的數(shù)目相同,它們的配對關(guān)系比較清楚。但由于存在if語句的缺省形式,會(huì)出現(xiàn)if與else的數(shù)目不一樣的情況,初學(xué)者往往會(huì)弄錯(cuò)它們的配對關(guān)系。因此,必須正確理解C語言中if與else的配對規(guī)則。C語言規(guī)定:else與前面最接近它而又沒有和其它else配對的if配對。80計(jì)算機(jī)工程學(xué)院下面的程序是試圖判斷x是大于0的偶數(shù)還是小于等于零。現(xiàn)分析一下程序在x分別取值為8、-5和5時(shí)的輸出結(jié)果。

#include<stdio.h>voidmain(){intx;printf("Enterx:");scanf("%d",&x);

81計(jì)算機(jī)工程學(xué)院if(x>0)

if(x%2==0)printf("x>0andxiseven.\n");elseprintf("x<=0.\n");}程序運(yùn)行情況1:

Enterx:8

x>0andxiseven.程序運(yùn)行情況2:

Enterx:-5

程序運(yùn)行情況3:

Enterx:5

x<=0.82計(jì)算機(jī)工程學(xué)院從程序運(yùn)行的三種情況來看:情況2、3的結(jié)果顯然是錯(cuò)誤的。為什么呢?從書寫格式上看,編程者是試圖使else與第一個(gè)if組成if-else結(jié)構(gòu),即當(dāng)x<=0時(shí)執(zhí)行else后面的printf("x<=0.\n");語句。但是,根據(jù)if-else的配對原則,編譯系統(tǒng)實(shí)際上是把else與第二個(gè)if作為配對關(guān)系處理,程序運(yùn)行情況3的結(jié)果就說明了這種配對關(guān)系。所以書寫格式并不能代替程序邏輯。為實(shí)現(xiàn)編者的意圖,必須加“{}”,來強(qiáng)制確定配對關(guān)系,即將第二個(gè)if語句用“{}”括起來,即:

83計(jì)算機(jī)工程學(xué)院

if(x>0){if(x%2==0)printf("x>0andxiseven.\n");}elseprintf("x<=0.\n");3.正確使用switch語句84計(jì)算機(jī)工程學(xué)院在案例3中我們已經(jīng)使用了switch語句,但還應(yīng)注意以下問題:(1)switch后面表達(dá)式的類型,一般為整型、字符型和枚舉類型(枚舉類型將在后面模塊中介紹)。(2)case子句中<常量表達(dá)式>的類型應(yīng)該與switch后面<表達(dá)式>的類型相容,每個(gè)case子句中<常量表達(dá)式>的值必須互不相等,case和<常量表達(dá)式>之間要有空格,case后面的<常量表達(dá)式>之后有“:”,且所有case包含在“{}”里。

(3)一種情況處理完后,一般應(yīng)使程序的執(zhí)行流程跳出switch語句,則由break語句完成。如果沒有85計(jì)算機(jī)工程學(xué)院

break語句,將會(huì)在繼續(xù)執(zhí)行后面的語句,直到switch語句結(jié)尾。重寫【案例3】,觀察case子句中沒有break語句時(shí)程序的運(yùn)行結(jié)果。

#include<stdio.h>voidmain()

{ intua; charcode; printf("請輸入無符號(hào)整數(shù)和進(jìn)制代號(hào):")

86計(jì)算機(jī)工程學(xué)院

scanf("%d%c",&ua,&code); switch(code){ case'd':printf("十進(jìn)制數(shù):%d\n",ua);case'o':printf("八進(jìn)制數(shù):%o\n",ua);case'x':printf("十六進(jìn)制數(shù):%x\n",ua);default:printf("進(jìn)制代號(hào)錯(cuò)誤!");}}運(yùn)行情況如圖2-21所示。由此可見,case子句87計(jì)算機(jī)工程學(xué)院只是起一個(gè)標(biāo)號(hào)的作用,確定匹配的入口,然后從此處開始一直執(zhí)行下去,對后面的case子句的值不再進(jìn)行比較。所以,當(dāng)僅需執(zhí)行一個(gè)分支情況時(shí),則在case子句后面的語句序列中必須包含一個(gè)break語句。圖2-21運(yùn)行結(jié)果88計(jì)算機(jī)工程學(xué)院

(4)當(dāng)多種常量表達(dá)式代表同一種情況時(shí),出現(xiàn)在前面的case子句可以無處理語句,即多個(gè)case子句共用一組處理語句。例如【案例3】中,如果用戶希望輸入進(jìn)制代號(hào)時(shí)對字母無大小寫要求,則可對【案例3】的源程序作如下修改。運(yùn)行結(jié)果如圖2-22所示。89計(jì)算機(jī)工程學(xué)院圖2-22運(yùn)行結(jié)果90計(jì)算機(jī)工程學(xué)院2.2.3技能訓(xùn)練【實(shí)驗(yàn)2-4】輸入一個(gè)整數(shù)n,判斷n是否是一個(gè)能被23整除的三位奇數(shù)?!局笇?dǎo)】

(1)問題分析要對n作出正確的判斷,關(guān)鍵在于利用C語言的關(guān)系運(yùn)算符和邏輯運(yùn)算符,設(shè)計(jì)出正確、合理的表達(dá)式。根據(jù)題意,n應(yīng)滿足:取值范圍:-999~-100或者100~999;n能被23整除:用n%23==0判斷;n是奇數(shù):用n%2!=0判斷;91計(jì)算機(jī)工程學(xué)院把這些條件組合起來,可用一個(gè)復(fù)雜的邏輯表達(dá)式來表示:

(-999<=n&&n<=-100||100<=n&&n<=999)&&n%23==0&&n%2!=0。

(2)編寫源程序

/*EX2_8.cpp*/#include<stdio.h>main(){intn;

92計(jì)算機(jī)工程學(xué)院

printf("Entern:");scanf("%d",&n);if((-999<=n&&n<=-100||100<=n&&n<=999)&&n%23==0&&n%2!=0)printf("%disright.\n",n);elseprintf("%diswrong.\n",n);}

(3)上機(jī)運(yùn)行程序并分析結(jié)果。

93計(jì)算機(jī)工程學(xué)院

(4)問題思考在上例中,如果將條件表達(dá)式設(shè)計(jì)為:

(-999<=n&&n<=-100||100<=n&&n<=999&&n%23==0&&n%2==1)能不能對三位負(fù)數(shù)作出正確的判斷?為什么?【實(shí)驗(yàn)2-5】下列程序EX2_9.cpp的功能是計(jì)算并輸出下面分段函數(shù)值。但程序上機(jī)發(fā)現(xiàn)運(yùn)行結(jié)果錯(cuò)誤,見圖2-23。94計(jì)算機(jī)工程學(xué)院

/*EX2_9.cpp*/#include<stdio.h>voidmain(){

doublex,y;1/(x+2),-5≤x<0且x≠-21/(x+5),0≤x<51/(x+12),5≤x<100,其它y=95計(jì)算機(jī)工程學(xué)院

printf("inputx="); scanf("%f",&x); if((-5.0<=x<0.0)&&(x!=-2))

y=1.0/(x+2);elseif(5.0<x)

y=1.0/(x+5);elseif(x<10.0)

y=1.0/(x+12);elsey=0.0;printf("x=%e\ny=%e\n",x,y);}96計(jì)算機(jī)工程學(xué)院請理解程序執(zhí)行流程,通過調(diào)試修改程序中的錯(cuò)誤。具體要求如下:

(1)不允許改變計(jì)算精度;(2)不允許改變原程序的結(jié)構(gòu),只能在語句和表達(dá)式內(nèi)部進(jìn)行修改;(3)設(shè)計(jì)x的值,測試程序的正確性。97計(jì)算機(jī)工程學(xué)院圖2-23程序EX2_9.cpp運(yùn)行結(jié)果出錯(cuò)98計(jì)算機(jī)工程學(xué)院【指導(dǎo)】程序EX2_9.cpp使用的是一種階梯形的嵌套結(jié)構(gòu),通過不斷在else子句中嵌套if語句來實(shí)現(xiàn)。這種結(jié)構(gòu)可以進(jìn)行多個(gè)條件(互相排斥的條件)的判斷,用來實(shí)現(xiàn)多路分支問題的處理:依次對各個(gè)條件進(jìn)行判斷,一旦某個(gè)條件滿足,就執(zhí)行該條件下的有關(guān)語句,其他部分將被跳過;若各個(gè)條件均不滿足,就執(zhí)行最后一個(gè)if-else語句中else后面的語句。如果沒有最后的else子句,就表示什么也不執(zhí)行。99計(jì)算機(jī)工程學(xué)院【實(shí)驗(yàn)2-6】某商場在節(jié)日期間舉辦促銷活動(dòng),顧客可按購買商品的款數(shù)多少分別給予以下不同的優(yōu)惠折扣:購物不足250元的,沒有折扣,贈(zèng)送小禮品;購物滿250元,不足500元的,折扣5%;購物滿500元,不足1000元的,折扣8%;購物滿1000元,不足2000元的,折扣10%;購物滿2000元及2000元以上,折扣15%。試用switch語句編寫程序,計(jì)算顧客的實(shí)際付款數(shù)。100計(jì)算機(jī)工程學(xué)院【指導(dǎo)】

(1)問題分析由于switch后面的表達(dá)式不具有對某個(gè)區(qū)間內(nèi)的值進(jìn)行判斷的作用,它的取值必須對應(yīng)于每個(gè)case子句的一個(gè)單值,所以如何設(shè)計(jì)表達(dá)式是關(guān)鍵。對于本題,假設(shè)購物款為payment,由于折扣點(diǎn)是以250的倍數(shù)變化的,所以可以把表達(dá)式設(shè)計(jì)為payment/250,即:

payment<250元時(shí),對應(yīng)折扣點(diǎn)payment/250為0;

250≤payment<500元時(shí),對應(yīng)折扣點(diǎn)payment/250取值1;101計(jì)算機(jī)工程學(xué)院

500≤payment<1000元時(shí),對應(yīng)折扣點(diǎn)payment/250分別取值2、3;

1000≤payment<2000元時(shí),對應(yīng)折扣點(diǎn)payment/250分別取值4、5、6、7;這樣就實(shí)現(xiàn)了把payment在一個(gè)區(qū)間內(nèi)的取值定位在若干個(gè)點(diǎn)上。(2)編寫程序

/*EX2_10.cpp*/#include<stdio.h>102計(jì)算機(jī)工程學(xué)院

voidmain(){floatpayment,discount,amount;/*discount:折扣點(diǎn),amount:付款數(shù)*/inttemp;/*中間變量*/printf("請輸入你的購物款:"); scanf("%f",&payment); temp=(int)payment/250;/*計(jì)算折扣點(diǎn)*/switch(temp){103計(jì)算機(jī)工程學(xué)院

case0:discount=0;printf("你可獲得一件小禮品。\n");break; case1:discount=5.0;break; case2: case3:discount=7.0;break; case4: case5: case6: case7:discount=10.0;break;

104計(jì)算機(jī)工程學(xué)院

default:discount=15.0;break; }amount=payment*(1-discount/100);printf("請付款¥%.2f\n",amount);}(3)上機(jī)運(yùn)行程序并驗(yàn)證程序的正確性。(4)完善程序如果輸入的購物款不合法(如負(fù)數(shù)),程序應(yīng)輸出出錯(cuò)信息;輸出結(jié)果包含以下信息:購物款、獲得的折扣和應(yīng)付款。105計(jì)算機(jī)工程學(xué)院

2.2.4拓展與練習(xí)

【練習(xí)1】編寫程序,輸入兩個(gè)學(xué)生的成績,按從高到低的次序輸出。編程要求:

(1)輸入兩個(gè)成績放入變量score1和變量score2中(2)將高分存入變量score1中,低分存入變量score2中;(3)依次輸出變量score1和score2的值。【練習(xí)2】根據(jù)任務(wù)1中【實(shí)驗(yàn)2-2】的題目要求、解題步驟和流程圖,編寫程序。要求設(shè)計(jì)四106計(jì)算機(jī)工程學(xué)院

組不同的體重和身高的測試數(shù)據(jù),程序運(yùn)行后能輸出正確的結(jié)果。【練習(xí)3】輸入一個(gè)學(xué)生的百分制成績,然后按此輸出等級:90~100為"優(yōu)秀",70~89為"良好",60~69為"及格",<60為"不及格"。編程要求:(1)用switch語句編寫程序;(2)要判斷百分制成績的合理性,對于不合理的成績應(yīng)輸出出錯(cuò)信息;(3)輸出結(jié)果中應(yīng)包括百分制成績和對應(yīng)的等級。107計(jì)算機(jī)工程學(xué)院【練習(xí)4】編寫程序求解一元二次方程ax2+bx+c=0

的根。編程要求:

(1)畫出流程圖;(2)從鍵盤輸入系數(shù)a、b、c,輸入前要有如下提示:“請輸入系數(shù)”;(3)如果方程沒有實(shí)根,輸出信息“此方程無實(shí)數(shù)根”;如果有重根,以“x1=x2=...”的格式輸出方程的根;如果有兩個(gè)不同的根,以“x1=...”和“x2=...”的格式輸出方程的根。108計(jì)算機(jī)工程學(xué)院

【練習(xí)5】根據(jù)表2-2的工資、薪金所得適用稅率表計(jì)算月交稅金和月實(shí)際收入。表2-2工資、薪金所得適用稅率表級數(shù)

含稅級距

適用稅率

速算扣除數(shù)

1小于500元部分5%02大于等于500元—2000元部分10%253大于等于2000元—5000元部分15%1254大于5000元部分20%375109計(jì)算機(jī)工程學(xué)院計(jì)算方法:月應(yīng)納稅額=月應(yīng)納稅所得額×適用稅率-速算扣除數(shù)。其中,月應(yīng)納稅所得額=月工資收入-個(gè)稅起征數(shù);個(gè)稅起征數(shù)為1600元。編程要求:輸入月工資收入,計(jì)算并輸出月應(yīng)納稅額和月實(shí)際收入。110計(jì)算機(jī)工程學(xué)院2.2.5編程規(guī)范與常見錯(cuò)誤1.編程規(guī)范(1)if

和switch關(guān)鍵詞與之后的表達(dá)式之間應(yīng)加1個(gè)空格。(2)在if-else語句中,if與else不應(yīng)在同一行,并上下對齊;后面的語句應(yīng)采用縮進(jìn)形式,如是復(fù)合語句,則一對花括號(hào)應(yīng)上下對齊??s進(jìn)格式能增加程序的可讀性。例如:

if(a+b>c&&a+c>b&&b+c>a) { s=(a+b+c)/2.0;111計(jì)算機(jī)工程學(xué)院

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("areais%f\n",area); } else printf("inputerrer\n");2.常見錯(cuò)誤

(1)在關(guān)鍵詞if

后面的表達(dá)式中將把賦值運(yùn)算符“=”誤作比較運(yùn)算符“==”使用。

例如下面的程序段中,輸入的b無論為何值,均輸出OK。因?yàn)檫@里的表達(dá)式是一個(gè)賦值表達(dá)式

b=a,并不是判斷b是否等于a。由于b的值為-1(非0),代表邏輯真,所以語句printf(”NO”);是不可能被執(zhí)行到的。112計(jì)算機(jī)工程學(xué)院

inta=-1,b;scanf(“%d”,&b);if(b=a)printf(”O(jiān)K”);else printf(”NO”);

總之,關(guān)鍵詞if后面的表達(dá)式只要是合法的C語言表達(dá)式,當(dāng)它的值為“非0”,即代表“真”,否則為假。113計(jì)算機(jī)工程學(xué)院

(2)復(fù)合語句忘了用花括號(hào)括起來。

例如在【案例2】的源程序中如漏了花括號(hào)如下示:

if(a+b>c&&a+c>b&&b+c>a) s=(a+b+c)/2.0; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("areais%f\n",area); else printf("inputerrer\n");114計(jì)算機(jī)工程學(xué)院程序在編譯時(shí)顯示出錯(cuò)信息:“illegalelsewithoutmatchingif”。因?yàn)榫幾g系統(tǒng)將if語句理解為是缺省形式,這時(shí)else就沒有與之配對的if了。115計(jì)算機(jī)工程學(xué)院2.2.6貫通案例之二1.問題描述根據(jù)2.1.6貫通案例之一中的菜單,對菜單進(jìn)行編號(hào),用switch語句實(shí)現(xiàn)菜單的選擇:

(1)當(dāng)用戶輸入2

時(shí)模擬實(shí)現(xiàn)增加學(xué)生成績的功能。(2)當(dāng)用戶輸入1~8中的其他數(shù)字時(shí),顯示“本模塊正在建設(shè)中…….”(3)當(dāng)用戶輸入1~8以外的數(shù)字時(shí),顯示適當(dāng)?shù)腻e(cuò)誤提示。116計(jì)算機(jī)工程學(xué)院2.編寫程序

/*EX2_11.cpp*/#include"stdio.h"main(){char ch; longnum;intscore;printf("#=========================#\n");printf(“#學(xué)生成績管理系統(tǒng)#\n");printf("#--------------------------------------------#\n");printf("#copyright@2009-10-1#\n");printf("#=========================#\n");117計(jì)算機(jī)工程學(xué)院

printf(“#1.加載文件#\n");printf(“#2.增加學(xué)生成績#\n");printf(“#3.顯示學(xué)生成績#\n");printf(“#4.刪除學(xué)生成績#\n");printf(“#5.修改學(xué)生成績#\n");printf(“#6.查詢學(xué)生成績#\n");printf(“#7.學(xué)生成績排序#\n");printf(“#8.保存文件#\n");printf(“#0.退出系統(tǒng)#\n");printf("#==========================#\n");printf("請按0-8選擇菜單項(xiàng):");scanf("%c",&ch);118計(jì)算機(jī)工程學(xué)院

switch(ch){

case'1':printf("進(jìn)入加載文件模塊.本模塊正在建設(shè)中…….\n");break;

case'2':printf("進(jìn)入增加學(xué)生成績模塊.\n");printf("請輸入學(xué)號(hào)和成績:");scanf("%ld%d",&num,&score);break;

case'3':printf("進(jìn)入顯示學(xué)生成績模塊.本模塊正在建設(shè)中…….\n");119計(jì)算機(jī)工程學(xué)院

break;case'4':printf("進(jìn)入刪除學(xué)生成績模塊.本模塊正在建設(shè)中…….\n"); break;case'5':printf("進(jìn)入修改學(xué)生成績模塊.本模塊正在建設(shè)中…….\n"); break;case'6':printf("進(jìn)入查詢學(xué)生成績模塊.本模塊正在建設(shè)中…….\n"); break;case'7':printf("進(jìn)入學(xué)生成績排序模塊.本模塊正在建設(shè)中…….\n"); break;120計(jì)算機(jī)工程學(xué)院

case'8':printf("進(jìn)入保存文件模塊.本模塊正在建設(shè)中…….\n"); break; case'0':printf("退出系統(tǒng).\n");exit(0);default:printf("輸入錯(cuò)誤!"); break;} }3.運(yùn)行結(jié)果121計(jì)算機(jī)工程學(xué)院圖2-24貫通案例運(yùn)行結(jié)果1122計(jì)算機(jī)工程學(xué)院圖2-25貫通案例運(yùn)行結(jié)果2123計(jì)算機(jī)工程學(xué)院

任務(wù)3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)

學(xué)習(xí)目標(biāo)領(lǐng)會(huì)程序設(shè)計(jì)中構(gòu)成循環(huán)的方法,掌握for、while和do-while

語句的用法,了解break和continue

語句在循環(huán)語句中的作用。124計(jì)算機(jī)工程學(xué)院

2.3.1案例講解

案例1累加問題1.問題描述計(jì)算100以內(nèi)的奇數(shù)之和,即求1+3+5+…+97+99。2.編程分析(1)設(shè)變量sum存放累加和,初值置0;變量i存放需累加的當(dāng)前項(xiàng),初值置1;

125計(jì)算機(jī)工程學(xué)院(2)當(dāng)i<100時(shí),反復(fù)執(zhí)行當(dāng)前項(xiàng)i加到累加和sum中當(dāng)前項(xiàng)i+2(3)輸出累加和(4)結(jié)束流程圖見2-26。126計(jì)算機(jī)工程學(xué)院真假i<100sum+=i開始sum=0i=1輸出sum結(jié)束圖2-26案例1流程圖i=i+2127計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX2_12.cpp*/#include<stdio.h>voidmain(){ inti,sum; sum=0;/*累加器清0*/ for(i=1;i<100;i+=2) sum+=i;printf(“1+3+5+…+97+99=%d\n”,sum);}128計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果圖2-27案例1運(yùn)行結(jié)果129計(jì)算機(jī)工程學(xué)院5.歸納分析案例使用的是C語言提供的循環(huán)語句—for語句。

(1)for語句的語法形式

for(<表達(dá)式1>;<表達(dá)式2>;<表達(dá)式3>)

<語句>其中,for是關(guān)鍵字。注意,三個(gè)表達(dá)式之間必須用分號(hào)(;)隔開。

(2)for

語句的執(zhí)行流程①首先計(jì)算<表達(dá)式1>;130計(jì)算機(jī)工程學(xué)院②求<表達(dá)式2>的值,若其值為非零,執(zhí)行<語句>,然后轉(zhuǎn)③執(zhí)行,若<表達(dá)式2>的值為零,則結(jié)束for語句。③求解<表達(dá)式3>,轉(zhuǎn)②執(zhí)行。流程圖如圖2-28。131計(jì)算機(jī)工程學(xué)院計(jì)算表達(dá)式1表達(dá)式2計(jì)算表達(dá)式3執(zhí)行語句(循環(huán)體)真假圖2-28流程圖132計(jì)算機(jī)工程學(xué)院

(3)在程序EX2_12.cpp中,for循環(huán)的執(zhí)行過程是:先賦值i=1,然后判斷“i<100”是否成立,如果為真,執(zhí)行循環(huán)體“sum+=i;”,轉(zhuǎn)而執(zhí)行“i+=2”,再判斷“i<100”,如此反復(fù),直到“i>=100”為止。在此,變量i既是當(dāng)前項(xiàng),也起到了控制循環(huán)次數(shù)的作用,所以i也稱為循環(huán)控制變量,它的值由表達(dá)式3來改變;sum起累加器的作用,共累加了50次。表2-3展示了i和sum在循環(huán)中的值的變化。133計(jì)算機(jī)工程學(xué)院表2-3循環(huán)中i和sum的變化案例2求平均分問題1.問題描述輸入若干個(gè)學(xué)生的C語言課程考試成績,計(jì)算這門課程的平均分,輸入負(fù)數(shù)時(shí)結(jié)束。i的值1357911…9799sum的值149162536…24032500134計(jì)算機(jī)工程學(xué)院2.編程分析在程序中需要設(shè)置以下變量:score存放輸入成績;累加器sum存放總成績;count統(tǒng)計(jì)人數(shù);ave

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論