C語言程序設(shè)計(jì)模塊四 學(xué)生成績管理_第1頁
C語言程序設(shè)計(jì)模塊四 學(xué)生成績管理_第2頁
C語言程序設(shè)計(jì)模塊四 學(xué)生成績管理_第3頁
C語言程序設(shè)計(jì)模塊四 學(xué)生成績管理_第4頁
C語言程序設(shè)計(jì)模塊四 學(xué)生成績管理_第5頁
已閱讀5頁,還剩117頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

任務(wù)4-1:學(xué)生成績添加和瀏覽任務(wù)4-2:學(xué)生成績統(tǒng)計(jì)任務(wù)4-3:學(xué)生成績排序任務(wù)4-4:學(xué)生成績查詢模塊四學(xué)生成績管理掌握一維數(shù)組的定義和應(yīng)用;掌握循環(huán)結(jié)構(gòu)for語句的應(yīng)用;掌握自定義函數(shù)的定義和調(diào)用過程;掌握一維數(shù)組的求最值、平均等統(tǒng)計(jì)算法;掌握一維數(shù)組的冒泡排序、選擇排序算法;掌握一維數(shù)組的順序查找、折半查找算法;掌握二維數(shù)組的定義和應(yīng)用。任務(wù)4-1學(xué)生成績添加和瀏覽任務(wù)描述與分析

每個項(xiàng)目組完成了系統(tǒng)主菜單和兩種用戶的子菜單。接下來,要分別實(shí)現(xiàn)各個子菜單的功能。要進(jìn)行學(xué)生成績的管理,必須先將學(xué)生的成績添加進(jìn)去,并能夠正確的瀏覽出來。因此,周老師要求每個項(xiàng)目組實(shí)現(xiàn)管理員子菜單中的班級成績添加功能和班級成績?yōu)g覽功能,即,將班級30名同學(xué)的C語言成績添加到系統(tǒng)中,并能夠正確的進(jìn)行成績?yōu)g覽。

任務(wù)實(shí)現(xiàn)效果如圖4-1和4-2所示。系統(tǒng)運(yùn)行時,首先進(jìn)入主菜單,然后選擇1以管理員身份進(jìn)入管理員子菜單。選擇1,實(shí)現(xiàn)班級成績添加功能,輸入30名同學(xué)的C語言成績。接著再次選擇2,實(shí)現(xiàn)班級成績?yōu)g覽功能,輸出30名同學(xué)的學(xué)號和對應(yīng)的C語言成績。任務(wù)描述任務(wù)描述與分析任務(wù)分析要完成這個任務(wù),需要掌握哪些知識?首先,要確定用哪種數(shù)據(jù)結(jié)構(gòu)來存儲30名同學(xué)的成績。假設(shè)成績都是整數(shù),需要定義30個整型變量,顯然是不合適的。因此,需要學(xué)習(xí)一維數(shù)組,只需要定義一個長度為30的一維整型數(shù)組就可以了。其次,可以用之前學(xué)過的scanf和printf輸入輸出30名同學(xué)的成績。需要在程序中寫30個scanf和printf輸入語句,顯然也不合理。因此,要學(xué)習(xí)一個新的循環(huán)語句,那就是for語句。不同于之前學(xué)過的while語句和dowhile循環(huán)語句,for語句一般用于循環(huán)次數(shù)固定的情況。最后,如果將成績添加和瀏覽的代碼直接寫到主函數(shù)中的子菜單里,代碼的復(fù)用性和程序的結(jié)構(gòu)性和可讀性都較差。因此,采用應(yīng)用廣泛的模塊化程序設(shè)計(jì)思路,周老師要求采用用戶自定義函數(shù)的方法,本任務(wù)需要自定義2個函數(shù):學(xué)生成績添加函數(shù)和學(xué)生成績?yōu)g覽函數(shù)。相關(guān)知識與技能4-1-1一維數(shù)組

數(shù)組是相同類型數(shù)據(jù)的有序集合。數(shù)組描述的是相同類型的若干個數(shù)據(jù),按照一定的先后次序排列組合而成。其中,每一個數(shù)據(jù)稱作一個數(shù)組元素,每個數(shù)組元素可以通過一個下標(biāo)來訪問它們。

數(shù)組有兩個特點(diǎn):(1)其長度是確定的,在定義的同時確定了其大小,在程序中不允許隨機(jī)變動。(2)其元素必須是相同類型,不允許出現(xiàn)混合類型。1.一維數(shù)組的定義

定義語法:<類型說明符><數(shù)組名>[<常量表達(dá)式>]

其中,類型說明符是任一種基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型;數(shù)組名是有效的用戶自定義標(biāo)識符;常量表達(dá)式表示數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。

例如,

inta[10];//說明整型數(shù)組a,有10個元素 charch[20];//字符型數(shù)組ch,有20個元素 doubled[5];//雙精度型數(shù)組d,有5個元素

任務(wù)描述與分析圖4-2班級成績?yōu)g實(shí)現(xiàn)效果圖4-1班級成績添加實(shí)現(xiàn)效果相關(guān)知識與技能

定義一個數(shù)組后,系統(tǒng)會在內(nèi)存中分配一片連續(xù)的存儲空間用于存放數(shù)組元素,元素的下標(biāo)從0開始。例如,定義一個長度為10的整型數(shù)組a:inta[10];數(shù)組元素在內(nèi)存的存儲形式如圖4-3所示。圖4-3數(shù)組a在內(nèi)存的數(shù)據(jù)元素存儲形式

相關(guān)知識與技能2.一維數(shù)組的引用一維數(shù)組元素的引用形式:數(shù)組名[下標(biāo)]。例如,定義一個整型數(shù)組a,分別給每個數(shù)組元素賦值為它的下標(biāo),代碼如下:

inta[5];

a[0]=0;a[1]=1;a[2]=2;a[3]=3;a[4]=4;相關(guān)知識與技能3.一維數(shù)組的初始化可以在定義數(shù)組的同時給數(shù)組元素賦初值:inta[10]={0,1,2,3,4,5,6,7,8,9};可以只給數(shù)組的部分元素賦值:inta[10]={0,1,2,3,4};只給a[0]到a[4]賦值,a[5]以后的元素自動賦0;如果給全部元素賦值,則定義數(shù)組的時候可以不給出數(shù)組的長度:inta[]={1,2,3,4,5};相關(guān)知識與技能4-1-2for語句

for語句是一種循環(huán)語句。for循環(huán)一般用于循環(huán)次數(shù)可定的情況,也可用于不能確定的情況,大大簡化了循環(huán)的書寫。1.for語句的語法格式

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

循環(huán)體語句其中:表達(dá)式1:給循環(huán)變量賦初值;表達(dá)式2:循環(huán)條件,若為真,執(zhí)行循環(huán)體;表達(dá)式3:循環(huán)變量變化的步長設(shè)置。在整個循環(huán)過程中,表達(dá)式1執(zhí)行1次;表達(dá)式2執(zhí)行的次數(shù)由循環(huán)條件決定;表達(dá)式3執(zhí)行次數(shù),比表達(dá)式2執(zhí)行次數(shù)少一次;相關(guān)知識與技能圖4-4列出了for循環(huán)的流程圖。圖4-4for循的流程圖相關(guān)知識與技能那么for語句和之前學(xué)過的while、do..while語句有什么區(qū)別呢?for循環(huán)本質(zhì)上就是while循環(huán),條件執(zhí)行比循環(huán)體和表達(dá)式3執(zhí)行多1次。while循環(huán)的用途廣泛,是循環(huán)結(jié)構(gòu)中用得最多的。條件執(zhí)行比循環(huán)體執(zhí)行多1次。do..while循環(huán)的用途與while類似,條件執(zhí)行和循環(huán)體執(zhí)行的次數(shù)一樣??梢酝ㄟ^for循環(huán)給上面學(xué)到的一維數(shù)組元素循環(huán)賦值。

例如:

inta[5];

for(i=0;i<5;i++)

scanf(“%d”,&a[i]);

