項目3 項目菜單的選擇執(zhí)行課件_第1頁
項目3 項目菜單的選擇執(zhí)行課件_第2頁
項目3 項目菜單的選擇執(zhí)行課件_第3頁
項目3 項目菜單的選擇執(zhí)行課件_第4頁
項目3 項目菜單的選擇執(zhí)行課件_第5頁
已閱讀5頁,還剩155頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

項目3項目31技能目標(biāo)會畫程序的流程圖或N-S結(jié)構(gòu)圖會用if-else實現(xiàn)分支結(jié)構(gòu)和多分支結(jié)構(gòu)的程序設(shè)計會用條件運算符進行分支結(jié)構(gòu)的程序設(shè)計會用switch語句實現(xiàn)多分支結(jié)構(gòu)的程序設(shè)計會用for語句、while語句、do-while語句進行循環(huán)結(jié)構(gòu)程序設(shè)計會用break語句和continue語句技能目標(biāo)會畫程序的流程圖或N-S結(jié)構(gòu)圖2知識目標(biāo)掌握if-else語句的用法掌握條件運算符的使用掌握switch語句的用法掌握for語句、while語句和do-while語句的使用掌握循環(huán)的簽套使用掌握break和continue語句的使用知識目標(biāo)掌握if-else語句的用法3項目任務(wù)與解析本項目實現(xiàn)班級學(xué)生成績管理系統(tǒng)中用if語句實現(xiàn)菜單的選擇執(zhí)行、用switch語句實現(xiàn)菜單的選擇執(zhí)行、用循環(huán)語句實現(xiàn)主菜單的選擇執(zhí)行。本項目包含下面幾個任務(wù):任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行任務(wù)5:用switch語句實現(xiàn)菜單的選擇執(zhí)行任務(wù)6:用循環(huán)語句實現(xiàn)主菜單的選擇執(zhí)行項目任務(wù)與解析本項目實現(xiàn)班級學(xué)生成績管理系統(tǒng)中用if語句實現(xiàn)4

主要內(nèi)容3.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行3.2必備知識與理論3.3擴展知識與理論3.4任務(wù)5:用switch語句實現(xiàn)菜單的選擇執(zhí)行3.5必備知識與理論3.6擴展知識與理論3.7任務(wù)6:用循環(huán)語句實現(xiàn)菜單的選擇執(zhí)行3.8必備知識與理論3.9擴展知識與理論主要內(nèi)容3.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行53.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行1.問題描述對顯示的菜單,選擇要執(zhí)行的菜單序號,并顯示要執(zhí)行的菜單名。2.具體實現(xiàn)P41程序3.知識分析在多數(shù)情況下順序結(jié)構(gòu)的程序是很少的,一般還包括分支和循環(huán)結(jié)構(gòu)。分支結(jié)構(gòu)還包括if-else結(jié)構(gòu)和switch結(jié)構(gòu)。我們首先來學(xué)習(xí)分支結(jié)構(gòu),在學(xué)習(xí)分支結(jié)構(gòu)前了解一些算法的概念,關(guān)系運算符和邏輯運算符的使用。3.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行1.問題描述63.2必備知識與理論3.2.1算法的概念1.算法算法就是程序處理問題的步驟與方法。

1976年瑞士計算機科學(xué)家NiklausWirth提出了一個著名的公式:算法+數(shù)據(jù)結(jié)構(gòu)=程序3.2必備知識與理論3.2.1算法的概念72.算法的特性簡單地說,算法就是進行操作的方法和操作步驟。例如,菜譜實際上是做菜肴的算法,樂譜實際上是演奏的算法,計算機程序是用某種程序設(shè)計語言描述的解題算法。通常認為算法有如下一些性質(zhì):(1)有窮性一個算法要在有限的步驟內(nèi)解決問題(這里所說的步驟是指計算機執(zhí)行步驟)。計算機程序不能無限地運行下去(甚至不能長時間地運行下去),所以一個無限執(zhí)行的方法不能成為程序設(shè)計中的“算法”。(2)確定性確定性具有兩重意義:一是所描述的操作應(yīng)當(dāng)具有明確的意義,不應(yīng)當(dāng)有歧義性。例如,不能發(fā)出這樣的操作指令:“執(zhí)行一個算術(shù)操作”。因為它既沒有指出算術(shù)操作的類型,也沒有指出操作數(shù)。確定性的另一重意義:·操作作序列只有一個初始動作,序列中每一動作僅有一個后繼動作;·序列終止表示問題得到解答或問題沒有解答,不能沒有任何結(jié)論。2.算法的特性8(3)有零個或多個輸入輸入就是從外界取得必要的信息。一個算法可以有零個或多個輸入,例如:輸入一個年份,判斷其是否是閏年。同時一個算法可以沒有輸入,例如:計算出5!是多少。(4)有一個或多個輸出算法的目的就求解,“解”就是我們想要得到的最終結(jié)果。輸出是同輸入有著某些特定關(guān)系的量。一個算法得到的最終結(jié)果就是輸出。沒有輸出的算法是沒有意義的。(5)可執(zhí)行性一個算法應(yīng)當(dāng)是可以由計算機執(zhí)行的,算法中描述的操作都是可以通過計算機的運行來實現(xiàn)。(3)有零個或多個輸入93.2.2算法的表示方法

1.自然語言表示算法自然語言是相對于計算機語言而言的,是指人們在日常生活中使用的語言,如漢語、英語等。對于某些程序員來說,自然語言通俗易懂。但是,對于規(guī)模大、復(fù)雜的算法,使用自然語言來描述,往往很冗長,不直觀,而且容易發(fā)生歧義。比如對于以下這句話:如果A大于B,就給它加1。在理解時就可能出現(xiàn)歧義,是給A加1?還是給B加1。對于以上的一段話,如果我們用C語言進行編程則為: if(A>B) A=A+1;正是由于自然語言描述算法具有的缺陷,所以在程序設(shè)計中很少有人使用。3.2.2算法的表示方法102.傳統(tǒng)流程圖表示法用一些圖框表示各種操作,用線表示這些操作的執(zhí)行順序。我國國家標(biāo)準(zhǔn)GB1526—89中推薦的一套流程圖標(biāo)準(zhǔn)化符號,它與國際標(biāo)準(zhǔn)化組織ISO提出的ISO流程圖符號是一致的。圖3-1為其中常用的一些符號。2.傳統(tǒng)流程圖表示法11過程判斷數(shù)據(jù)預(yù)定義過程起止流程線連接注釋圖3.2常用的流程圖標(biāo)準(zhǔn)化符號

過程判斷數(shù)據(jù)預(yù)定義過程起止流程線連接注釋圖3.2常用12平行四邊形表示數(shù)據(jù),其中可注明數(shù)據(jù)名稱、來源、用途或其它的文字說明。處理矩形表示各種處理功能。例如,執(zhí)行一個或一組特定的操作,從而使信息的值、信息形式或所在位置發(fā)生變化。矩形內(nèi)可注明處理名稱或其簡要功能。預(yù)定義過程帶有雙豎邊線的矩形,表示已命名的處理。該處理為在另外地方已得到詳細說明的一個操作或一組操作。例如庫函數(shù)或其它已定義的函數(shù)等。矩形內(nèi)可注明特定處理名稱或其簡要功能。判斷菱形表示判斷。菱形內(nèi)可注明判斷的條件。它只有一個入口,但可以有若干個可供選擇的出口,在對定義的判斷條件求值后,有一個且僅有一個出口被選擇。求值結(jié)果可在表示出口路徑的流線附近寫出。流線直線表示執(zhí)行的流程。當(dāng)流程自上向下或由左向右時,流程線可不帶箭頭,其它情況應(yīng)加箭頭表示流程。端點。扁圓形表示轉(zhuǎn)向外部環(huán)境或從外部環(huán)境轉(zhuǎn)入的端點符。例如,程序流程的起、始點。注解。注解是程序的編寫者向閱讀者提供的說明。注解符由縱邊線構(gòu)成,它用虛線連接到被注解的符號或符號組上。

