項(xiàng)目四 學(xué)生成績的排序_第1頁
項(xiàng)目四 學(xué)生成績的排序_第2頁
項(xiàng)目四 學(xué)生成績的排序_第3頁
項(xiàng)目四 學(xué)生成績的排序_第4頁
項(xiàng)目四 學(xué)生成績的排序_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

項(xiàng)目四學(xué)生成績的排序項(xiàng)目要求一個(gè)班有40位學(xué)生參加了期終考試(考了三門課),現(xiàn)要按成績的高低輸出成績單。程序的運(yùn)行要求:(成績?nèi)我廨斎?,為了方便,假設(shè)只有五個(gè)同學(xué))項(xiàng)目分析從項(xiàng)目要求中可以看出,本項(xiàng)目首先需要輸入40個(gè)學(xué)生的姓名及三門課的成績;第二是求出每個(gè)同學(xué)的總分及平均分;第三要求對成績的總分高低進(jìn)行排序,并將排序結(jié)果輸出。從先簡單后復(fù)雜的原則出發(fā),所以,將這一項(xiàng)目分成解四個(gè)任務(wù)介紹,任務(wù)一是多個(gè)學(xué)生一門課成績的輸入/輸出;任務(wù)二是多個(gè)學(xué)生一門課成績的排序;任務(wù)三是學(xué)生姓名的輸入/輸出;任務(wù)四是多個(gè)學(xué)生多門成績的排序。任務(wù)1多個(gè)學(xué)生一門課成績的輸入、輸出一、問題情景一個(gè)班40位同學(xué)參加了一次數(shù)學(xué)考試,現(xiàn)要輸入全班同學(xué)的成績,并按逆序輸出。分析:全班一共有四十個(gè)同學(xué),顯然定義四十個(gè)簡單變量x1,x2,……x40,然后輸出是不科學(xué)的。因?yàn)槭悄嫘蜉敵觯蚨筝斎氲拿總€(gè)同學(xué)的成績都必須保存。那么如何解決這個(gè)問題呢?其實(shí),仔細(xì)分析一些,不難發(fā)現(xiàn)每個(gè)同學(xué)的成績都具有相同類型。這樣,就須引入了一個(gè)新的概念,即數(shù)組。二、具體實(shí)現(xiàn)#include"stdio.h“#defineN10main(){inti,score[N];printf("請輸入本班同學(xué)的成績:");for(i=0;i<N;i++)scanf("%d",&score[i]);printf("按逆序輸出本班同學(xué)的成績:");for(i=N-1;i>=0;i--)printf("%3d",score[i]);}程序運(yùn)行結(jié)果注:為了程序運(yùn)行方便,假設(shè)只有10人掌握的知識點(diǎn)為:首先是數(shù)組的定義;第二是數(shù)組的初始化;第三是數(shù)組的引用;三、相關(guān)知識(一)一維數(shù)組的定義和引用數(shù)組的意義和概念。1.一維數(shù)組的定義一維數(shù)組的定義方式為:類型說明符數(shù)組名[常量表達(dá)式];例如:inta[20];它表示數(shù)組名為a,該數(shù)組的長度為20,最多可以存放20個(gè)元素,每個(gè)元素均為int類型。說明:(1)數(shù)組名等同變量名,命名規(guī)則也與變量名一樣。對“intx;”,我們稱變量x,對“inta[20];”我們稱數(shù)組a。(2)數(shù)組名后是用方括號括起來的常量表達(dá)式。inta[3+5];charc[10];(3)常量表達(dá)式表示數(shù)組的長度,數(shù)組一經(jīng)定義,長度就固定不變,換言之,C語言不允許對數(shù)組的大小作動態(tài)定義,所以方括號括起來的是常量表達(dá)式,不可以是變量。下面這樣的定義是錯的:

intn=8;chara[n];三、相關(guān)知識(續(xù))(4)數(shù)組的下標(biāo)從0開始。例如:inta[20];表示定義了20個(gè)數(shù)組元素,分別為a[0]、a[1]、a[2]、a[3]、…a[19]。若要引用第i個(gè)元素,則可以表示成a[i]。(5)數(shù)組的類型實(shí)際上就是指數(shù)組元素的取值類型,對于同一數(shù)組,它所有元素的數(shù)據(jù)類型都是相同的;(6)數(shù)組名不能與其他變量名相同;例如:

main(){inta;floata[10];………..}是非法的!(7)允許在同一個(gè)類型說明中,定義多個(gè)數(shù)組和多個(gè)變量;例如:inta,b,c,d[10],e[5];2.一維數(shù)組的引用數(shù)組必須先定義,才能使用。數(shù)組元素的表示形式:數(shù)組名[下標(biāo)]下標(biāo)可以是常量、表達(dá)式、變量。例如a[3]、a[5-3]、a[i]【例4-1】數(shù)組元素的使用。輸入十個(gè)學(xué)生的成績,并將其輸出。#include"stdio.h"main(){inti,a[10];printf("輸入數(shù)組元素:");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("輸出數(shù)組元素:");for(i=0;i<10;i++)printf("%5d",a[i]);}程序結(jié)果如果,要求第一個(gè)學(xué)生的成績用下標(biāo)1表示,第二個(gè)學(xué)生的成績用下標(biāo)2表示,……第十個(gè)學(xué)生的成績用下標(biāo)10表示,則應(yīng)定義為inta[11]。輸入10個(gè)平時(shí)成績給a[1]到a[10]輸入10個(gè)期終成績給b[1]到b[10]for(i=0;i<10;i++)c[i]=0.4*a[i]+0.6*b[i];輸出總評成績c[1]直到c[10]【例4-2】求學(xué)生的總評成績?,F(xiàn)有十個(gè)學(xué)生,從鍵盤上輸入他們的平時(shí)成績、期終成績,輸出總評成績??傇u成績=平時(shí)成績*40%+期終成績*60%.#include"stdio.h"main(){inti;floata[11],b[11],c[11];printf("輸入平時(shí)成績:");for(i=1;i<=10;i++)scanf("%f",&a[i]);printf("輸入期終成績:");for(i=1;i<=10;i++)scanf("%f",&b[i]);for(i=1;i<=10;i++)c[i]=0.4*a[i]+0.6*b[i];printf("輸出總評成績:");for(i=1;i<=10;i++)printf("%5.1f",c[i]);printf("\n");}3.一維數(shù)組的初始化(1)定義數(shù)組時(shí)對數(shù)組元素賦以初值。intx[5]={1,2,3,4,5};等價(jià)于:x[0]=1;x[1]=2;…;x[4]=5;(2)可以只給一部分元素賦初值。intx[5]={1,2};系統(tǒng)自動給指定值的數(shù)組元素賦值:x[0]=1,x[1]=2,其他元素值均為0。(3)如果一個(gè)數(shù)組的全部元素值都為0,可以寫成:intx[5]={0,0,0,0,0};或intx[5]={0};(4)對全部元素賦初值時(shí),可以不指定長度。intx[5]={1,2,3,4,5};等價(jià)于intx[]={1,2,3,4,5};

但是,inta[10]={0,1,2,3,4};不能改寫為:inta[]={0,1,2,3,4};3.一維數(shù)組的初始化示例1:詳見s4-3.c

數(shù)組的定義、初始化、基本輸入輸出。示例2:詳見s4-4.c

數(shù)組元素的引用。示例3:詳見s4-5.c

用數(shù)組求4個(gè)數(shù)的最小值和最大值。示例4:詳見s4-6.c