這樣,給一個長度為5的數(shù)組進(jìn)行賦值,通過for循環(huán),只需要寫一個scanf語句,循環(huán)執(zhí)行5次。相關(guān)知識與技能2.for循環(huán)的嵌套

在循環(huán)體中可以出現(xiàn)語句的地方,都允許出現(xiàn)循環(huán)語句,稱為循環(huán)的嵌套。內(nèi)層的稱為內(nèi)循環(huán),外層的稱為外循環(huán)。

例如:

for(i=1;i<10;i++)

for(j=1;j<10;j++)

printf(“%d*%d=%d\n”,i,j,i*j);

說明:外層循環(huán)的值每變化1次,內(nèi)層循環(huán)都要執(zhí)行1個輪回,9*9=81次。相關(guān)知識與技能4-1-3函數(shù)的定義和調(diào)用函數(shù)是C程序的基本模塊。把具備特定功能的代碼組織在相對獨(dú)立的函數(shù)內(nèi),在執(zhí)行時給它一定的輸入,函數(shù)執(zhí)行完畢后,就可以實(shí)現(xiàn)其設(shè)計(jì)功能。函數(shù)是減少代碼重復(fù)書寫、功能抽取、實(shí)現(xiàn)模塊化程序設(shè)計(jì)的重要手段。在C語言程序設(shè)計(jì)以及其他的軟件開發(fā)中,都離不開函數(shù)的應(yīng)用。C語言常用庫函數(shù)有:數(shù)學(xué)函數(shù):#include"math.h”;字符函數(shù)和字符串函數(shù):#include"ctype.h“;#include"string.h";輸入輸出函數(shù):#include"stdio.h";動態(tài)分配函數(shù)和隨機(jī)函數(shù):#include"stdlib.h";C語言不僅提供了豐富的標(biāo)準(zhǔn)庫函數(shù)。還允許用戶建立自定義的函數(shù)。相關(guān)知識與技能1.函數(shù)的定義所有函數(shù)的地位都是平等的,它們在定義時都是平行的,任何函數(shù)不能定義在其它函數(shù)內(nèi)。函數(shù)定義的格式是:類型說明符函數(shù)名(形式參數(shù)列表){

函數(shù)體(包含說明部分和語句部分)}(1)函數(shù)名:注意見名識意,函數(shù)名一般采用Pascal命名規(guī)范。(2)形參:為了實(shí)現(xiàn)函數(shù)的功能,必須有的原始輸入數(shù)據(jù),應(yīng)該設(shè)置為形參。注意每個形參都必須有類型說明,哪怕所有形參都屬于同一類型。注意:在定義函數(shù)時,可以認(rèn)為這些形參已經(jīng)有值了,不要在函數(shù)內(nèi)為它們輸入值或賦值。因?yàn)樗鼈兊闹?,在進(jìn)行函數(shù)調(diào)用時,會由實(shí)參傳遞過來。相關(guān)知識與技能(3)類型說明符:表示函數(shù)返回值的類型,若函數(shù)不返回1個確定的值,則返回類型為void,默認(rèn)的返回值類型為int。如果函數(shù)中return語句的表達(dá)式類型與所定義的函數(shù)類型不同,以函數(shù)的類型說明符為準(zhǔn)。(4)函數(shù)體:包含了實(shí)現(xiàn)函數(shù)功能所必須的中間變量定義和相關(guān)語句。如果函數(shù)有1個確定的返回值,必需用return語句返回;否則,若返回類型為void,可以沒有此語句,或者寫1個空return語句(return;)。2.函數(shù)的調(diào)用main()函數(shù)是主函數(shù),它可以調(diào)用其他函數(shù),而不允許被其他函數(shù)調(diào)用,其它的函數(shù)都是可以被調(diào)用的。程序執(zhí)行時總是從主函數(shù)開始,完成對其他函數(shù)的調(diào)用后再返回主函數(shù),在主函數(shù)中結(jié)束整個程序的運(yùn)行。1個C程序有且只能有1個main()函數(shù)。函數(shù)調(diào)用表達(dá)式的格式是:函數(shù)名(實(shí)際參數(shù)列表)。相關(guān)知識與技能其中,實(shí)參與函數(shù)定義時的形參必須在數(shù)量、順序、類型上完全一致。函數(shù)的返回類型如果為空,則直接在此表達(dá)式后加分號,形成1個函數(shù)調(diào)用表達(dá)式語句。如果函數(shù)的返回類型不為空,則此表達(dá)式可以做為1個值,參與此返回類型的任何運(yùn)算。函數(shù)調(diào)用時,有2個關(guān)鍵的知識點(diǎn)必須正確理解:(1)函數(shù)調(diào)用流程的轉(zhuǎn)換C程序的執(zhí)行,一開始總是從main函數(shù)開始,當(dāng)遇到函數(shù)調(diào)用時,流程會從主調(diào)函數(shù)轉(zhuǎn)到子函數(shù),首先進(jìn)行參數(shù)傳遞,形參得到值后,開始逐條執(zhí)行子函數(shù)中的語句,當(dāng)遇到return語句時,流程再轉(zhuǎn)回主調(diào)函數(shù),如果函數(shù)的返回類型不為空,則返回值也被帶回到主調(diào)函數(shù),主調(diào)函數(shù)繼續(xù)執(zhí)行。注意,子函數(shù)中可以有多個return語句,但只要子函數(shù)中執(zhí)行到某1個return,就會立即返回。不存在執(zhí)行到多個return語句的情況。相關(guān)知識與技能主函數(shù)執(zhí)行函數(shù)調(diào)用參數(shù)傳遞子函數(shù)執(zhí)行遇到return語句

圖4-5函數(shù)調(diào)用流程函數(shù)調(diào)用時,流程的轉(zhuǎn)換如圖4-5所示。相關(guān)知識與技能(2)參數(shù)的傳遞

以上多次提到形參和實(shí)參,首先,必須知道它們的作用,其次,必須理解參數(shù)傳遞的內(nèi)在過程。

在函數(shù)定義中提到:為了實(shí)現(xiàn)函數(shù)的功能,必須有的原始輸入數(shù)據(jù),應(yīng)該設(shè)置為形參。形參是為了實(shí)現(xiàn)函數(shù)功能而必須有的原始條件。那么,實(shí)參就是在函數(shù)調(diào)用時,把外界的原始值傳遞給形參(也就是傳遞給函數(shù))的信使。函數(shù)是1個黑盒子,外界就是通過實(shí)參把原始數(shù)據(jù)傳送給形參,然后,函數(shù)就可以按設(shè)計(jì)功能得到結(jié)果。如果每次函數(shù)調(diào)用時,實(shí)參的值不同,那么,函數(shù)可以根據(jù)得到的不同的值,按照設(shè)計(jì)功能進(jìn)行運(yùn)算,得到不同的輸出值,而功能不變。這就是模塊化程序設(shè)計(jì)的核心理念:函數(shù)是個可復(fù)用的軟件組件,在不同的環(huán)境下,都可以按照設(shè)計(jì)功能得到結(jié)果。相關(guān)知識與技能形參和實(shí)參的作用如圖4-6所示。函數(shù)黑盒形參實(shí)參圖4-6函數(shù)實(shí)參形參關(guān)系圖相關(guān)知識與技能可見,實(shí)參必須是具備確定值的常量或變量或表達(dá)式,并且實(shí)參與形參必須在數(shù)量、順序、類型上完全一致。(3)值傳遞和地址傳遞當(dāng)實(shí)參和形參都是普通的變量時,實(shí)參就是把變量的值傳遞給形參,稱為值傳遞。此時,實(shí)參占用一套內(nèi)存單元,形參占用另一套內(nèi)存單元,實(shí)參把值傳遞給形參后,它們就再無關(guān)系,任何一方的變動都不會影響對方。從圖4-7可以清楚地理解這一過程。實(shí)參形參傳值圖4-7值傳遞過程相關(guān)知識與技能當(dāng)實(shí)參和形參都是數(shù)組名這樣的數(shù)據(jù)時,實(shí)參仍然是把自己的值傳遞給形參,但此時的值是1個地址,也就是說,實(shí)參把自己的地址傳遞給形參,稱為地址傳遞。如圖4-8所示,實(shí)參和形參是同一地址值,也就是指向同一段內(nèi)存單元,任何一方的變動就是另一方的變動,肯定是相互影響的。此時,在定義形參數(shù)組時,其類型必須與實(shí)參數(shù)組同,其長度不能大于實(shí)參數(shù)組,也可以省略其長度,因?yàn)?個數(shù)組是共用存儲單元的。