平行四邊形表示數(shù)據(jù),其中可注明數(shù)據(jù)名稱、來源、用途或其它的文13圖3-2(a)、(b)、(c)中的虛線框,分別為用流程圖表示的三種基本流程控制結(jié)構(gòu)。S1S2S3PS1S2真假PS2假真(a)順序結(jié)構(gòu)

(b)選擇結(jié)構(gòu)

(c)重復(fù)結(jié)構(gòu)

圖3-2

用流程圖描述的三種基本結(jié)構(gòu)

圖3-2(a)、(b)、(c)中的虛線框,分別為用流14例3-1用流程圖描述從三個數(shù)中取最大數(shù)的算法。從三個數(shù)中取最大數(shù)的算法思路是:假定這三個數(shù)是a,b,c,則首先可以比較a,b兩數(shù),從中選大者;然后再用這個大數(shù)與數(shù)c比較,從中取大者。這時得到的大數(shù),就是三個數(shù)中的最大數(shù)。這個算法用流程圖描述如圖3-3(a)所示。通常,求解一個問題的算法不是唯一的。例如圖3-3(b)也是一個三數(shù)中取大的算法。它的基本思路是,先設(shè)max=第一個數(shù),然后依次輸入i個數(shù),每輸入一個數(shù),與max比較一次,把大的放入max中。當(dāng)輸完i個數(shù)時,max中存放的就是這i個數(shù)中的最大數(shù)。這里,i是一個計數(shù)器,用于統(tǒng)計輸入數(shù)的個數(shù),所以每輸入一個數(shù),要執(zhí)行一次自增操作。這個算法與圖3-3(a)所示算法的不同在于:算法結(jié)構(gòu)不同:圖3-3(a)所示算法采用了兩個選擇結(jié)構(gòu),而圖3-3(b)所示算法采用了一個循環(huán)結(jié)構(gòu)和一個選擇結(jié)構(gòu)。算法的靈活性不同:圖3-3(b)中的算法可以用來求任意個數(shù)中的最大數(shù)。例3-1用流程圖描述從三個數(shù)中取最大數(shù)的算法。15a>=b輸入a,b,cmax=a真假max=bmax>=c真假輸出max輸出c開始結(jié)束i<=3輸入一個n假真假輸出max開始結(jié)束max=0,i=1真i++n>=maxmax=n(a)一個三數(shù)中取大的算法

(b)另一個三數(shù)中取大的算法

圖3-3三數(shù)中取大算法的流程圖描述

a>=b輸入a,b,cmax=a真假max=bmax>=c真163.用N-S流程圖表示算法靈活的流線是程序中隱藏錯誤的禍根。針對這一弊病,1973年美國學(xué)者I.Nassi和B.Shneiderman提出了一種無流線的流程圖,稱為N-S圖。它的三種基本結(jié)構(gòu)如圖3-4所示。N-S圖的每一種基本結(jié)構(gòu)都是一個矩形框,整個算法可以像堆積木一樣堆成。其中,(a)為三個操作組成的順序結(jié)構(gòu);(b)為二分支的選擇結(jié)構(gòu);(c)為當(dāng)型重復(fù)結(jié)構(gòu),即當(dāng)命題P為“真”時,就重復(fù)執(zhí)行S。3.用N-S流程圖表示算法17S1S2S3PS1S2當(dāng)PS假真(c)循環(huán)結(jié)構(gòu)(a)順序結(jié)構(gòu)

(b)選擇結(jié)構(gòu)圖3-4用N-S圖描述三種基本流程結(jié)構(gòu)

S1S2S3PS1S2當(dāng)PS假真(c)循環(huán)結(jié)構(gòu)(a)順序結(jié)構(gòu)18圖3-5(a)、(b)給出了用與圖3-3(a)、(b)流程圖對應(yīng)的N-S圖。a>=bmax=amax=b輸入a,b,c假真max>=c輸出max輸出c真假當(dāng)i<=3i++n>=maxmax=n真假輸入n初始化:max=0,i=1輸出max(a)采用選擇結(jié)構(gòu)

(b)采用循環(huán)結(jié)構(gòu)

圖3-5

三數(shù)中取大算法的N-S圖描述圖3-5(a)、(b)給出了用與圖3-3(a)、(b19

3.用偽碼表示算法偽代碼(pseudocode)是用介于自然語言與計算機語言之間的文字符號算法描述的工具。它無固定的、嚴(yán)格的語法規(guī)則,通常是借助某種高級語言的控制結(jié)構(gòu),中間的操作可以用自然語言(如中文或英文),也可以用程序設(shè)計語言,或使用自然語言與程序設(shè)計語言的混合體。一般專業(yè)人員習(xí)慣用偽代碼進行算法描述。下面是與圖3-3相對應(yīng)的三數(shù)中取大算法的偽代碼描述。

(1)與圖3-3(a)相對應(yīng)的三數(shù)中取大算法的偽代碼描述:輸入a,b,c;if(a>=b) max=a;else max=bif(max>=c) 輸出max;else輸出c;3.用偽碼表示算法輸入a,b,c;20(2)與圖3-3(b)相對應(yīng)的三數(shù)中取大算法的偽代碼描述:初始化:mac=0,i=1;當(dāng)(i<=3)( 輸入n;i++;if(n>=max) max=n;)輸出max;(2)與圖3-3(b)相對應(yīng)的三數(shù)中取大算法的偽代碼描述:初213.2.3結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)化程序設(shè)計的基本思路是:把一個復(fù)雜的問題的求解過程分階段進行,每個階段處理的問題都控制在人們?nèi)菀桌斫獾姆秶畠?nèi)。采取以下的方法保證得到結(jié)構(gòu)化的程序:自頂向下;逐步細化(求精);模塊化設(shè)計;結(jié)構(gòu)化編碼。3.2.3結(jié)構(gòu)化程序設(shè)計22結(jié)構(gòu)化程序具有如下的特征:一個程序單元由順序、分支和循環(huán)這三種基本結(jié)構(gòu)組成;一個大的程序由若干個不同功能的小模塊組成;每一個小模塊只有一個入口和一個出口;結(jié)構(gòu)化程序具有如下的特征:233.2.4命題與C語言中的邏輯值對選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu),流程的改變都是由判斷決定的,即需要根據(jù)判斷決定選擇,根據(jù)判斷決定是否循環(huán)以及循環(huán)的結(jié)束。通常,判斷是針對命題的“真”、“假”進行的。例如,下面是一些命題:·(行駛中)前面的交通信號燈是紅色的?!そ裉煜掠辍!≥b?!と绻鸻不能被b整除。這些命題的值都只能是一個邏輯(布爾)值:“真”或“假”。早期的C語言不提供專門的邏輯(布爾)類型,規(guī)定用非0值表示“真”,用0值表示“假”。在C99中,增加了_Bool類型,并增加了頭文件<stdbool.h>,在其中定義了宏bool、true和false,用true存儲1,用false存儲0。3.2.4命題與C語言中的邏輯值243.2.5關(guān)系運算與關(guān)系表達式