產(chǎn)生100個(gè)1~50的隨機(jī)整數(shù),要求每行輸出10個(gè)數(shù)。任務(wù)2多個(gè)學(xué)生一門課成績的排序一、問題情景一個(gè)班40位同學(xué)參加了一次數(shù)學(xué)考試,現(xiàn)要輸入全班同學(xué)的成績,并按學(xué)生成績高低進(jìn)行排序。分析輸入40位同學(xué)的數(shù)學(xué)成績,我們在任務(wù)1中已學(xué)會,只要定義一個(gè)數(shù)組intmath[40],然后用一個(gè)循環(huán)輸入就行;而對學(xué)生成績進(jìn)行排序,可以看成是:先求最高分,然后求次高分,……一直到倒數(shù)第二個(gè)數(shù)找出為止。所以先要解決的是:求多個(gè)同學(xué)的最高分。然后再在剩下的分?jǐn)?shù)中找次高分,不斷重復(fù),直到剩下的最后一個(gè)數(shù)是最小數(shù)為止。比較法#include"stdio.h"#defineN10main(){inti,math[N],t,j;printf("請輸入多個(gè)同學(xué)的成績:");for(i=0;i<N;i++)scanf("%d",&math[i]);for(j=0;j<N-1;j++)//循環(huán)N-1次,就可以分離出前N-1個(gè)數(shù)for(i=j+1;i<N;i++)//分離第j個(gè)數(shù),則一定與第j+1至最后一個(gè)數(shù)比較if(math[j]<math[i]){t=math[j];math[j]=math[i];math[i]=t;}printf("多個(gè)同學(xué)的成績排序?yàn)椋?);for(i=0;i<10;i++)printf("%3d",math[i]);printf("\n");}冒泡法#include"stdio.h"#defineN10main(){inti,math[N],t,j;printf("請輸入多個(gè)同學(xué)的成績:");for(i=0;i<N;i++)scanf("%d",&math[i]);for(j=0;j<N-1;j++)for(i=0;i<N-1-j;i++)if(math[i]<math[i+1]){t=math[i];math[i]=math[i+1];math[i+1]=t;}printf("多個(gè)同學(xué)的成績排序?yàn)椋?);for(i=0;i<10;i++)printf("%3d",math[i]);printf("\n");}三、相關(guān)知識(一)根據(jù)問題情景中的剖析,首先要解決的第一個(gè)問題是求最高分?!纠?-3】求本班同學(xué)的最高分,并將它與第一位數(shù)互換。分析:首先是輸入十個(gè)成績給math[0]到math[9](為了程序運(yùn)行方便,假設(shè)只有十個(gè)同學(xué))第二步是math[0]與math[1]比較,如果math[0]<math[1],則math[0]與math[1]兩數(shù)互相交換。第三步是math[0]與math[2]比較,如果math[0]<math[2],則math[0]與math[2]兩數(shù)互相交換。不斷重復(fù),直到math[0]與math[9]比較,如果math[0]<math[9],則math[0]與math[9]兩數(shù)互相交換。經(jīng)過上述過程后的math[0]就是最高分了。#include"stdio.h"main(){inti,math[10],t;printf("請輸入本班同學(xué)的成績:");for(i=0;i<10;i++)scanf("%d",&math[i]);for(i=1;i<10;i++)if(math[0]<math[i]){t=math[0];math[0]=math[i];math[i]=t;}printf("本班同學(xué)中的最高分:");printf("%d\n",math[0]);}(二)根據(jù)問題情景中的剖析,解決第二個(gè)問題,即排序?!纠?-4】多個(gè)學(xué)生一門成績的排序(比較法)。分析:上例已求出了多個(gè)學(xué)生成績的最高分,顯然,再在剩下的數(shù)中執(zhí)行程序,則可以求出次高分;for(i=2;i<10;i++)if(math[1]<math[i]){t=math[1];math[1]=math[i];math[i]=t;}若原先有十個(gè)數(shù),則重復(fù)九次就可以達(dá)到排序的目的,也就是再嵌套一個(gè)循環(huán)。

#include"stdio.h"main(){inti,math[10],t,j;printf("請輸入多個(gè)同學(xué)的成績:");for(i=0;i<10;i++)scanf("%d",&math[i]);for(j=0;j<9;j++)