形參實(shí)參傳地址圖4-8地址傳遞過程任務(wù)實(shí)施

通過以上知識的學(xué)習(xí),項(xiàng)目組就可以實(shí)施學(xué)生成績添加和瀏覽的任務(wù)了。利用函數(shù)實(shí)現(xiàn)成績的添加和瀏覽。設(shè)計(jì)函數(shù)AddScore添加學(xué)生成績,并在main函數(shù)的管理員子菜單的添加成績的分支中,調(diào)用AddScore函數(shù),完成任務(wù)。設(shè)計(jì)函數(shù)ListScore瀏覽學(xué)生成績。在main函數(shù)的管理員子菜單的瀏覽成績的分支中,調(diào)用ListScore函數(shù),完成任務(wù)。任務(wù)實(shí)施1.學(xué)生成績添加:AddScore函數(shù)的設(shè)計(jì)和調(diào)用

此函數(shù),要實(shí)現(xiàn)整個班級C語言課程成績的輸入。因此,此函數(shù)需要的形參是數(shù)組,在子函數(shù)內(nèi)為形參數(shù)組輸入值,則實(shí)參數(shù)組也有值。所以返回值為void?!竞瘮?shù)設(shè)計(jì)】(1)函數(shù)名:AddScore

。(2)形參:1個整形數(shù)組,長度為N(在函數(shù)外指定一個常量來表示,#defineN30)。(3)返回類型:void。(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){ for(i=0;i<N;i++)Scanf(元素);}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體中需要1個循環(huán)變量i,用循環(huán)語句輸入形參數(shù)組所有元素的值。 voidAddScore(ints[]) {

int

i; for(i=0;i<N;i++)

scanf("%d",&s[i]); }【函數(shù)調(diào)用】在主函數(shù)中的菜單前面,定義長度為N的實(shí)參數(shù)組,作為實(shí)參,在管理員子菜單的成績添加分支內(nèi),以函數(shù)名(實(shí)參數(shù)組名)調(diào)用函數(shù)。 voidmain() {

intscore[N]; …… case1: AddScore(score); break; …… }運(yùn)行分析:形參數(shù)組得到值,就相當(dāng)于實(shí)參數(shù)組得到值。任務(wù)實(shí)施2.學(xué)生成績?yōu)g覽:ListScore函數(shù)的設(shè)計(jì)和調(diào)用此函數(shù),要實(shí)現(xiàn)整個班級C語言課程成績的輸出。因此,此函數(shù)需要的形參是數(shù)組,在子函數(shù)內(nèi)輸出形參數(shù)組,就是輸出實(shí)參數(shù)組。所以返回值為void。【函數(shù)設(shè)計(jì)】(1)函數(shù)名:ListScore

。(2)形參:1個整形數(shù)組,長度為N。(3)返回類型:void。(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){ for(i=0;i<N;i++)

printf(元素);}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體中需要1個循環(huán)變量i,用循環(huán)語句輸出形參數(shù)組所有元素的值。voidListScore(ints[]){

int

i; for(i=0;i<N;i++) {

printf("%d--Score:%d\t",i+1,s[i]); }}【函數(shù)調(diào)用】在主函數(shù)中,定義1個同長度為N的實(shí)參數(shù)組,作為實(shí)參,在管理員子菜單的成績?yōu)g覽分支內(nèi),以函數(shù)名(實(shí)參數(shù)組名)調(diào)用函數(shù)。voidmain(){

intscore[N]; …… case2: ListScore(score); break; ……}運(yùn)行分析:輸出形參數(shù)組s的值,就相當(dāng)于輸出實(shí)參數(shù)組得到score的值。任務(wù)拓展任務(wù)拓展1

試設(shè)計(jì)函數(shù)IsPrime判斷某個數(shù)是否為素數(shù),并輸出100以內(nèi)所有的素數(shù)。提示:素數(shù)指的是只能被1和自己整除的數(shù),1不是素數(shù)。分析討論

IsPrime函數(shù)的設(shè)計(jì)和調(diào)用:確定函數(shù)名:IsPrime;確定函數(shù)參數(shù)類型和傳值方式:一個int參數(shù),用于判斷任意整數(shù),因此是值傳遞;確定函數(shù)返回值類型:int(為素數(shù)返回1,否則返回0);確定函數(shù)中算法:先定義一個開關(guān)變量flag,初始化flag為1。然后利用for循環(huán),依次將2到num-1的所有數(shù)來整除num,如果一旦有數(shù)能夠整除num,就將flag賦值為0,并利用break語句退出for循環(huán)。最后returnflag,如果flag的值為1,num就是素數(shù),否則如果flag的值為0,num就不是素數(shù)。確定函數(shù)調(diào)用:在主函數(shù)中調(diào)用,利用for循環(huán)窮舉調(diào)用IsPrime函數(shù),若是素數(shù)則輸出。實(shí)施代碼:int

IsPrime(int

num){

int

i,flag=1; for(i=2;i<num;i++) { if(num%i==0) { flag=0; break; } } returnflag;}

#include<stdio.h>voidmain(){

int

i; for(i=2;i<=100;i++) if(IsPrime(i)) printf("%disprime\t",i);}任務(wù)拓展

跳出循環(huán)經(jīng)常用到的是break語句和continue語句,但是這兩種語句是有區(qū)別的。break語句:用于跳出switch語句或循環(huán)語句。經(jīng)常與if語句一起使用,滿足條件時跳出循環(huán),只能跳出其所在的那一層循環(huán)。continue語句:結(jié)束本次循環(huán),跳過循環(huán)體中剩余的語句,直接執(zhí)行下1次循環(huán)。

在本任務(wù)的實(shí)施中,用到了break語句,用來跳出for循環(huán),從而減少循環(huán)次數(shù)。而在函數(shù)調(diào)用時,由于函數(shù)的返回類型是整數(shù),函數(shù)是作為if語句的判斷條件進(jìn)行調(diào)用的。主函數(shù)中,利用for語句判斷2到100之間的所有數(shù)是否是素數(shù),如果函數(shù)返回1,則輸出是素數(shù),否則,則不輸出。任務(wù)拓展2.任務(wù)拓展2

試設(shè)計(jì)函數(shù)IsShuiXianHua判斷某數(shù)是否為水仙花數(shù),并求所有的水仙花數(shù)。提示:一個三位數(shù),每一位數(shù)字的立方和等于該數(shù)本身,這個三位數(shù)就是水仙花數(shù)。分析討論:

IsShuiXianHua函數(shù)的設(shè)計(jì)和調(diào)用:

(1)確定函數(shù)名:IsShuiXianHua;

(2)確定函數(shù)參數(shù)類型和傳值方式:一個int參數(shù),用于判斷任意三位數(shù),因此是值傳遞;

(3)確定函數(shù)返回值類型:int(為水仙花數(shù)返回1,否則返回0);

(4)確定函數(shù)中算法:判斷形參m是否是水仙花數(shù),首先取出m的百、十、個三位數(shù)字放到變量m1,m1,m3中。然后計(jì)算三位數(shù)字的立方和并賦值到變量n中。最后判斷m和n是否相等,如果相等就返回1,否則返回0;

(5)確定函數(shù)調(diào)用:在主函數(shù)中調(diào)用,利用for循環(huán)窮舉調(diào)用IsPrime函數(shù),若是素數(shù)則輸出。任務(wù)拓展任務(wù)拓展實(shí)施代碼:int

IsShuiXianHua(intm){

intm,m1,m2,m3,n; m1=m/100; m2=m/10%10; m3=m%10; n=m1*m1*m1+m2*m2*m2+m3*m3*m3; if(m==n) return1; else return0;

}

#include<stdio.h>voidmain(){

int