1.C語言的關(guān)系運算符關(guān)系運算是指對兩個表達式值的大小比較。C語言中提供有如下6個關(guān)系運算符:>(大于) >=(大于或等于) <(小于)<=(小于或等于) ==(等于) !=(不等于)后兩個(==和!=)的優(yōu)先級小于前4個,但它們都低于算術(shù)運算符,高于賦值運算符,并且它們結(jié)合方式都是從左向右的。3.2.5關(guān)系運算與關(guān)系表達式252.關(guān)系表達式用關(guān)系運算符將兩個表達式(可以是算術(shù)表達式、關(guān)系表達式,邏輯表達式,賦值表達式,字符表達式等)連接起來的表達式,稱為關(guān)系表達式。關(guān)系表達式的值只有兩個:關(guān)系表達式成立,即為“真”(通常為1);關(guān)系表達式不成立,即為“假”(0)。

2.關(guān)系表達式263.2.6邏輯運算與邏輯表達式1.邏輯運算符與優(yōu)先級C語言有三個邏輯運算符,它們是:&&(邏輯與) ||(邏輯或) !(邏輯非)&&和||是二元運算符,結(jié)合方向為自左至右;!為一元運算符,結(jié)合方向為自右至左。!的優(yōu)先級高于&&,&&的優(yōu)先級高于||。&&和||的優(yōu)先級低于關(guān)系運算符,而!的優(yōu)先級高于關(guān)系運算符。2.邏輯表達式用邏輯運算符將關(guān)系表達式或邏輯量連接起來的表達式就是邏輯表達式,邏輯表達式的值應(yīng)該是一個邏輯量“真”或“假”。

項目3項目菜單的選擇執(zhí)行27

邏輯運算中有很多有趣的規(guī)律,這種規(guī)律稱為短路原則。1.在一個&&表達式中,若&&的一端為0,則不必再計算另一端,該表達式的值肯定為0(在C語言中由于&&是從左向右結(jié)合的,所以只考慮左端,即當(dāng)&&號的左端為0時,不再計算其右端),可以把它記為:0&&a=02.在一個||表達式中,若||的一端為1,則不必計算另一端,該||表達式的值必為1?,F(xiàn)把它記為:1||a=1諸如此類關(guān)于表達式的值的規(guī)律有如下一些:0||a==a 1&&a==a 1||a==1 0&&a==0a||!a==1 0&&!a==0以及a||a==a a&&a==a !(a||b)==!a&&!b !(a&&b)==!a||!b!(!a)==a記住這些規(guī)律,能使復(fù)雜的邏輯運算簡化、清晰。

283.3擴展知識與理論選擇型程序描述了求解規(guī)則:在不同的條件下所應(yīng)進行的相應(yīng)操作。3.3.1if(表達式)語句這種語句的結(jié)構(gòu)是:

if(表達式)語句它的執(zhí)行流程是,當(dāng)表達式的值為真時,執(zhí)行“語句”,否則執(zhí)行if語句后面的語句。3.3擴展知識與理論選擇型程序描述了求解規(guī)則:在不同的條件29例3-4輸入三個數(shù)a,b,c,要求按由小到大的順序輸出。我們只要把最小的數(shù)放到a上:先將a與b進行比較,如果a>b則將a與b的值進行交換,然后再用a與c進行比較,如果a>c則將a與c的值進行交換,這樣能使a最小。對剩下的兩個數(shù),從小到大排序就容易了,該程序的N-S結(jié)構(gòu)圖如右圖所示。例3-4輸入三個數(shù)a,b,c,要求按由小到大的順序輸303.3.2if…else結(jié)構(gòu)if…else構(gòu)造了一種二路分支的選擇結(jié)構(gòu),它的格式如下:

if(表達式)語句1else 語句2這里,語句1和語句2就是兩路分支。執(zhí)行這個結(jié)構(gòu),首先對表達式進行判斷,若為“真”(非零),就執(zhí)行if分結(jié)構(gòu)(語句1);否則(值為0),就執(zhí)行else分結(jié)構(gòu)(語句2)。3.3.2if…else結(jié)構(gòu)31例3-5求一個數(shù)的絕對值。設(shè)有任意數(shù)x,它的絕對值為判斷內(nèi)容:x<0是否成立。兩路分支:①|x|=x(當(dāng)x≥0);②|x|=-x(當(dāng)x<0)C函數(shù)如下:doubleabstr(doublex){if(x<0.0)x=-x;elsex=x;return(x);}例3-5求一個數(shù)的絕對值。doubleabstr(d32下面是函數(shù)abstr被調(diào)用執(zhí)行的情況:#include<stdio.h>intmain(void){doublea,abstr(doublea);printf(″Enterrealnumberaplease:″);scanf(″%1f″,&a);printf(″abstr(%1f)=%1f\n″,a,abstr(a));rerurn0;}運行情況如下

Enterrealnumberaplease:-98.7654abstr(-98.765400)=98.765400下面是函數(shù)abstr被調(diào)用執(zhí)行的情況:#include<s33例3-6求一元二次方程ax2+bx+c=0的根。算法設(shè)計:一元二次方程式的根有下列情況:當(dāng)a=0,b=0時,方程無解;當(dāng)a=0,b≠0時,方程只有一個實根-c/b;當(dāng)a≠0時,方程的根為x=(-b±(b2-4ac)1/2)/(2*a)。其中,當(dāng)b2-4ac≥0時有兩個實根;當(dāng)b2-4ac<0時,有兩個虛根。圖3-8為上述算法的N-S圖表示,它把上述邏輯關(guān)系表示得更為清晰。b=0輸出“無解”輸出單根:x=-c/b假真disc<0輸出兩復(fù)數(shù)根輸出兩實根真假a=0真假disc=b*b-4*a*c圖3-12求一元二次方程根的算法例3-6求一元二次方程ax2+bx+c=0的根。b=0輸34#include<math.h>voidsolv_quadr_equa(floata,floatb,floatc){if(a==0.0)if(b==0.0)printf(″noanswerduetoinputerror\n″);elseprintf(″thesinglerootis%f\n″,-c/b);else{doubledisc,twoa,term1,term2;disc=b*b-4*a*c;twoa=2*a;term1=-b/twoa;term2=sqrt(fabs(disc))/twoa;if(disc<0.0=printf(″complexroot:\nrealpart=%f,imagpart=%f\n″,term1,term2);elseprintf(″realroot:\nroot1=%f,root2=%f\n″,term1+term2,term1-term2);}}由此N-S圖可以編寫出以下的函數(shù):#include<math.h>由此N-S圖可以編寫出以353.3.3if-elseif結(jié)構(gòu)

if-elseif是一種多分支選擇結(jié)構(gòu),用N-S圖描述下右圖所示,C語言中的格式如下左圖所示:if(表達式1)語句1elseif(表達式2)語句2┇elseif(表達式n)語句nelse語句n+1語句1語句2語句3真假表達式1假真表達式2真假表達式3┇3.3.3if-elseif結(jié)構(gòu)

if-elseif是36例3-7根據(jù)百分制分數(shù)決定成績的等級:·90分以上為A級;·80分及以上,90分以下,B級;·70分及以上,80分以下,C級;·60分及以上,70分以下,D級;·60分以下,E級。下圖為用if-elseif結(jié)構(gòu)描述的上述規(guī)則。例3-7根據(jù)百分制分數(shù)決定成績的等級:373.4任務(wù)5:用switch語句實現(xiàn)菜單的選擇執(zhí)行1.問題描述對顯示的菜單,選擇要執(zhí)行的菜單序號,并顯示要執(zhí)行的菜單名。2.具體實現(xiàn)P54程序3.知識分析分支結(jié)構(gòu)程序設(shè)計除if-else結(jié)構(gòu)外,還包括switch結(jié)構(gòu)。Switch結(jié)構(gòu)是一種多路分支的選擇結(jié)構(gòu)程序設(shè)計。3.4任務(wù)5:用switch語句實現(xiàn)菜單的選擇執(zhí)行1.問38switch是一種多分支選擇結(jié)構(gòu),其形式如下圖左所示,N-S結(jié)構(gòu)圖如下右圖所示。3.5必備知識與理論switch(表達式){case常量表達式1:語句序列1case常量表達式2:語句序列2

┇case常量表達式n:語句序列ndefault:語句序列n+1}switch是一種多分支選擇結(jié)構(gòu),其形式如下圖左所示,N-S39這里,break語句的作用是中斷該switch結(jié)構(gòu),即將流程轉(zhuǎn)出switch結(jié)構(gòu)。所以,執(zhí)行switch結(jié)構(gòu)的就相當(dāng)于只執(zhí)行與判斷表達式相匹配的一個case子結(jié)構(gòu)中的語句。其實,可以將break看作為語句序列中必要的成分(位置在語句序列中的最后)。switch(表達式){case常量表達式1:語句序列1break;case常量表達式2:語句序列2break;┇case常量表達式n:語句序列nbreak;default:語句序列n+1break;}這里,break語句的作用是中斷該switch結(jié)構(gòu),即將流程40例3-11根據(jù)百分制分數(shù)決定成績的等級:?90分以上為A級;?80分及以上,90分以下,B級;?70分及以上,80分以下,C級;?60分及以上,70分以下,D級;?60分以下,D級。例3-11根據(jù)百分制分數(shù)決定成績的等級:41/******按成績分等******/#include<stdio.h>intmain(void){ floatscore; intgrade; printf("輸入一個分數(shù):"); scanf("%f",&score); grade=score/10; switch(grade) { case10: case9:printf("A\n");break; case8:printf("B\n");break; case7:printf("C\n");break; case6:printf("D\n");break; case5: case4: case3: case2: case1: case0:printf("E\n");break; } return0;}/******按成績分等******/423.6必備知識與理論條件運算符是C語言中唯一的三目運算符,即有三個參數(shù)參與運算。由條件運算符組成條件表達式的一般形式為:

表達式1?表達式2:表達式3其求值規(guī)則為:如果表達式1的值為真,則把表達式2的值作為該條件表達式的值,否則把表達式3的值作為該條件表達式的值。條件運算符的優(yōu)先級很低,僅僅比賦值操作符的級別高。其結(jié)合方式與賦值運算符一樣是從右至左的。因此,表達式max=a>b?a∶b相當(dāng)于:max=(a>b?a:b);3.6擴展知識與理論3.6必備知識與理論條件運算符是C語言中唯一的三目433.7任務(wù)6:用循環(huán)語句實現(xiàn)菜單的選擇執(zhí)行1.問題描述對顯示的菜單,選擇要執(zhí)行的菜單序號,并顯示要執(zhí)行的菜單名。2.具體實現(xiàn)用for語句實現(xiàn)P60程序用while語句實現(xiàn)P61程序用do…while語句實現(xiàn)P61-P62程序3.知識分析循環(huán)結(jié)構(gòu)程序設(shè)計包括while、do-while和for循環(huán)三種結(jié)構(gòu),對已知循環(huán)次數(shù)的循環(huán)多采用for循環(huán);對循環(huán)次數(shù)不確定,循環(huán)首先執(zhí)行一次的循環(huán)多采用do-while循環(huán),而需要根據(jù)循環(huán)條件來確定循環(huán)是否要執(zhí)行的,多采用while循環(huán)。3.7任務(wù)6:用循環(huán)語句實現(xiàn)菜單的選擇執(zhí)行1.問題描述443.8必備知識與理論3.8.1while結(jié)構(gòu)while語句的一般形式為:

while(表達式)語句其中表達式是循環(huán)條件,語句為循環(huán)體。while語句的語義是:計算表達式的值,當(dāng)值為真(非0)時,執(zhí)行循環(huán)體語句;否則跳過循環(huán)體,而執(zhí)行該結(jié)構(gòu)后面的語句。在進入循環(huán)體后,每執(zhí)行完一次循環(huán)體語句后,再對判斷表達式進行一次計算和判斷。當(dāng)發(fā)現(xiàn)判斷表達式的值為0時,便立即退出循環(huán)。3.8必備知識與理論3.8.1while結(jié)構(gòu)45例3-12兔子繁殖問題。著名意大利數(shù)學(xué)家Fibonacci曾提出一個有趣的問題:設(shè)有一對新生兔子,從第三個月開始它們每個月都生一對兔子。按此規(guī)律,并假設(shè)沒有兔子死亡,一年后共有多少對兔子。人們發(fā)現(xiàn)每月的兔子數(shù)組成如下數(shù)列:1,1,2,3,5,8,13,21,34,…并把它稱為Fibonacci數(shù)列。那么,這個數(shù)列如何導(dǎo)出呢?觀察一下Fibonacci數(shù)列可以發(fā)現(xiàn)這樣一個規(guī)律:從第3個數(shù)開始,每一個數(shù)都是其前面兩個相鄰數(shù)之和。這是因為,在沒有兔子死亡的情況下,每個月的兔子數(shù)由兩部分組成:上一月的老兔子數(shù),這一月剛生下的新兔子數(shù)。上一月的老兔子數(shù)即其前一個數(shù)。這一月剛生下的新兔子數(shù)恰好為上上月的兔子數(shù)。因為上一月的兔子中還有一部分到這個月還不能生小兔子,只有上上月已有的兔子才能每對生一對小兔子。例3-12兔子繁殖問題。46上述算法可以描述為fib1=fib2=1 (1)fibn=fibn-1+fibn-2(n>=3) (2)式(1)為賦初值,式(2)為迭代公式。用C語言來描述式(2)為:fib=fib1+fib2;fib1=fib2;/*為下一次迭代作準(zhǔn)備*/fib2=fib;這里,fib1和fib2和不再僅代表第1個月和第2個月的兔子數(shù),而作為中間變量,代表前兩個月的兔子數(shù),fib當(dāng)前月的兔子數(shù)。下頁圖為Fibonacci算法的N-S圖。表為迭代過程中fib1、fib2和fib的變化情形。上述算法可以描述為fib=fib1+fib2;47圖3.19計算Fiboonacci數(shù)列的N-S圖當(dāng)i<=12fib1=fib2fib=fib1+fib2初值:fib1=1,fib2=1,i=3fib2=fib輸出fibi++圖3-12計算Fiboonacci數(shù)列的N-S圖

迭代次數(shù)3456789101112fib111235813213455fib2123581321345579fib23581321345579144表按照迭代算法變量fib1、fib2和fib3的變化情形當(dāng)i<=12fib1=fib2fib=fib1+fib2初值48根據(jù)圖3-12所示的算法??梢院苋菀椎貙懗鋈缦鲁绦?。/******計算Fibonacci數(shù)******/#include<stdio.h>intmain(void){intfib1=1,fib2=1,fib,i=3;while(i<=12){ fib=fib1+fib2; fib1=fib2;fib2=fib; i++;}printf(“TheFibonaccinumberafter1yeris:%d\n”,fib);return0;}根據(jù)圖3-12所示的算法??梢院苋菀椎貙懗鋈缦鲁绦?。/***49例3-13百錢買百雞問題。公元前五世紀(jì),我國古代數(shù)學(xué)家張丘建在《算經(jīng)》一書中提出了“百雞問題”:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、母、雛各幾何?(1)基本解題思路這是一個有名的不定方程問題:cocks+hens+chicks=100(1)5*cocks+3*hens+chicks/3=100(2)式中:cocks:雞翁數(shù)hens:雞母數(shù)chicks:雞雛數(shù)例3-13百錢買百雞問題。cocks+hens+chic50對上述不定方程問題,要先確定一個變量的值,才能對其進行求解。由問題中給出的條件,很容易得到三個變量的取值范圍:cocks:0~19中的整數(shù)(因為每只雞翁5錢,因此它不可能超過19只)hens:0~33中的整數(shù)chicks:0~100中的整數(shù)基本的解題思路是:依次取cocks值域中的一個值,然后求其余兩數(shù),看是否合乎題意,合乎者為解。這個基本解題思路便是解本題的粗略算法,下面是它的偽代碼描述,圖3-13(1)為其N-S圖。s1:cocks=0;/*賦初值*/s2:當(dāng)(cocks<=19)s2.1:找滿足題意的hens,chicks;s2.2:cocks++;S3:輸出一組cocks,hens和chichs對上述不定方程問題,要先確定一個變量的值,才51圖3-13(1)百錢買百雞的粗略算法

當(dāng)(cocks<=19)找滿足題意的hens和chicks輸出一組cocks,hens和chichs初始化:cocks=0cocks++圖3-13(1)百錢買百雞的粗略算法當(dāng)(cocks<=52(2)對s2.1細化思路1:把已確定的cocks代入式(1)與(2)中,求解方程,看能否找到滿足題意的解。這種思路不太適合計算機求解。思路2:在每個給定的cocks下,面對hens的取值范圍內(nèi)的各個值依次測試,看能找到哪些hens及chicks滿足題意。于是得到如下s2.1細化算法。

用這段算法代替圖3-13(1)中的“找滿足題意的hens和chicks”,得到圖3-13(2)所示的百錢買百雞的N-S圖算法。s2.1.1:hens=0;s2.1.2:當(dāng)(hens<=33)s2.1.2.1:找滿足題意的chicks;s2.1.2.2:hens++;/*即hens=hens+1*/(2)對s2.1細化用53圖3-13(2)百錢買百雞算法的細化算法

當(dāng)(cocks<=19)當(dāng)(hens<=33)初始化:cocks=0輸出一組cocks,hens和chichscocks++hens=0找滿足題意的chicksHens++圖3-13(2)百錢買百雞算法的細化算法當(dāng)(cocks54(3)對s2.1.2.1細化對s2.1.2.1來說,cocks及hens都已確定,這時的chicks可以計算出:chicks=100-cocks-hens式(1)已滿足。只要用式(2)指定的條件測試便可知這一組cocks,hens及chicks是否滿足題意。滿足則打印出一組解。于是s2.1.2.1可細化為:圖3.13(3)為進一步細化的百錢買百雞算法。s2.1.2.1:chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0)==100)printf(″%d%d%d\n″,cocks,hens,chicks);(3)對s2.1.2.1細化圖3.13(3)為進一步細化的55

圖3-13(3)百錢買百雞算法的細化算法

當(dāng)(cocks<=19)當(dāng)(hens<=33)cocks=0cocks++hens=0chicks=100-cocks-henshens++(5*cocks+3*hens+chicks/3.0)==100輸出一組cocks,hens和chichs(空)真假圖3-13(3)百錢買百雞算法的細化算法當(dāng)(cocks56/******百錢買百雞問題******/#include<stdio.h>intmain(void){intcocks=0; printf("%8s%8s%8s\n","cocks","hens","chicks");while(cocks<=19){inthens=0;while(hens<=33){intchicks;chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0==100)printf("%8d%8d%8d\n",cocks,hens,chicks); hens++;}cocks++;}return0;}/******百錢買百雞問題******/573.8.2do…while結(jié)構(gòu)do…while,其形式如下:當(dāng)流程到達do后,立即執(zhí)行循環(huán)體一次,然后才對判斷表達式進行計算、測試。若表達式的值為真(非0),則重復(fù)執(zhí)行一次循環(huán)體;否則退出。與while結(jié)構(gòu)相比,do…while結(jié)構(gòu)至少要執(zhí)行一次循環(huán)體。這樣的結(jié)構(gòu)應(yīng)用在需要事先執(zhí)行一次循環(huán)體的程序非常容易理解。do循環(huán)體while(表達式);3.8.2do…while結(jié)構(gòu)當(dāng)流程到達do后,立即執(zhí)行循58例3-14用牛頓迭代法計算一個正實數(shù)a的平方根,精確到E0=10-5。(1)建立迭代關(guān)系式,由題意可以寫出:x=(a)1/2或x2=a于是得到方程:f(x)=x2-a=0,f′(x)=2x根據(jù)牛頓迭代公式x=x-f(x)/f′(x)=x-(x2-a)/2x=1/2(x+a/x)即x=(x+a/x)*0.5這就是要建立的迭代關(guān)系式。例3-14用牛頓迭代法計算一個正實數(shù)a的平方根,精確到E059(2)給定初值。今設(shè)√a的初值為a(當(dāng)然也可以為其它值)。(3)給定精度(誤差)為E0。精度是迭代控制的條件,當(dāng)誤差大于E0時,要繼續(xù)迭代。如何計算誤差呢?本來應(yīng)該用|x-√a|來表示誤差,即把求出的x與真正的√a相比,計算出其誤差,但是現(xiàn)在√a并不知道,因此可換一種方法來表示誤差,用|x*x-a|(因為要求x=√a,即x2=a,x與a的差距可以通過x2與a的差距反映出來)。于是得到循環(huán)結(jié)構(gòu)的控制條件:|x2-a|≥E0即fabs(x*x-a)>=E0(2)給定初值。今設(shè)√a的初值為a(當(dāng)然也可以為其它值)。60/******計算平方根******/#include<math.h>#defineE00.00005doublesq_root(doublea) /*計算a的平方根*/{doublex;x=a;x=(x+a/x)*0.5;while(fabs(x*x-a)>=E0)x=(x+a/x)*0.5;return(x);}這里fabs是一個標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)名。E0是誤差要求,可以用#define命令在程序頭部作為一個符號常數(shù)進行定義,在不同情況下根據(jù)需要可以對它修改。/******計算平方根******/這61#include<stdio.h>intmain(void){ doublef=2.0;printf("Therootof%fis%f\n",f,sq_root(f));return0;}用下面的主函數(shù)進行測試測試結(jié)果如下:Therootof2.000000is1.414216#include<stdio.h>用下面的主函數(shù)進623.8.3for結(jié)構(gòu)為了說明for結(jié)構(gòu),先看下面一個程序段:sum=0;for(i=1;i<=n;i++)sum=sum+i;它是下面的控制結(jié)構(gòu)的一個例子。for(表達式1;表達式2;表達式3)循環(huán)體為了說明for后面括弧中三個表達式的語句,將它改寫為如下while結(jié)構(gòu):sum=0;i=1; /*相當(dāng)于for語句中的表達式1*/while(i<=n) /*相當(dāng)于for語句中的表達式2 */{sum=sum+i; /*for循環(huán)體 */i++; /*相當(dāng)于for語句中的表達式3 */}3.8.3for結(jié)構(gòu)sum=0;它是下面的控制結(jié)構(gòu)的63顯然,這三個表達式的作用是控制循環(huán),故稱循環(huán)控制表達式。表達式1稱為初始化表達式;表達式2稱為條件表達式;表達式3稱為修正表達式??梢钥闯觯篺or語句是將初始化、條件判斷、循環(huán)變量值變化三者組織在一起的循環(huán)控制結(jié)構(gòu)。for結(jié)構(gòu)的格式可以表示為:for語句的執(zhí)行過程如下:(1)先執(zhí)行表達式1(初始化表達式)。注意在整個循環(huán)中它只執(zhí)行一次。(2)重復(fù)下面的過程:計算表達式2(判斷表達式),若為真(非0),就執(zhí)行一次循環(huán)體語句,然后再執(zhí)行表達式3(修正表達式);再計算表達式2(判斷表達式),判斷是否為“真”,……直至表達式2(判斷表達式)的值為假(0),就不再執(zhí)行循環(huán)體了。for(初始化表達式;判斷表達式;修正表達式)循環(huán)體語句顯然,這三個表達式的作用是控制循環(huán),故稱循環(huán)64在某些情況下,用for結(jié)構(gòu)表示循環(huán),顯得緊湊而清晰。尤其是它能利用表達式3自動地使循環(huán)變量值發(fā)生改變,不像while結(jié)構(gòu)那樣要在循環(huán)體中設(shè)置“修正操作”。實際上,for語句中的表達式3并不僅限于修正循環(huán)變量,而可以是任何操作。例如前面介紹的求1+2+…+n的程序段可以改寫為:形成一個沒有循環(huán)體的結(jié)構(gòu),或者說循環(huán)體是一個空語句(僅一個分號)。而表達式3成為一個逗號表達式,它包含兩個簡單表達式(包含了本應(yīng)由循環(huán)體完成的功能),表達式的執(zhí)行順序從左到右。表達式1也是一個逗號表達式,它使sum和i都初始化。for(sum=0,i=1;i<=n;sum=sum+i,i++);在某些情況下,用for結(jié)構(gòu)表示循環(huán),顯得緊湊65計算Fibonacci數(shù)程序,用for結(jié)構(gòu)修改如下:#include<stdio.h>intmain(void){intfib1=1,fib2=1,fib,i;for(i=3;i<=12;i++) { fib=fib1+fib2; fib1=fib2; fib2=fib; }printf(“TheFibonaccinumberafter1yeris:%d\n”,fib);return0;}計算Fibonacci數(shù)程序,用for結(jié)構(gòu)修改如下:66百錢買百雞問題用for結(jié)構(gòu)編寫的程序如下:#include<stdio.h>intmain(void){intcocks;printf("%8s%8s%8s\n","cocks","hens","chicks");for(cocks=0;cocks<=19;cocks++) { inthens; for(hens=0;hens<=33;hens++) { intchicks; chicks=100-cocks-hens; if(5*cocks+3*hens+chicks/3.0==100) printf("%8d%8d%8d\n",cocks,hens,chicks); }}return0;}百錢買百雞問題用for結(jié)構(gòu)編寫的程序如下:67例3-18打印九九表。下面用逐步求精的方法分析本例的解法。表體共九行,所以首先考慮一個打印九行的算法s1:下面進一步考慮如何“打印第i行”。因為每行都有九個數(shù)字,故“打印第i行”可以寫為s1.1:

for(i=1;i<=9;i++){打印第i行打印換行符}for(j=1,j<=9;j++)打印第j個數(shù)例3-18打印九九表。下面用逐步求精的方法分析本例的解法68“打印第j個數(shù)”即在第i行的第j列上打印一個數(shù),大小為i*j,占4個字寬。故可寫為printf(″%4d″,i*j);在寫這個語句時,人們自然要考慮寫不寫換行符。顯然不能在每個數(shù)字后面都換行,而只能在第9個數(shù)字后面寫換行。實現(xiàn)只在第9個數(shù)字后面換行的辦法是,打印完一行,即在j循環(huán)后寫一個語句使換行:printf(″\n″);于是,打印九九表的程序可寫為:“打印第j個數(shù)”即在第i行的第j列上打印一個數(shù),大小為i*69/******打印九九乘法表******/#include<stdio.h>intmain(void){inti,j;for(i=1;i<=9;i++){/*實際上將9改為i,更符合數(shù)學(xué)上的習(xí)慣*/for(j=1;j<=9;j++)printf(“%d*%d=%4d",i,j,i*j);printf("\n");}return0;}/******打印九九乘法表******/70例3-19用梯形法求數(shù)值積分。定積分的幾何意義就是求曲線f(x)與直線y=0,x=a,x=b所圍成的曲頂梯形的面積。當(dāng)能找到f(x)的原函數(shù)F(x)時,利用牛頓-萊布尼茲公式:

可以精確地求出I值來。當(dāng)f(x)的原函數(shù)不易找到時,便可以借助數(shù)值方法近似地求出I的值。用數(shù)值方法計算定積分有兩個關(guān)鍵:一是將連續(xù)的對象分割為容易求解的一些子對象;二是用迭代法對迭代表達式反復(fù)操作。下面介紹一種容易理解的方法——梯形法。由圖3-16所示,一個曲頂梯形可以分割為許多小的寬為h的曲頂梯形。例3-19用梯形法求數(shù)值積分。71bf(x)x0yaa+ha+iha+ih+ha+2h……圖3-16用梯形法求定積分bf(x)x0yaa+ha+iha+ih+ha+2h……圖372當(dāng)h(h=(b-a)/n)很小時,每個小的曲頂梯形都可以近似看作是梯形,第i個小曲頂梯形的面積近似為:si=h/2[f(a+ih)+f(a+(i+1)h)]于是定積分的值(曲線所圍成的面積):

當(dāng)n→∞時,就能準(zhǔn)確地求出定積分S。在現(xiàn)實中,只要取相當(dāng)大的n,使誤差小于要求的值,就可以近似地計算出定積分S。用迭代形式描述為:for(i=1;i<=n-1;i++){s=0.5*h*(f(a)+f(b))s=s+h*f(a+i*h)}最后計算的結(jié)果,就是函數(shù)f(x)的定積分。當(dāng)h(h=(b-a)/n)很小時,每個小的曲頂梯形都可以近似73下面是一個利用梯形法求函數(shù)f(x)=√4-x的定積分的程序:/***用梯形法求積分***/#include<stdio.h>doublef(doublex);intmain(void){ floata,b; doubles,h; intn,i; printf("輸入計算的區(qū)間[a,b]"); scanf("%f,%f",&a,&b); printf("輸入迭代的次數(shù)"); scanf("%d",&n); h=(b-a)/n; s=0.5*h*(f(a)+f(b)); for(i=1;i<=n-1;i++) s+=f(a+i*h)*h; printf("函數(shù)f(x)在區(qū)間[%.2f,%.2f]間的定積分值約為:%f\n",a,b,s); return0;}#include<math.h>doublef(doublex){ returnsqrt(4.0-x);}下面是一個利用梯形法求函數(shù)f(x)=√4-74循環(huán)結(jié)構(gòu)的中途退出與重復(fù)周期的中途結(jié)束下頁圖為循環(huán)結(jié)構(gòu)中途退出(loop-and-half)與一個循環(huán)周期的中途結(jié)束的示意圖。中途退出循環(huán)結(jié)構(gòu)就是使用break語句,將流程轉(zhuǎn)到該循環(huán)結(jié)構(gòu)的后面。循環(huán)周期的的中途結(jié)束就是在重復(fù)執(zhí)行到某一個循環(huán)周期的中間時,由于某種條件,不需要再執(zhí)行循環(huán)體中后面的語句,提前結(jié)束該周期,而進入下一循環(huán)周期,在C語言中需要使用continue實現(xiàn)。這兩種控制功能不僅用于while結(jié)構(gòu)中,也可以用在do…while和for重復(fù)結(jié)構(gòu)中。3.9擴展知識與理論循環(huán)結(jié)構(gòu)的中途退出與重復(fù)周期的中途結(jié)束3.9擴展知識與理論75while(…){ … … if(…)break;… …}……while(…){ … … if(…)cotinue;… …}……

(a)循環(huán)結(jié)構(gòu)中途退出

(b)一個循環(huán)周期的中途退出while(…)while(…)(a)循環(huán)結(jié)構(gòu)中途退出(763.9.1中途退出循環(huán)結(jié)構(gòu)——break語句break語句將流程轉(zhuǎn)出switch結(jié)構(gòu)。break語句還可以將流程中途轉(zhuǎn)出任何一種循環(huán)結(jié)構(gòu)。例3-20驗證素數(shù)。驗證一個正整數(shù)n>3的數(shù)是否為素數(shù),一個最直觀的方法是,看在2~n/2中能否找到一個整數(shù)m能將n整除。若m存在,則n不是素數(shù);若找不到m,則n為素數(shù)。這是一個窮舉驗證算法。這個循環(huán)結(jié)構(gòu)用下列表達式控制:·初值:m=2·循環(huán)條件:m<=n/2·修正:m++即這是一個for結(jié)構(gòu)。它的作用是窮舉2~n/2中的各m值。循環(huán)體是判斷n是否可以被m整除。顯然,在這個過程中,一旦找到一個m可以整除n,則用該m后面的各數(shù)去驗證已經(jīng)沒有意義了,需要退出循環(huán)結(jié)構(gòu)。3.9.1中途退出循環(huán)結(jié)構(gòu)——break語句77按上述分析可以寫出一個驗證正整數(shù)n是否為素數(shù)的函數(shù):/******驗證素數(shù)******/#include<stdio.h>intmain(void){

intm,n,flag=1;printf("請輸入要測試的整數(shù):");scanf("%d",&n);for(m=2;m<=n/2;m++)if(n%m==0){flag=0;/*設(shè)置非素數(shù)標(biāo)志*/break;/*一旦找到一個m,斷定該n非素數(shù),不需再驗證*/}flag?printf("%d是素數(shù)\n",n):printf("%d不是素數(shù)\n",n);return0;}按上述分析可以寫出一個驗證正整數(shù)n是否為素數(shù)的函數(shù):/***783.9.2提前結(jié)束一個循環(huán)周期——continue語句例3-21輸出100~200間的所有素數(shù)。這個程序可以在例3.20的基礎(chǔ)上進行。當(dāng)測試到某個n存在一個因數(shù)m時,用break跳出內(nèi)層循環(huán)復(fù)結(jié)構(gòu),同時在外層循環(huán)結(jié)構(gòu)中要跳過輸出語句,進入對下一個數(shù)的測試。按上述分析可以寫出一個驗證正整數(shù)n是否為素數(shù)的函數(shù):3.9.2提前結(jié)束一個循環(huán)周期——continue語句79/******輸出素數(shù)******/#include<stdio.h>intmain(void)

{intm,n,flag;printf("\nTheprimersfrom100to200is:\n");for(n=101;n<=200;n+=2)/*僅測試100~200間的奇數(shù)*/{flag=1; /*設(shè)置標(biāo)志 */for(m=2;m<=n/2;m++){if(n%m==0){flag=0; /*改變標(biāo)志 */break;/*跳出內(nèi)層循環(huán)結(jié)構(gòu)*/}}if(flag==0) /*判斷標(biāo)志 */continue;/*跳出過輸出語句進入下一周期*/printf(“%d,”,n);}printf("\n");return0;}

/******輸出素數(shù)******/80項目3項目381技能目標(biāo)會畫程序的流程圖或N-S結(jié)構(gòu)圖會用if-else實現(xiàn)分支結(jié)構(gòu)和多分支結(jié)構(gòu)的程序設(shè)計會用條件運算符進行分支結(jié)構(gòu)的程序設(shè)計會用switch語句實現(xiàn)多分支結(jié)構(gòu)的程序設(shè)計會用for語句、while語句、do-while語句進行循環(huán)結(jié)構(gòu)程序設(shè)計會用break語句和continue語句技能目標(biāo)會畫程序的流程圖或N-S結(jié)構(gòu)圖82知識目標(biāo)掌握if-else語句的用法掌握條件運算符的使用掌握switch語句的用法掌握for語句、while語句和do-while語句的使用掌握循環(huán)的簽套使用掌握break和continue語句的使用知識目標(biāo)掌握if-else語句的用法83項目任務(wù)與解析本項目實現(xiàn)班級學(xué)生成績管理系統(tǒng)中用if語句實現(xiàn)菜單的選擇執(zhí)行、用switch語句實現(xiàn)菜單的選擇執(zhí)行、用循環(huán)語句實現(xiàn)主菜單的選擇執(zhí)行。本項目包含下面幾個任務(wù):任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行任務(wù)5:用switch語句實現(xiàn)菜單的選擇執(zhí)行任務(wù)6:用循環(huán)語句實現(xiàn)主菜單的選擇執(zhí)行項目任務(wù)與解析本項目實現(xiàn)班級學(xué)生成績管理系統(tǒng)中用if語句實現(xiàn)84

主要內(nèi)容3.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行3.2必備知識與理論3.3擴展知識與理論3.4任務(wù)5:用switch語句實現(xiàn)菜單的選擇執(zhí)行3.5必備知識與理論3.6擴展知識與理論3.7任務(wù)6:用循環(huán)語句實現(xiàn)菜單的選擇執(zhí)行3.8必備知識與理論3.9擴展知識與理論主要內(nèi)容3.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行853.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行1.問題描述對顯示的菜單,選擇要執(zhí)行的菜單序號,并顯示要執(zhí)行的菜單名。2.具體實現(xiàn)P41程序3.知識分析在多數(shù)情況下順序結(jié)構(gòu)的程序是很少的,一般還包括分支和循環(huán)結(jié)構(gòu)。分支結(jié)構(gòu)還包括if-else結(jié)構(gòu)和switch結(jié)構(gòu)。我們首先來學(xué)習(xí)分支結(jié)構(gòu),在學(xué)習(xí)分支結(jié)構(gòu)前了解一些算法的概念,關(guān)系運算符和邏輯運算符的使用。3.1任務(wù)4:用if語句實現(xiàn)菜單的選擇執(zhí)行1.問題描述863.2必備知識與理論3.2.1算法的概念1.算法算法就是程序處理問題的步驟與方法。

1976年瑞士計算機科學(xué)家NiklausWirth提出了一個著名的公式:算法+數(shù)據(jù)結(jié)構(gòu)=程序3.2必備知識與理論3.2.1算法的概念872.算法的特性簡單地說,算法就是進行操作的方法和操作步驟。例如,菜譜實際上是做菜肴的算法,樂譜實際上是演奏的算法,計算機程序是用某種程序設(shè)計語言描述的解題算法。通常認為算法有如下一些性質(zhì):(1)有窮性一個算法要在有限的步驟內(nèi)解決問題(這里所說的步驟是指計算機執(zhí)行步驟)。計算機程序不能無限地運行下去(甚至不能長時間地運行下去),所以一個無限執(zhí)行的方法不能成為程序設(shè)計中的“算法”。(2)確定性確定性具有兩重意義:一是所描述的操作應(yīng)當(dāng)具有明確的意義,不應(yīng)當(dāng)有歧義性。例如,不能發(fā)出這樣的操作指令:“執(zhí)行一個算術(shù)操作”。因為它既沒有指出算術(shù)操作的類型,也沒有指出操作數(shù)。確定性的另一重意義:·操作作序列只有一個初始動作,序列中每一動作僅有一個后繼動作;·序列終止表示問題得到解答或問題沒有解答,不能沒有任何結(jié)論。2.算法的特性88(3)有零個或多個輸入輸入就是從外界取得必要的信息。一個算法可以有零個或多個輸入,例如:輸入一個年份,判斷其是否是閏年。同時一個算法可以沒有輸入,例如:計算出5!是多少。(4)有一個或多個輸出算法的目的就求解,“解”就是我們想要得到的最終結(jié)果。輸出是同輸入有著某些特定關(guān)系的量。一個算法得到的最終結(jié)果就是輸出。沒有輸出的算法是沒有意義的。(5)可執(zhí)行性一個算法應(yīng)當(dāng)是可以由計算機執(zhí)行的,算法中描述的操作都是可以通過計算機的運行來實現(xiàn)。(3)有零個或多個輸入893.2.2算法的表示方法

1.自然語言表示算法自然語言是相對于計算機語言而言的,是指人們在日常生活中使用的語言,如漢語、英語等。對于某些程序員來說,自然語言通俗易懂。但是,對于規(guī)模大、復(fù)雜的算法,使用自然語言來描述,往往很冗長,不直觀,而且容易發(fā)生歧義。比如對于以下這句話:如果A大于B,就給它加1。在理解時就可能出現(xiàn)歧義,是給A加1?還是給B加1。對于以上的一段話,如果我們用C語言進行編程則為: if(A>B) A=A+1;正是由于自然語言描述算法具有的缺陷,所以在程序設(shè)計中很少有人使用。3.2.2算法的表示方法902.傳統(tǒng)流程圖表示法用一些圖框表示各種操作,用線表示這些操作的執(zhí)行順序。我國國家標(biāo)準(zhǔn)GB1526—89中推薦的一套流程圖標(biāo)準(zhǔn)化符號,它與國際標(biāo)準(zhǔn)化組織ISO提出的ISO流程圖符號是一致的。圖3-1為其中常用的一些符號。2.傳統(tǒng)流程圖表示法91過程判斷數(shù)據(jù)預(yù)定義過程起止流程線連接注釋圖3.2常用的流程圖標(biāo)準(zhǔn)化符號

過程判斷數(shù)據(jù)預(yù)定義過程起止流程線連接注釋圖3.2常用92平行四邊形表示數(shù)據(jù),其中可注明數(shù)據(jù)名稱、來源、用途或其它的文字說明。處理矩形表示各種處理功能。例如,執(zhí)行一個或一組特定的操作,從而使信息的值、信息形式或所在位置發(fā)生變化。矩形內(nèi)可注明處理名稱或其簡要功能。預(yù)定義過程帶有雙豎邊線的矩形,表示已命名的處理。該處理為在另外地方已得到詳細說明的一個操作或一組操作。例如庫函數(shù)或其它已定義的函數(shù)等。矩形內(nèi)可注明特定處理名稱或其簡要功能。判斷菱形表示判斷。菱形內(nèi)可注明判斷的條件。它只有一個入口,但可以有若干個可供選擇的出口,在對定義的判斷條件求值后,有一個且僅有一個出口被選擇。求值結(jié)果可在表示出口路徑的流線附近寫出。流線直線表示執(zhí)行的流程。當(dāng)流程自上向下或由左向右時,流程線可不帶箭頭,其它情況應(yīng)加箭頭表示流程。端點。扁圓形表示轉(zhuǎn)向外部環(huán)境或從外部環(huán)境轉(zhuǎn)入的端點符。例如,程序流程的起、始點。注解。注解是程序的編寫者向閱讀者提供的說明。注解符由縱邊線構(gòu)成,它用虛線連接到被注解的符號或符號組上。

平行四邊形表示數(shù)據(jù),其中可注明數(shù)據(jù)名稱、來源、用途或其它的文93圖3-2(a)、(b)、(c)中的虛線框,分別為用流程圖表示的三種基本流程控制結(jié)構(gòu)。S1S2S3PS1S2真假PS2假真(a)順序結(jié)構(gòu)

(b)選擇結(jié)構(gòu)

(c)重復(fù)結(jié)構(gòu)

圖3-2

用流程圖描述的三種基本結(jié)構(gòu)

圖3-2(a)、(b)、(c)中的虛線框,分別為用流94例3-1用流程圖描述從三個數(shù)中取最大數(shù)的算法。從三個數(shù)中取最大數(shù)的算法思路是:假定這三個數(shù)是a,b,c,則首先可以比較a,b兩數(shù),從中選大者;然后再用這個大數(shù)與數(shù)c比較,從中取大者。這時得到的大數(shù),就是三個數(shù)中的最大數(shù)。這個算法用流程圖描述如圖3-3(a)所示。通常,求解一個問題的算法不是唯一的。例如圖3-3(b)也是一個三數(shù)中取大的算法。它的基本思路是,先設(shè)max=第一個數(shù),然后依次輸入i個數(shù),每輸入一個數(shù),與max比較一次,把大的放入max中。當(dāng)輸完i個數(shù)時,max中存放的就是這i個數(shù)中的最大數(shù)。這里,i是一個計數(shù)器,用于統(tǒng)計輸入數(shù)的個數(shù),所以每輸入一個數(shù),要執(zhí)行一次自增操作。這個算法與圖3-3(a)所示算法的不同在于:算法結(jié)構(gòu)不同:圖3-3(a)所示算法采用了兩個選擇結(jié)構(gòu),而圖3-3(b)所示算法采用了一個循環(huán)結(jié)構(gòu)和一個選擇結(jié)構(gòu)。算法的靈活性不同:圖3-3(b)中的算法可以用來求任意個數(shù)中的最大數(shù)。例3-1用流程圖描述從三個數(shù)中取最大數(shù)的算法。95a>=b輸入a,b,cmax=a真假max=bmax>=c真假輸出max輸出c開始結(jié)束i<=3輸入一個n假真假輸出max開始結(jié)束max=0,i=1真i++n>=maxmax=n(a)一個三數(shù)中取大的算法

(b)另一個三數(shù)中取大的算法

圖3-3三數(shù)中取大算法的流程圖描述

a>=b輸入a,b,cmax=a真假max=bmax>=c真963.用N-S流程圖表示算法靈活的流線是程序中隱藏錯誤的禍根。針對這一弊病,1973年美國學(xué)者I.Nassi和B.Shneiderman提出了一種無流線的流程圖,稱為N-S圖。它的三種基本結(jié)構(gòu)如圖3-4所示。N-S圖的每一種基本結(jié)構(gòu)都是一個矩形框,整個算法可以像堆積木一樣堆成。其中,(a)為三個操作組成的順序結(jié)構(gòu);(b)為二分支的選擇結(jié)構(gòu);(c)為當(dāng)型重復(fù)結(jié)構(gòu),即當(dāng)命題P為“真”時,就重復(fù)執(zhí)行S。3.用N-S流程圖表示算法97S1S2S3PS1S2當(dāng)PS假真(c)循環(huán)結(jié)構(gòu)(a)順序結(jié)構(gòu)

(b)選擇結(jié)構(gòu)圖3-4用N-S圖描述三種基本流程結(jié)構(gòu)

S1S2S3PS1S2當(dāng)PS假真(c)循環(huán)結(jié)構(gòu)(a)順序結(jié)構(gòu)98圖3-5(a)、(b)給出了用與圖3-3(a)、(b)流程圖對應(yīng)的N-S圖。a>=bmax=amax=b輸入a,b,c假真max>=c輸出max輸出c真假當(dāng)i<=3i++n>=maxmax=n真假輸入n初始化:max=0,i=1輸出max(a)采用選擇結(jié)構(gòu)

(b)采用循環(huán)結(jié)構(gòu)

圖3-5

三數(shù)中取大算法的N-S圖描述圖3-5(a)、(b)給出了用與圖3-3(a)、(b99

3.用偽碼表示算法偽代碼(pseudocode)是用介于自然語言與

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論