/*循環(huán)九次,就可以分離出前九個(gè)數(shù)*/for(i=j+1;i<10;i++)/*分離第j個(gè)數(shù),則一定與第j+1至最后一個(gè)數(shù)比較*/if(math[j]<math[i]){t=math[j];math[j]=math[i];math[i]=t;}printf("多個(gè)同學(xué)的成績排序?yàn)椋?);for(i=0;i<10;i++)printf("%3d",math[i]);printf("\n");}【例4-5】多個(gè)學(xué)生一門成績的排序。(用冒泡法排序)分析:冒泡法:顧名思義,像水中冒泡一樣,水泡越大,則它浮上水面的速度就越快。思路:將相鄰兩個(gè)數(shù)比較,將小的調(diào)到后頭。例如,對18,9,1,2,6按從大到小的順序排序。(1)先將18,9比較,因?yàn)?8>9,所以18與9不交換。即數(shù)還是18,9,1,2,6;(2)將9與1比較,因?yàn)?>1,所以9與1不交換。即數(shù)還是18,9,1,2,6;(3)將1與2比較,因?yàn)?<2,所以1與2交換。即18,9,2,1,6(4)將1與6比較,因?yàn)?<6,所以1與6交換。即18,9,2,6,1for(i=0;i<4;i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}經(jīng)過以上四步,就將最小數(shù)1沉在最下面了。接下來所要做的就是在剩下的四個(gè)數(shù)18,9,2,6中挑出小數(shù)就行.顯然只要比較三次,就可以完成。即:

for(i=0;i<3;i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}再接下來就是在在剩下的三個(gè)數(shù)18,9,6中挑出小數(shù)就行,顯然只要比較二次,就可以完成。即:for(i=0;i<2;i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}最后,在剩下的二個(gè)數(shù)18,9中挑出大數(shù)就行,顯然只要比較一次,就可以完成。即:for(i=0;i<1;i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}總結(jié):也就是再嵌套一個(gè)循環(huán)就行。即:for(j=0;j<4;j++)for(i=0;i<4-j;i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}所以,多個(gè)學(xué)生成績的排序用冒泡法程序表示成:#include"stdio.h"main(){inti,math[10],t,j;printf("請輸入多個(gè)同學(xué)的成績:");for(i=0;i<10;i++)scanf("%d",&math[i]);for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(math[i]<math[i+1]){t=math[i];math[i]=math[i+1];math[i+1]=t;}printf("多個(gè)同學(xué)的成績排序?yàn)椋?);for(i=0;i<10;i++)printf("%3d",math[i]);printf("\n");}(三)一維數(shù)組實(shí)例main(){intj,k,fa[20];fa[0]=1;fa[1]=1;for(j=2;j<20;j++)fa[j]=fa[j-1]+fa[j-2];for(j=0;j<20;j++)printf(“%d,”,fa[j]);}程序結(jié)果【例4-6】求出斐波那契數(shù)列的前20項(xiàng)并輸出。(前兩項(xiàng)為1,從第三項(xiàng)開始每一項(xiàng)是前兩項(xiàng)的和)分析:因?yàn)橛?0項(xiàng),所以定義一個(gè)數(shù)組intfa[20],由題意知fa[0]=1;fa[1]=1,后面的項(xiàng)就可以用一個(gè)循環(huán)表示。任務(wù)3學(xué)生姓名的輸入輸出一、問題情景一個(gè)班里有40個(gè)學(xué)生,在選舉班干部時(shí)有10個(gè)候選人,現(xiàn)要求輸出候選人名單。請用C編程解決此問題。分析:此題的主要內(nèi)容是學(xué)會姓名的輸入/輸出。二、具體實(shí)現(xiàn)(為了程序運(yùn)行簡單,假設(shè)只有五個(gè)同學(xué))#include"stdio.h"#include"string.h"#defineN5main(){charname[N][12];chartt[20];inti,j;printf("請輸入%d個(gè)候選同學(xué)的姓名:\n",N);for(i=0;i<N;i++)gets(name[i]);printf("-------------------\n");printf("輸出%d個(gè)候選同學(xué)的姓名:\n",N);printf("-------------------\n");for(i=0;i<N;i++)puts(name[i]);}本任務(wù)所要掌握的知識點(diǎn)是:字符數(shù)組的輸入輸出

三、相關(guān)知識(一)一維字符數(shù)組1.一維字符數(shù)組的定義例如:charc[10];意思是定義一個(gè)字符數(shù)組c,它有10個(gè)元素。C[0]=’I’;c[1]=’□’;c[2]=’a’;c[3]=’m’;c[4]=’□’;c[5]=’h’;c[6]=’a’;c[7]=’p’;c[8]=’p’;c[9]=’y。該數(shù)組的下標(biāo)從0到9,數(shù)組元素值如右圖所示。china\0china\0\0\0\0\0I□am□happy2.一維字符數(shù)組的初始化(1)定義時(shí)逐個(gè)字符給數(shù)組中各元素。charc[5]={‘c’,’h’,’i’,’n’,’a’};(2)可省略數(shù)組長度。charc[]={‘c’,’h’,’i’,’n’,’a’};系統(tǒng)根據(jù)初值個(gè)數(shù)確定數(shù)組的長度,數(shù)組c的長度自動為5。(3)字符數(shù)組可以用字符串來初始化。

charc[6]=”china”charc[10]={“china”}/*加不加花括號都沒關(guān)系*/3.一維字符數(shù)組的引用方法一:用%c格式符逐個(gè)輸入輸出。例如:charc[6];for(i=0;i<6;i++){scanf(“%c”,&c[i]);printf(“%c”,c[i]);}方法二:用%s格式符進(jìn)行字符串輸入輸出。例如:charc[6];scanf(“%s”,c);printf(“%s”,c);(1)輸出時(shí),遇’\0’結(jié)束,且輸出字符中不包含’\0’。(2)“%s”格式輸入時(shí),遇空格或回車結(jié)束,但獲得的字符中不包含回車及空格本身,而是在字符串末尾添’\0’。charc[10];scanf(“%s”,c);輸入數(shù)據(jù)“Howareyou”,結(jié)果僅“How”被輸入數(shù)組c中。(3)一個(gè)scanf函數(shù)輸入多個(gè)字符串,輸入時(shí)以空格鍵作為字符串間的分隔。例如:chars1[5],s2[5],s3[5];scanf(“%s%s%s”,s1,s2,s3);輸入數(shù)據(jù)”Howareyou”,s1,s2,s3獲得的數(shù)據(jù)如下圖所示。(4)“%s”格式符輸出時(shí),若數(shù)組中包含一個(gè)以上’\0’,遇第一個(gè)’\0’時(shí)結(jié)束。S1S2s3How\0\0are\0\0you\0\0【例4-7】三個(gè)同學(xué)姓名的輸入輸出。程序如下:#include"stdio.h"main(){charname1[10],name2[10],name3[10];printf("請輸入姓名:\n");scanf("%s%s%s",name1,name2,name3);printf("輸出的姓名為:\n");printf("%s,%s,%s\n",name1,name2,name3);}

程序的運(yùn)行結(jié)果表明:%s輸入時(shí),空格或回車表示輸入的分隔符4.常用的字符串處理函數(shù)(1)輸入字符串函數(shù)——gets()格式:gets(字符數(shù)組)

例如:chars[12];gets(s);功能:從鍵盤輸入1個(gè)字符串。允許輸入空格。【例4-8】將例4-7改為gets()輸入:#include"stdio.h"main(){charname1[10],name2[10],name3[10];printf("請輸入姓名:\n");gets(name1);gets(name2);gets(name3);printf("輸出的姓名為:\n");printf("%s,%s,%s\n",name1,name2,name3);}注意:gets()允許輸入空格(2)輸出字符串函數(shù)格式:puts(字符數(shù)組)如:chars[6]=”china”;puts(s);功能:把字符數(shù)組中所存的字符串,輸出到標(biāo)準(zhǔn)輸出設(shè)備中,并用’\n’代替’\0’【例4-9】將例4-7改為gets()、puts()函數(shù)。#include"stdio.h"main(){charname1[10],name2[10],name3[10];printf("請輸入姓名:\n");gets(name1);gets(name2);gets(name3);printf("輸出的姓名為:\n");puts(name1);puts(name2);puts(name3);}程序結(jié)果(二)二維字符數(shù)組1.二維字符數(shù)組的定義:charstr[10][8]定義一個(gè)二維數(shù)組str,共有10行8列共80個(gè)元素。2.二維字符數(shù)組的初始化:(1)chars1[3][3]={{‘a(chǎn)’,’b’,’c’},{‘d’,’e’,’f’},{‘1’,’2’,’3’}};如右圖所示。

(2)chars1[3][3]={“abc123”};3.二維字符數(shù)組的引用:(1)輸入/輸出二維字符數(shù)組中第i行(假設(shè)i=2)方法一:charname[10][12];gets(name[2]);puts(name[2]);方法二charname[10][12];scanf("%s",name[2]);printf("%s",name[2]);意思是:輸入/輸出二維字符數(shù)組中第2行的值。注意:gets(name[2]);與scanf("%s",name[2]);輸入時(shí)有些不一樣

gets(name[2]);printf("%s\n",name[2]);程序運(yùn)行時(shí)輸入zhangming,則輸出zhangming

scanf("%s",name[2]);printf("%s\n",name[2]);則程序運(yùn)行時(shí)輸入zhangming,輸出zhang四、知識擴(kuò)展1、字符串比較函數(shù)格式:strcmp(字符串1,字符串2)其中字符串1、字符串2可以是字符串常量,也可以是一維字符數(shù)組。如:strcmp(str1,str2);strcmp(“China”,”English”);strcmp(str1,”beijing”)功能:比較二個(gè)字符串的大小。2、拷貝字符串函數(shù)格式:strcpy(字符數(shù)組1,字符串)其中字符串可以是字符串常量,也可以是字符數(shù)組。如:charc[30];strcpy(c,”Goodmoning”);功能:將“字符串”完整地復(fù)制到“字符數(shù)組1”中,字符數(shù)組1中原有內(nèi)容被覆蓋。如果字符串1>字符串2,則函數(shù)大于0;如果字符串1=字符串2,則函數(shù)值為0;如果字符串1<字符串2,則函數(shù)值小于0。【例4-10】輸入三個(gè)同學(xué)的姓名,按ASCII碼從大到小的順序排序。#include"stdio.h"#include"string.h"/*因?yàn)橛玫絪trcmp()和ctrcpy()函數(shù)*/main(){charname1[10],name2[10],name3[10];chartt[20];printf("請輸入姓名:\n");gets(name1);gets(name2);gets(name3);if(strcmp(name1,name2)<0){strcpy(tt,name1);strcpy(name1,name2);strcpy(name2,tt);}if(strcmp(name1,name3)<0){strcpy(tt,name1);strcpy(name1,name3);strcpy(name3,tt);}if(strcmp(name2,name3)<0){strcpy(tt,name2);strcpy(name2,name3);strcpy(name3,tt);}printf("輸出的姓名為:\n");puts(name1);puts(name2);puts(name3);}用中英文表示的運(yùn)行結(jié)果【例4-11】輸入十個(gè)候選人同學(xué)的姓名,按ASCII碼從大到小的順序排序。定義一個(gè)二維數(shù)組name[10][12]for(i=0;i<10;i++)輸入name[i]用冒泡法排序輸出排序好的姓名分析:首先要輸入10個(gè)候選同學(xué)的姓名,所以要定義一個(gè)二維字維數(shù)組name[10][12],表示一共可以寄放10個(gè)同學(xué)的姓名,而每個(gè)同學(xué)的姓名最長可以放12個(gè)字符。接下來用一個(gè)循環(huán)輸入10個(gè)同學(xué)的姓名。然后可以用冒泡法或選擇法對此10個(gè)同學(xué)的姓名進(jìn)行排序。最后輸出排序后的姓名。#defineN5/*為了程序運(yùn)行簡單,所以定義了五個(gè)同學(xué)*/#include"stdio.h"#include"string.h"main(){charname[N][12];chartt[20];inti,j;printf("請輸入%d個(gè)候選同學(xué)的姓名:\n",N);for(i=0;i<N;i++)gets(name[i]);for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(strcmp(name[j],name[j+1])<0){strcpy(tt,name[j]);strcpy(name[j],name[j+1]);strcpy(name[j+1],tt);}printf("輸出十個(gè)候選同學(xué)的姓名(按ASCII碼排序):\n");for(i=0;i<N;i++)puts(name[i]);}任務(wù)4多個(gè)學(xué)生多門課成績的排序一、問題情景一個(gè)班40個(gè)同學(xué)參加了三門課的考試,現(xiàn)要求輸出按總成績的高低排序的成績單。成績單的格式如下:排序姓名課1課2課3總分平均分1張三988788273912李四96868827090……分析:本問題要解決姓名的輸入/輸出,這個(gè)在任務(wù)3中已解決。同時(shí)也需輸入/輸出40個(gè)同學(xué)三門課的成績,并進(jìn)行相應(yīng)的總分及平均分的計(jì)算。最后按總分的高低進(jìn)行排序。所以將這一任務(wù)分解為二個(gè)小任務(wù)。一個(gè)是40個(gè)同學(xué)三門課成績的輸入/輸出(其知識點(diǎn)是二維數(shù)組);另一個(gè)是計(jì)算相應(yīng)的平均分及總分并進(jìn)行排序。二、具體實(shí)現(xiàn)(為了在程序運(yùn)行時(shí)方便,所以假設(shè)只有5個(gè)學(xué)生)#include"stdio.h"#include"string.h"#defineN5main(){inti,j;intscore[N][3],t;charname[N][10],nn[10];floatsum[N]={0},avg[N];//每個(gè)同學(xué)的總分及平均分printf("請輸入五個(gè)同學(xué)三門課的成績:\n");/*輸入記錄*/for(i=0;i<N;i++){printf("第%d個(gè)同學(xué)的記錄:",i+1);scanf("%s",name[i]);for(j=0;j<3;j++)scanf("%d",&score[i][j]);}/*計(jì)算每個(gè)同學(xué)的總分與平均分*/for(i=0;i<N;i++){for(j=0;j<3;j++)sum[i]=sum[i]+score[i][j];avg[i]=sum[i]/3.0;}/*排序成績*/for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(sum[j]<sum[j+1]){t=sum[j];sum[j]=sum[j+1];sum[j+1]=t;t=avg[j];avg[j]=avg[j+1];avg[j+1]=t;//這個(gè)同學(xué)的所有數(shù)據(jù)都要交換任務(wù)4多個(gè)學(xué)生多門課成績的排序t=score[j][0];score[j][0]=score[j+1][0];score[j+1][0]=t;t=score[j][1];score[j][1]=score[j+1][1];score[j+1][1]=t;t=score[j][2];score[j][2]=score[j+1][2];score[j+1][2]=t;strcpy(nn,name[j]);strcpy(name[j],name[j+1]);strcpy(name[j+1],nn);}printf("----------------------------------------------------\n");printf("輸出排序后五個(gè)同學(xué)三門課的成績:\n");printf("----------------------------------------------------\n");printf("排序\t姓名\t課1\t課2\t課3\t總分\t平均分\n");for(i=0;i<N;i++){printf("第%d名:\t",i+1);printf("%s\t",name[i]);for(j=0;j<3;j++)printf("%d\t",score[i][j]);printf("%.0f\t%.1f\t",sum[i],avg[i]);printf("\n");}printf("-----------------------------------------------------\n");}三、相關(guān)知識(一)二維數(shù)組的定義1.二維數(shù)組定義的一般形式類型說明符數(shù)組名[常量表達(dá)式][常量表達(dá)式]例如:inta[3][4定義了一個(gè)3×4(3行4列)的整型數(shù)組a2.二維數(shù)組的理解二維數(shù)組是一種特殊的一維數(shù)組例如inta[3][4];a為數(shù)組名,先看第一維,表明它是一個(gè)具有3個(gè)元素的特殊的一維數(shù)組,三個(gè)元素分別為a[0],a[1],a[2]。再看第二維,表明每個(gè)元素又是一個(gè)包含4個(gè)元素的一維數(shù)組,如a[0]這個(gè)元素包含4個(gè)元素:a[0][0],a[0][1],a[0][2],a[0][3](二)二維數(shù)組的引用二維數(shù)組元素的表示形式:數(shù)組名[下標(biāo)][下標(biāo)]例:inta[3][4],表示行下標(biāo)值最小從0開始,最大為3-1=2;列下標(biāo)值最小為0,最大為4-1=3,即:a[0][0]a[0][1]a[0][2]a[0][4]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3](三)二維數(shù)組的初始化二維數(shù)組初始化的方法如下。(1)分行給二維數(shù)組賦初值inta[3][4]={{1,2,3,4},{4,5,6,7},{6,7,8,9}};(2)將所有數(shù)據(jù)寫在一個(gè)花括弧內(nèi),按數(shù)值排列的順序?qū)Ω髟刭x初值。inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}

(3)可以對部分元素賦初值。inta[3][4]={{1,2},{4},{6,7,8}};a數(shù)組分布如圖所示。(4)如果對全部數(shù)組元素賦值,則第一維的長度可以不指定,但必須指定第二維的長度,全部數(shù)據(jù)寫在一個(gè)大括號內(nèi)。如:inta[][3]={1,2,3,4,5,6,7,8,9,10,11,12};第一維長度4省略。120040006780(四)二維數(shù)組的應(yīng)用【例4-12】輸入五個(gè)同學(xué)三門課的成績并輸出。#include"stdio.h"#defineN5main(){inti,j;intscore[N][3];printf("請輸入五個(gè)同學(xué)三門課的成績:\n");for(i=0;i<N;i++)for(j=0;j<3;j++)scanf("%d",&score[i][j]);printf("輸出五個(gè)同學(xué)三門課的成績:\n");for(i=0;i<N;i++){printf("第%d位同學(xué):",i+1);for(j=0;j<3;j++)printf("%5d",score[i][j]);printf("\n");}}【例4-13】輸入五個(gè)同學(xué)三門課的成績,計(jì)算各門課的總分及平均分,并輸出。#include"stdio.h"#defineN5main(){inti,j;intscore[N][3],sum[3]={0},avg[3];printf("請輸入五個(gè)同學(xué)三門課的成績:\n");for(i=0;i<N;i++)for(j=0;j<3;j++)scanf("%d",&score[i][j]);/*計(jì)算每門課的總分及平均分*/for(j=0;j<3;j++){for(i=0;i<N;i++)sum[j]=sum[j]+score[i][j];avg[j]=sum[j]/N;}printf("-------------------------\n");printf("輸出五個(gè)同學(xué)三門課的成績:\n");for(i=0;i<N;i++){printf("第%d位同學(xué):",i+1);for(j=0;j<3;j++)printf("%5d",score[i][j]);printf("\n");}printf("-------------------------\n");printf("總分為:");for(j=0;j<3;j++)printf("%5d",sum[j]);printf("\n");printf("平均分為:");for(j=0;j<3;j++)printf("%5d",avg[j]);printf("\n");}任務(wù)5舉一反三【例4-15】輸入20個(gè)數(shù),輸出它們的平均值及其中與平均值之差的絕對值為最小的數(shù)組元數(shù)。分析:(1)定義一個(gè)數(shù)組inta[20],輸入20個(gè)數(shù)組元素并將其相加到s中,那么平均值就是avg=s/20;(2)接下來的問題是求最小值。先假設(shè)第一個(gè)數(shù)最接近平均數(shù),即min=fabs(a[0]-avg),k=0,然后將min與fabs(a[1]-avg)相比,若大,則新的min=fabs(a[1]-avg),k=1,再將min與fabs(a[2]-avg)相比,若大,則新的min=fabs(a[2]-avg),k=2,這樣不斷重復(fù)多次,直到與fabs(a[19]-avg)比完;(3)輸出最小值。#include"stdio.h"#include"math.h"main(){inti,k,a[20];floats=0,avg

溫馨提示

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

評論

0/150

提交評論