i; for(i=100;i<=999;i++) if(IsShuiXianHua(i)) printf("%disShuiXianHua\t",i);}任務(wù)拓展在本任務(wù)的實(shí)施中,在函數(shù)的設(shè)計(jì)中,主要運(yùn)用了各種運(yùn)算符進(jìn)行運(yùn)算。而在函數(shù)調(diào)用時,由于函數(shù)的返回類型是整數(shù),函數(shù)也是作為if語句的判斷條件進(jìn)行調(diào)用的。主函數(shù)中,利用for語句判斷100到999之間的所有的三位數(shù)是否是水仙花數(shù),如果函數(shù)返回1,則輸出是水仙花數(shù),否則,則不輸出。任務(wù)拓展3.任務(wù)拓展3

試設(shè)計(jì)函數(shù)IsLeapYear判斷某年是否為閏年,并輸出21世紀(jì)所有的閏年。提示:閏年指的是能被4整除但不能被100整除,或者能被400整除的年份。

分析討論:

IsLeapYear函數(shù)的設(shè)計(jì)和調(diào)用:

(1)確定函數(shù)名:IsLeapYear;

(2)確定函數(shù)參數(shù)類型和傳值方式:一個int參數(shù),用于判斷任意年份,因此是值傳遞;

(3)確定函數(shù)返回值類型:int(為閏年返回1,否則返回0);

(4)確定函數(shù)中算法:先定義一個標(biāo)志變量flag,初始化為0。然后判斷形參y是否是閏年(能被4整除但不能被100整除,或者能被400整除)。若是,flag賦值為1,如果flag的值為1,y就是閏年,否則如果flag的值為0,y就不是閏年。

(5)確定函數(shù)調(diào)用:在主函數(shù)中調(diào)用,利用for循環(huán)窮舉調(diào)用IsLeapYear函數(shù),若是閏年則輸出。任務(wù)拓展實(shí)施代碼:#include<stdio.h>int

IsLeapYear(inty){

intflag=0; if(y%4==0&&y%100!=0||y%400==0) flag=1;returnflag;}voidmain(){

inty; for(y=2000;y<=2099;y++) if(IsLeapYear(y))

printf("%disleapyear!\n",y);}任務(wù)拓展在本任務(wù)的實(shí)施中,在函數(shù)的設(shè)計(jì)中,設(shè)計(jì)了一個標(biāo)識變量flag,假設(shè)當(dāng)值為1時,表示該年份是閏年,值為0時,表示該年份不是閏年。而在函數(shù)調(diào)用時,由于函數(shù)的返回類型是整數(shù),函數(shù)也是作為if語句的判斷條件進(jìn)行調(diào)用的。主函數(shù)中,利用for語句判斷2000到2099之間的所有的年份是否是閏年,如果函數(shù)返回1,則輸出是閏年,否則,則不輸出。任務(wù)4-1:學(xué)生成績添加和瀏覽任務(wù)4-2:學(xué)生成績統(tǒng)計(jì)任務(wù)4-3:學(xué)生成績排序任務(wù)4-4:學(xué)生成績查詢模塊四學(xué)生成績管理掌握一維數(shù)組的定義和應(yīng)用;掌握循環(huán)結(jié)構(gòu)for語句的應(yīng)用;掌握自定義函數(shù)的定義和調(diào)用過程;掌握一維數(shù)組的求最值、平均等統(tǒng)計(jì)算法;掌握一維數(shù)組的冒泡排序、選擇排序算法;掌握一維數(shù)組的順序查找、折半查找算法;掌握二維數(shù)組的定義和應(yīng)用。任務(wù)4-2學(xué)生成績統(tǒng)計(jì)任務(wù)描述與分析上個任務(wù)我們每個項(xiàng)目組已經(jīng)完成了學(xué)生成績的添加和瀏覽,現(xiàn)在周老師想對學(xué)生成績做一些統(tǒng)計(jì)工作,如:求最高分、最低分、平均分、及格率、各分?jǐn)?shù)段人數(shù)占全體學(xué)生數(shù)的比率等。

任務(wù)實(shí)現(xiàn)效果如圖4-9所示。系統(tǒng)運(yùn)行時,首先進(jìn)入主菜單,然后選擇1以管理員身份進(jìn)入管理員子菜單。選擇3,實(shí)現(xiàn)求班級成績最高分功能,輸出班級成績的最高分。接著選擇4,實(shí)現(xiàn)求班級成績最低分功能,輸出班級成績的最低分。接著選擇5,實(shí)現(xiàn)求班級成績的平均分功能,接著選擇6,實(shí)現(xiàn)求班級成績的及格率功能,輸出班級成績的及格率,再接著選擇7,實(shí)現(xiàn)求各分?jǐn)?shù)段人數(shù)占全體學(xué)生數(shù)的比率,輸出各分?jǐn)?shù)段所占比率。任務(wù)描述任務(wù)描述與分析

任務(wù)描述

上個任務(wù)我們已經(jīng)學(xué)習(xí)了一維數(shù)組的定義、引用和初始化,下面我們利用已學(xué)知識來對一維數(shù)組進(jìn)行應(yīng)用。

例如:從鍵盤輸入10個整型數(shù)據(jù),找出其中的最大值并輸出。

(1)設(shè)計(jì)函數(shù),利用循環(huán)輸入10個整型數(shù)據(jù),給數(shù)組元素賦值。voidinput(ints[]){ //輸入10個整型數(shù)據(jù)

int

i;

printf(“請輸入10個整數(shù):”); for(i=0;i<10;i++)

scanf(“%d”,&s[i]);}

4-2-1一維數(shù)組的應(yīng)用相關(guān)知識與技能

(2)設(shè)計(jì)函數(shù),找出最大值。假設(shè)最大值為首元素,然后用循環(huán)語句,將其余元素與之比較,適時調(diào)整最大值。即可求出整個數(shù)組的最大值。intMax(ints[]){ //找出最大值 inti,max; max=s[0];//假設(shè)最大值為首元素 for(i=1;i<M;i++) if(s[i]>max) max=s[i]; returnmax;}(3)函數(shù)調(diào)用,輸出最大值。voidmain(){ inta[10],max; input(a); max=Max(a); printf(“max=%d\n”,max);}4-2-1一維數(shù)組的應(yīng)用相關(guān)知識與技能任務(wù)實(shí)施1.求最高分:MaxScore函數(shù)的設(shè)計(jì)和調(diào)用【功能描述】

此函數(shù),要求出整個數(shù)組中的最大值。因此,此函數(shù)需要的形參是數(shù)組,在函數(shù)

內(nèi)求出最大值,所以返回值為最大值,是int型。【函數(shù)設(shè)計(jì)】(1)函數(shù)名:MaxScore。(2)形參:1個整形數(shù)組,長度為N(在函數(shù)外指定一個常量來表示,#defineN30)。(3)返回類型:int(4)函數(shù)原型:

函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]) { max=首元素; for(i=1;i<N;i++)

用if語句判斷,若當(dāng)前元素大于max,則max賦值為當(dāng)前元素 returnmax; } 任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體中設(shè)最大值為首元素,然后用循環(huán)語句,將其余元素與之比較,適時調(diào)整最大值。即可求出整個數(shù)組的最大值。intMaxScore(ints[]){ inti,max; max=s[0]; for(i=1;i<N;i++) if(max<s[i]) max=s[i]; returnmax;}

任務(wù)實(shí)施【函數(shù)調(diào)用】在主函數(shù)中,用已有值的成績數(shù)組,作為實(shí)參,在管理員子菜單的成績統(tǒng)計(jì)分支內(nèi),調(diào)用函數(shù)voidmain(){ intscore[N]; …… case3: MaxScore(score); break; ……}任務(wù)實(shí)施2.求最低分:MinScore函數(shù)的設(shè)計(jì)和調(diào)用此函數(shù),要求出整個數(shù)組中的最小值。因此,此函數(shù)需要的形參是數(shù)組,在函數(shù)內(nèi)求出最小值,所以返回值為最小值,是int型。【函數(shù)設(shè)計(jì)】(1)函數(shù)名:MinScore;(2)形參:1個整形數(shù)組,長度為N;(3)返回類型:int;(4)函數(shù)原型:

函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]) { min=首元素; for(i=1;i<N;i++)

用if語句判斷,若當(dāng)前元素小于min,則min賦值為當(dāng)前元素 returnmin; }

任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體中需要1個循環(huán)變量i,1個存放最小值的變量min。設(shè)最小值為首元素,然后用循環(huán)語句,將其余元素與之比較,適時調(diào)整最小值。即可求出整個數(shù)組的最小值。intMinScore(ints[]){ inti,min; min=s[0]; for(i=1;i<M;i++) if(s[i]<min) min=s[i]; returnmin;}任務(wù)實(shí)施【函數(shù)調(diào)用】在主函數(shù)中,用已有值的成績數(shù)組,作為實(shí)參,在管理員子菜單的成績統(tǒng)計(jì)分支內(nèi),輸出:函數(shù)名(實(shí)參數(shù)組名)的函數(shù)調(diào)用表達(dá)式。voidmain(){ intscore[N]; …… case4: MinScore(score); break; ……}

任務(wù)實(shí)施3.求平均分:AvgScore函數(shù)的設(shè)計(jì)和調(diào)用此函數(shù),要求出整個數(shù)組的平均值。因此,此函數(shù)需要的形參是數(shù)組,在函數(shù)內(nèi)求出平均值,所以返回值為平均值,是float型?!竞瘮?shù)設(shè)計(jì)】(1)函數(shù)名:AvgScore。(2)形參:1個整形數(shù)組,長度為N。(3)返回類型:float(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){ sum=0; for(i=1;i<N;i++)

把當(dāng)前元素值累加到sum中; average的值為sum除以數(shù)組元素個數(shù) returnaverage;} 任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體中需要1個循環(huán)變量i,1個存放數(shù)組和的變量sum。假設(shè)數(shù)組中所有元素的和為0,然后用循環(huán)語句,將所有數(shù)組元素都累加到數(shù)組和里,用數(shù)組和除以數(shù)組元素個數(shù)。即可求出整個數(shù)組的平均值。floatAvgScore(ints[]){ inti,sum=0; floataverage; for(i=0;i<M;i++) sum+=s[i]; average=sum*1.0/M; returnaverage;}任務(wù)實(shí)施【函數(shù)調(diào)用】在主函數(shù)中,用已有值的成績數(shù)組,作為實(shí)參,在管理員子菜單的成績統(tǒng)計(jì)分支內(nèi),以函數(shù)名(實(shí)參數(shù)組名)調(diào)用函數(shù)。voidmain(){ intscore[N]; …… case5: AvgScore(score); break; ……}

任務(wù)實(shí)施4.求及格率:PassRate函數(shù)的設(shè)計(jì)和調(diào)用此函數(shù),要求出整個數(shù)組中值大于等于60的元素所占的比率。因此,此函數(shù)需要的形參是數(shù)組,在函數(shù)內(nèi)求出該比率,所以返回值為浮點(diǎn)型?!竞瘮?shù)設(shè)計(jì)】(1)函數(shù)名:PassRate。(2)形參:1個整形數(shù)組,長度為N。(3)返回類型:double(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){ num=0; for(i=0;i<N;i++)

用if語句判斷,若當(dāng)前元素大于等于60,則num++; returnnum*1.0/N;}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體中的中間變量:需要1個循環(huán)變量i,1個存放計(jì)數(shù)值的變量num。函數(shù)體中用循環(huán)語句,將值大于等于60的元素進(jìn)行計(jì)數(shù)。循環(huán)結(jié)束后,將此數(shù)÷數(shù)組總個數(shù),即可返回。doublePassRate(ints[]){ inti,num=0; for(i=0;i<N;i++) if(s[i]>=60) num++; returnnum*1.0/N;}任務(wù)實(shí)施【函數(shù)調(diào)用】在主函數(shù)中,用已有值的成績數(shù)組,作為實(shí)參,在管理員子菜單的成績統(tǒng)計(jì)分支內(nèi),以函數(shù)名(實(shí)參數(shù)組名)調(diào)用函數(shù)。注意輸出時的格式控制,要輸出67%這樣的格式。voidmain(){ intscore[N]; …… case6: PassRate(score); break; ……}

任務(wù)實(shí)施5.求各分?jǐn)?shù)段人數(shù)占全體學(xué)生數(shù)的比率:SegScore函數(shù)的設(shè)計(jì)和調(diào)用此函數(shù),要求出數(shù)組中,每10分一段,各分?jǐn)?shù)段學(xué)生的人數(shù),以及此段元素的數(shù)目占總數(shù)目的比率。因此,此函數(shù)需要的形參是數(shù)組、以及分?jǐn)?shù)段的首尾值,在函數(shù)內(nèi)求出該分?jǐn)?shù)段所占比率,所以返回值為該分?jǐn)?shù)段所占比率,是float型?!竞瘮?shù)設(shè)計(jì)】(1)函數(shù)名:SegScore。(2)形參:1個整形數(shù)組,長度為N。兩個整型分別是某分?jǐn)?shù)段的首尾值。(3)返回類型:float(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N],整型分?jǐn)?shù)段的起始值,整型,分?jǐn)?shù)段的終止值){ num初始化為0; for(i=0;i<N;i++)

如果當(dāng)前元素在分?jǐn)?shù)段內(nèi),num++;}

任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體需要1個循環(huán)變量i,1個存放計(jì)數(shù)值的變量num。函數(shù)體中用循環(huán)語句,將某分?jǐn)?shù)段的元素進(jìn)行計(jì)數(shù)。循環(huán)結(jié)束后,將計(jì)算的個數(shù)÷數(shù)組總個數(shù),即可輸出。floatSegScore(ints[M],inta,intb){ inti,num=0; floatp=0; for(i=0;i<M;i++) { if(b==100) { if(s[i]>=a&&s[i]<=b) num++; } elseif(s[i]>=a&&s[i]<b)

num++; } p=num*1.0/M; returnp;}任務(wù)實(shí)施【函數(shù)調(diào)用】在主函數(shù)中,用循環(huán)將各分?jǐn)?shù)段比率分別計(jì)算輸出,用已有值的成績數(shù)組和分?jǐn)?shù)段的首尾值作為實(shí)參,在管理員子菜單的成績統(tǒng)計(jì)分支內(nèi),以函數(shù)名(實(shí)參數(shù)組名,分?jǐn)?shù)段的起始值,分?jǐn)?shù)段的終止值)調(diào)用函數(shù)。voidmain(){ intscore[N]; …… case6: for(i=0;i<10;i++) printf("%d--%d之間的比率為%.0f%%\n",i*10,(i+1)*10, SegScore(score,i*10,(i+1)*10)*100); break; ……}任務(wù)拓展1.任務(wù)拓展1每個項(xiàng)目組目前已完成了成績的添加和瀏覽,以及成績的統(tǒng)計(jì)。接下來,周老師說班級共30名同學(xué),分成五個項(xiàng)目組,每組6人,我想知道班級C語言成績的最高分。我們可以使用二維數(shù)組來存放班級同學(xué)的C語言成績,每一行存放一組同學(xué)的成績,我們就需要使用到二維數(shù)組。下面我們介紹一下二維數(shù)組的相關(guān)知識。(1)二維數(shù)組定義二維數(shù)組定義的一般形式是:類型說明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]。其中常量表達(dá)式1表示第一維下標(biāo)的長度,常量表達(dá)式2表示第二維下標(biāo)的長度。例如,inta[3][4];說明了一個三行四列的數(shù)組,數(shù)組名為a,其下標(biāo)變量的類型為整型。該數(shù)組的下標(biāo)變量共有3×4個,即:

a[0]a[0][0],a[0][1],a[0][2],a[0][3] a[1]a[1][0],a[1][1],a[1][2],a[1][3] a[2]a[2][0],a[2][1],a[2][2],a[2][3]

二維數(shù)組又稱為數(shù)組的數(shù)組,數(shù)組a可以看成長度為3的一維數(shù)組,三個數(shù)組元素分別為a[0],a[1],a[2]。其中a[0],a[1],a[2]又分別是長度為4的一維數(shù)組。任務(wù)拓展1.任務(wù)拓展1(2)二維數(shù)組的初始化例如:按行分段賦值可寫為:

inta[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};按行連續(xù)賦值可寫為:

inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};如對全部元素賦初值,則第一維的長度可以不給出。

例如,

inta[3][3]={1,2,3,4,5,6,7,8,9};可以寫為:inta[][3]={1,2,3,4,5,6,7,8,9};可以只對部分元素賦初值未賦初值的元素自動取0值。

例如,

inta[3][3]={{1},{2},{3}};是對每一行的第一列元素賦值,未賦值的元素取0值。元素如下所示:

100 200 300任務(wù)拓展(3)二維數(shù)組元素的引用

二維數(shù)組元素的引用形式:數(shù)組名[下標(biāo)][下標(biāo)]。

例如,a[3][4],表示a數(shù)組第四行第五列的元素。

有了以上相關(guān)知識,我們來完成我們的任務(wù),試設(shè)計(jì)函數(shù)MaxScore,求出最高分。MaxScore函數(shù)的設(shè)計(jì)和調(diào)用:1)確定函數(shù)名:MaxScore;2)確定函數(shù)參數(shù)類型和傳值方式:一個int類型的二維數(shù)組a,用于存放每一項(xiàng)目組的學(xué)生成績,因此是地址傳遞;3)確定函數(shù)返回值類型:int(返回最高分);4)確定函數(shù)中算法:假設(shè)最小的數(shù)max為a[0][0],循環(huán)掃描每一行i每一列j,將該行該列的元素與max比較,如果a[i][j]>max則max=a[i][j]。5)確定函數(shù)調(diào)用:在主函數(shù)中調(diào)用,返回值就是最高分,打印輸出該返回值。任務(wù)拓展實(shí)施代碼:在本任務(wù)的實(shí)施中,在函數(shù)的設(shè)計(jì)中,假設(shè)最大數(shù)max為a[0][0],用兩重循環(huán)掃描每一行i每一列j,將該行該列的元素與max比較,如果a[i][j]>max則max=a[i][j]。而在函數(shù)調(diào)用時,由于函數(shù)的返回類型是整數(shù),直接打印輸出,輸出的結(jié)果就是最高分。任務(wù)4-3學(xué)生成績排序任務(wù)描述與分析

每個項(xiàng)目組完成了學(xué)生成績簡單的統(tǒng)計(jì)查詢。接下來周老師要求每個項(xiàng)目實(shí)現(xiàn)成績排序功能,把班級學(xué)生C語言成績從高分到低分依次排列。

任務(wù)實(shí)現(xiàn)的效果如圖4-10和4-11所示。系統(tǒng)運(yùn)行時首先進(jìn)入主界面,然后選擇1以管理員身份進(jìn)入管理員子菜單。選擇1,添加班級學(xué)生成績,輸入30名同學(xué)的C語言成績。接著再次選擇8,實(shí)現(xiàn)成績排序功能,從高分到低分依次輸出學(xué)號和C語言成績。任務(wù)描述任務(wù)描述與分析圖4-10班級成績添加實(shí)現(xiàn)效果圖4-11班級成績序效果任務(wù)描述與分析任務(wù)分析要完成這個任務(wù),周老師要給項(xiàng)目組的同學(xué)們分析一下需要掌握哪些知識。學(xué)生的成績都是存放在一維整型數(shù)組中的,要將成績從高分到低分進(jìn)行排列,那么就必須要掌握對一維數(shù)組的排序相關(guān)知識。對一維數(shù)組進(jìn)行排序主要有冒泡排序和選擇排序兩種算法。相關(guān)知識與技能4-3-1冒泡排序

1.算法思想

冒泡排序是最簡單最常用的排序算法,它重復(fù)地走訪要排序的數(shù)組,將相鄰的兩個元素進(jìn)行比較,如果順序錯誤就把他們交換過來,直到?jīng)]有元素需要再交換,這樣數(shù)組就完成了排序。這個算法的名字由來是因?yàn)樵叫。ɑ蛟酱螅┑脑貢?jīng)交換慢慢“冒泡”到數(shù)組的末尾。2.排序過程

以對數(shù)組a[5]={76,71,82,63,94}從大到小進(jìn)行排序?yàn)槔M(jìn)行說明,如表4-1所示。表4-1冒泡排序過程

a[0]a[1]a[2]a[3]a[4]排序前7671826394第一輪7682719463第二輪8276947163第三輪8294767163第四輪9482767163相關(guān)知識與技能第一輪:將a[0]與a[1],a[1]與a[2],a[2]與a[3],a[3]與a[4]分別進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣最小的數(shù)就放在了a[4]的位置。第二輪:將a[0]與a[1],a[1]與a[2],a[2]與a[3]分別進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣次小的數(shù)就放在了a[3]的位置。第三輪:將a[0]與a[1],a[1]與a[2]分別進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣次小的數(shù)就放在了a[2]的位置。第四輪:將a[0]與a[1]進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣次小的數(shù)就放在了a[1]的位置,完成排序。相關(guān)知識與技能3.算法設(shè)計(jì)冒泡排序需要嵌套循環(huán),外層控制輪次,內(nèi)層控制比較的范圍。數(shù)組中有N個數(shù),那么共需進(jìn)行N-1輪排序,以i來表示進(jìn)行的輪次,i從1開始,到N-1結(jié)束。那么第i輪排序的過程是:將a[0]與a[1]、a[1]與a[2]……a[N-i-1]與a[N-i]分別進(jìn)行比較,如果順序錯誤,則進(jìn)行交互,也就是說內(nèi)層循環(huán)j從0到N-i-1結(jié)束。冒泡排序的流程圖如下圖4-12所示:圖4-12冒泡排序流程圖相關(guān)知識與技能4-3-2選擇排序1.算法思想每一趟從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€元素,放在已排好序的數(shù)列的最后,直到全部待排序的數(shù)據(jù)元素排完。選擇排序是不穩(wěn)定的排序方法。2.排序過程以對數(shù)組a[5]={76,71,82,63,94}從大到小進(jìn)行排序?yàn)槔M(jìn)行說明,如表4-2所示:

a[0]a[1]a[2]a[3]a[4]排序前7671826394第一輪9471826376第二輪9482716376第三輪9482766371第四輪9482767163表4-2選擇排序過程相關(guān)知識與技能第一輪:將a[0]與a[1]到a[4]范圍中的每個數(shù)進(jìn)行比較,如果a[0]小,則進(jìn)行交換,這樣最大的數(shù)就放到了a[0]位置。第二輪:將a[1]與到a[2]到a[4]范圍中的每個數(shù)進(jìn)行比較,如果a[1]小,則進(jìn)行交換,這樣次大的數(shù)就放到了a[1]位置。第三輪:將a[2]與a[3]到a[4]范圍中的每個數(shù)進(jìn)行比較,如a[2]小,則進(jìn)行交換,這樣次大的數(shù)就放到了a[2]位置。第四輪:將a[3]與a[4]到a[4]范圍中的每個數(shù)進(jìn)行比較,如果a[3]小,則進(jìn)行交換,這樣次大的數(shù)就放到了a[3]位置,完成排序。相關(guān)知識與技能3.算法設(shè)計(jì)選擇排序需要嵌套循環(huán),外層控制輪次,內(nèi)層控制選擇的范圍。數(shù)組中有N個數(shù),那么共需進(jìn)行N-1輪排序。以i來表示進(jìn)行的輪次,i從0開始,到N-2結(jié)束。那么第i輪排序的過程是:將a[i]與a[i+1]、a[i+2]到a[N-1]之間的數(shù)分別進(jìn)行比較,如果順序錯誤,則進(jìn)行交互,也就是說內(nèi)層循環(huán)j從i+1到N-1。選擇排序流程圖如圖4-13所示:圖4-13選擇排序流程圖任務(wù)實(shí)施

通過以上知識的學(xué)習(xí),項(xiàng)目組就可以實(shí)施學(xué)生成績排序的任務(wù)了。(1)設(shè)計(jì)冒泡排序函數(shù)SortA,并在main函數(shù)的管理員子菜單的成績排序的分支中,調(diào)用SortA函數(shù),完成任務(wù)。(2)設(shè)計(jì)選擇排序函數(shù)SortB,并在main函數(shù)的管理員子菜單的成績排序分支中,調(diào)用SortB函數(shù),完成任務(wù)。任務(wù)實(shí)施1.學(xué)生成績冒泡排序:SortA函數(shù)的設(shè)計(jì)與調(diào)用此函數(shù),要實(shí)現(xiàn)整個班級C語言課程成績的排序功能。因此,此函數(shù)需要的形參是數(shù)組,排序的結(jié)果還是在數(shù)組中,返回值類型為void。【函數(shù)設(shè)計(jì)】(1)函數(shù)名:SortA。(2)形參:1個整型數(shù)組,長度為N。(3)返回類型:void。(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){

for(i=1;i<N;i++)for(j=0;j<N-i;j++){...... }}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】交換過程中需要一個臨時變量,定義為temp,另外需要兩個循環(huán)變量i,j。外層循環(huán)變量i控制輪次,內(nèi)層循環(huán)變量控制比較的范圍。voidSortA(intcScore[N]){ inti,j,temp; for(i=1;i<N;i++) { for(j=0;j<N-i;j++) { if(cScore[j]<cScore[j+1]) { temp=cScore[j]; cScore[j]=cScore[j+1]; cScore[j+1]=temp; } } }}任務(wù)實(shí)施【函數(shù)調(diào)用】voidmain(){ intscore[N]; ...... case7: //調(diào)用冒泡排序函數(shù) SortA(score); ListScore(score); break; ......}任務(wù)實(shí)施2.學(xué)生成績選擇排序:SortB函數(shù)的設(shè)計(jì)與調(diào)用此函數(shù),要實(shí)現(xiàn)整個班級C語言課程成績的排序功能。因此,此函數(shù)需要的形參是數(shù)組,排序的結(jié)果還是在數(shù)組中,返回值類型為void?!竞瘮?shù)設(shè)計(jì)】(1)函數(shù)名:SortB。(2)形參:1個整型數(shù)組,長度為N。(3)返回類型:void。(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){ for(i=1;i<N;i++)for(j=0;j<N-I;j++){...... }}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】交換過程中需要一個臨時變量,定義為temp,另外需要兩個循環(huán)變量i,j。外層循環(huán)變量i控制輪次,內(nèi)層循環(huán)變量控制選擇的范圍。voidSortB(intcScore[N]){ inti,j,temp; for(i=0;i<N-1;i++) { for(j=i+1;j<N;j++){ if(cScore[i]<cScore[j]) { temp=cScore[j]; cScore[j]=cScore[i]; cScore[i]=temp; } } }}任務(wù)實(shí)施【函數(shù)調(diào)用】voidmain(){ intscore[N]; ...... case7: //調(diào)用選擇排序函數(shù) SortB(score); ListScore(score); break; ......}任務(wù)4-3學(xué)生成績排序任務(wù)描述與分析

每個項(xiàng)目組完成了學(xué)生成績簡單的統(tǒng)計(jì)查詢。接下來周老師要求每個項(xiàng)目實(shí)現(xiàn)成績排序功能,把班級學(xué)生C語言成績從高分到低分依次排列。

任務(wù)實(shí)現(xiàn)的效果如圖4-10和4-11所示。系統(tǒng)運(yùn)行時首先進(jìn)入主界面,然后選擇1以管理員身份進(jìn)入管理員子菜單。選擇1,添加班級學(xué)生成績,輸入30名同學(xué)的C語言成績。接著再次選擇8,實(shí)現(xiàn)成績排序功能,從高分到低分依次輸出學(xué)號和C語言成績。任務(wù)描述任務(wù)描述與分析圖4-10班級成績添加實(shí)現(xiàn)效果圖4-11班級成績序效果任務(wù)描述與分析任務(wù)分析要完成這個任務(wù),周老師要給項(xiàng)目組的同學(xué)們分析一下需要掌握哪些知識。學(xué)生的成績都是存放在一維整型數(shù)組中的,要將成績從高分到低分進(jìn)行排列,那么就必須要掌握對一維數(shù)組的排序相關(guān)知識。對一維數(shù)組進(jìn)行排序主要有冒泡排序和選擇排序兩種算法。相關(guān)知識與技能4-3-1冒泡排序

1.算法思想

冒泡排序是最簡單最常用的排序算法,它重復(fù)地走訪要排序的數(shù)組,將相鄰的兩個元素進(jìn)行比較,如果順序錯誤就把他們交換過來,直到?jīng)]有元素需要再交換,這樣數(shù)組就完成了排序。這個算法的名字由來是因?yàn)樵叫。ɑ蛟酱螅┑脑貢?jīng)交換慢慢“冒泡”到數(shù)組的末尾。2.排序過程

以對數(shù)組a[5]={76,71,82,63,94}從大到小進(jìn)行排序?yàn)槔M(jìn)行說明,如表4-1所示。表4-1冒泡排序過程

a[0]a[1]a[2]a[3]a[4]排序前7671826394第一輪7682719463第二輪8276947163第三輪8294767163第四輪9482767163相關(guān)知識與技能第一輪:將a[0]與a[1],a[1]與a[2],a[2]與a[3],a[3]與a[4]分別進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣最小的數(shù)就放在了a[4]的位置。第二輪:將a[0]與a[1],a[1]與a[2],a[2]與a[3]分別進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣次小的數(shù)就放在了a[3]的位置。第三輪:將a[0]與a[1],a[1]與a[2]分別進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣次小的數(shù)就放在了a[2]的位置。第四輪:將a[0]與a[1]進(jìn)行比較,如果前面的比后面的小就進(jìn)行交互,這樣次小的數(shù)就放在了a[1]的位置,完成排序。相關(guān)知識與技能3.算法設(shè)計(jì)冒泡排序需要嵌套循環(huán),外層控制輪次,內(nèi)層控制比較的范圍。數(shù)組中有N個數(shù),那么共需進(jìn)行N-1輪排序,以i來表示進(jìn)行的輪次,i從1開始,到N-1結(jié)束。那么第i輪排序的過程是:將a[0]與a[1]、a[1]與a[2]……a[N-i-1]與a[N-i]分別進(jìn)行比較,如果順序錯誤,則進(jìn)行交互,也就是說內(nèi)層循環(huán)j從0到N-i-1結(jié)束。冒泡排序的流程圖如下圖4-12所示:圖4-12冒泡排序流程圖相關(guān)知識與技能4-3-2選擇排序1.算法思想每一趟從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,放在已排好序的數(shù)列的最后,直到全部待排序的數(shù)據(jù)元素排完。選擇排序是不穩(wěn)定的排序方法。2.排序過程以對數(shù)組a[5]={76,71,82,63,94}從大到小進(jìn)行排序?yàn)槔M(jìn)行說明,如表4-2所示:

a[0]a[1]a[2]a[3]a[4]排序前7671826394第一輪9471826376第二輪9482716376第三輪9482766371第四輪9482767163表4-2選擇排序過程相關(guān)知識與技能第一輪:將a[0]與a[1]到a[4]范圍中的每個數(shù)進(jìn)行比較,如果a[0]小,則進(jìn)行交換,這樣最大的數(shù)就放到了a[0]位置。第二輪:將a[1]與到a[2]到a[4]范圍中的每個數(shù)進(jìn)行比較,如果a[1]小,則進(jìn)行交換,這樣次大的數(shù)就放到了a[1]位置。第三輪:將a[2]與a[3]到a[4]范圍中的每個數(shù)進(jìn)行比較,如a[2]小,則進(jìn)行交換,這樣次大的數(shù)就放到了a[2]位置。第四輪:將a[3]與a[4]到a[4]范圍中的每個數(shù)進(jìn)行比較,如果a[3]小,則進(jìn)行交換,這樣次大的數(shù)就放到了a[3]位置,完成排序。相關(guān)知識與技能3.算法設(shè)計(jì)選擇排序需要嵌套循環(huán),外層控制輪次,內(nèi)層控制選擇的范圍。數(shù)組中有N個數(shù),那么共需進(jìn)行N-1輪排序。以i來表示進(jìn)行的輪次,i從0開始,到N-2結(jié)束。那么第i輪排序的過程是:將a[i]與a[i+1]、a[i+2]到a[N-1]之間的數(shù)分別進(jìn)行比較,如果順序錯誤,則進(jìn)行交互,也就是說內(nèi)層循環(huán)j從i+1到N-1。選擇排序流程圖如圖4-13所示:圖4-13選擇排序流程圖任務(wù)實(shí)施

通過以上知識的學(xué)習(xí),項(xiàng)目組就可以實(shí)施學(xué)生成績排序的任務(wù)了。(1)設(shè)計(jì)冒泡排序函數(shù)SortA,并在main函數(shù)的管理員子菜單的成績排序的分支中,調(diào)用SortA函數(shù),完成任務(wù)。(2)設(shè)計(jì)選擇排序函數(shù)SortB,并在main函數(shù)的管理員子菜單的成績排序分支中,調(diào)用SortB函數(shù),完成任務(wù)。任務(wù)實(shí)施1.學(xué)生成績冒泡排序:SortA函數(shù)的設(shè)計(jì)與調(diào)用此函數(shù),要實(shí)現(xiàn)整個班級C語言課程成績的排序功能。因此,此函數(shù)需要的形參是數(shù)組,排序的結(jié)果還是在數(shù)組中,返回值類型為void?!竞瘮?shù)設(shè)計(jì)】(1)函數(shù)名:SortA。(2)形參:1個整型數(shù)組,長度為N。(3)返回類型:void。(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){

for(i=1;i<N;i++)for(j=0;j<N-i;j++){...... }}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】交換過程中需要一個臨時變量,定義為temp,另外需要兩個循環(huán)變量i,j。外層循環(huán)變量i控制輪次,內(nèi)層循環(huán)變量控制比較的范圍。voidSortA(intcScore[N]){ inti,j,temp; for(i=1;i<N;i++) { for(j=0;j<N-i;j++) { if(cScore[j]<cScore[j+1]) { temp=cScore[j]; cScore[j]=cScore[j+1]; cScore[j+1]=temp; } } }}任務(wù)實(shí)施【函數(shù)調(diào)用】voidmain(){ intscore[N]; ...... case7: //調(diào)用冒泡排序函數(shù) SortA(score); ListScore(score); break; ......}任務(wù)實(shí)施2.學(xué)生成績選擇排序:SortB函數(shù)的設(shè)計(jì)與調(diào)用此函數(shù),要實(shí)現(xiàn)整個班級C語言課程成績的排序功能。因此,此函數(shù)需要的形參是數(shù)組,排序的結(jié)果還是在數(shù)組中,返回值類型為void。【函數(shù)設(shè)計(jì)】(1)函數(shù)名:SortB。(2)形參:1個整型數(shù)組,長度為N。(3)返回類型:void。(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N]){ for(i=1;i<N;i++)for(j=0;j<N-I;j++){...... }}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】交換過程中需要一個臨時變量,定義為temp,另外需要兩個循環(huán)變量i,j。外層循環(huán)變量i控制輪次,內(nèi)層循環(huán)變量控制選擇的范圍。voidSortB(intcScore[N]){ inti,j,temp; for(i=0;i<N-1;i++) { for(j=i+1;j<N;j++){ if(cScore[i]<cScore[j]) { temp=cScore[j]; cScore[j]=cScore[i]; cScore[i]=temp; } } }}任務(wù)4-4學(xué)生成績查詢?nèi)蝿?wù)描述與分析

每個項(xiàng)目組完成了實(shí)現(xiàn)管理員子菜單中的班級成績添加、瀏覽、成績排序等功能。接下來,要實(shí)現(xiàn)學(xué)生子菜單中查詢指定成績的功能。因此,周老師要求每個項(xiàng)目組實(shí)現(xiàn)學(xué)生子菜單中的查詢指定成績的功能,即,輸入某個學(xué)生的成績,可以查詢到該成績對應(yīng)的學(xué)生的學(xué)號。

任務(wù)實(shí)現(xiàn)效果如圖4-15所示。系統(tǒng)運(yùn)行時,首先進(jìn)入主菜單,然后選擇2以學(xué)生身份進(jìn)入學(xué)生子菜單。選擇1,實(shí)現(xiàn)查詢指定成績功能,輸入某個同學(xué)的C語言成績,輸出該C語言成績對應(yīng)的學(xué)生的學(xué)號。任務(wù)描述任務(wù)描述與分析任務(wù)描述圖4-15查詢指定成績實(shí)現(xiàn)效果4-4-1順序查找算法1.算法思想:利用循環(huán)將數(shù)組中的數(shù)遍歷一遍,每訪問到一個數(shù),將該數(shù)與需查找的數(shù)比較,如果相等,則退出循環(huán)。判斷此時的下標(biāo)是否小于N,若小于,說明找到該數(shù),輸出該數(shù)對應(yīng)的下標(biāo)及該數(shù);若大于等于,說明未找到該數(shù)。2.算法設(shè)計(jì):順序查找需要循環(huán)來遍歷數(shù)組中的每一個數(shù)。數(shù)組中有N個數(shù),以i來表示比較元素的下標(biāo),i從0開始,到N-1結(jié)束。那么順序查找的過程是:將queryScore與a[0]、a[1]……a[N-1]分別進(jìn)行比較,如果相等,則已經(jīng)找到;如果循環(huán)結(jié)束還是沒有相等的,那么就是沒找到。順序查找的流程圖如下圖4-16所示:相關(guān)知識與技能圖4-16順序查找流程圖相關(guān)知識與技能

算法思想:折半查找法首先必須保證數(shù)組已是排好序的。其次將需要查找的數(shù)與中指針比較,如果被查數(shù)大,則將頭指針移到目前中指針,向后折半,繼續(xù)循環(huán);如果被查數(shù)小,則將尾指針移到目前中指針,向前折半,繼續(xù)循環(huán);如果被查數(shù)與中指針相等,則找到,輸出并跳出循環(huán);如果找不到,則頭會到尾的后面,所以循環(huán)的條件是頭<=尾。4-4-2折半查找算法(適用于已經(jīng)排好序的數(shù)組)相關(guān)知識與技能相關(guān)知識與技能圖4-17折半查找流程圖任務(wù)實(shí)施1.順序查找:SearchByScore函數(shù)的設(shè)計(jì)和調(diào)用此函數(shù),要實(shí)現(xiàn)在整個班級C語言課程成績中查找某個成績。因此,此函數(shù)需要的形參是數(shù)組與一個變量。由于主函數(shù)中要判斷是否找到該數(shù),所以在SearchByScore中設(shè)置若找到該數(shù),則返回該數(shù)對應(yīng)的下標(biāo)+1,即該查找成績對應(yīng)的學(xué)生學(xué)號,否則返回-1,因此該函數(shù)的返回類型是int?!竞瘮?shù)設(shè)計(jì)】(1)函數(shù)名:SearchByScore。(2)形參:1個整形數(shù)組,長度為N;一個整形變量(3)返回類型:int。(4)函數(shù)原型:函數(shù)返回類型函數(shù)名(整型

形參數(shù)組名[N],整形

變量名){ for(i=0;i<N;i++) { if(元素==變量) returni+1; } return-1;}任務(wù)實(shí)施【函數(shù)實(shí)現(xiàn)】函數(shù)體中需要1個循環(huán)變量i。intSearchByScore(ints[],intqueryScore){ inti; for(i=0;i<N;i++) { if(s[i]==queryScore) returni+1; } return-1;}任務(wù)實(shí)施【函數(shù)調(diào)用】在主函數(shù)的學(xué)生子菜單的成績查找分支內(nèi),以函數(shù)名(實(shí)參數(shù)組名)調(diào)用函數(shù)。voidmain(){ intscore[N]; …… case1: f=SearchByScore(score,queryScore); if(f==-1) printf("\n無此成績,請重新查詢!\n"); else printf("%d號的成績是%d\n",f,queryScore);

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論