數(shù)據(jù)庫課程設(shè)計統(tǒng)計成績_第1頁
數(shù)據(jù)庫課程設(shè)計統(tǒng)計成績_第2頁
數(shù)據(jù)庫課程設(shè)計統(tǒng)計成績_第3頁
數(shù)據(jù)庫課程設(shè)計統(tǒng)計成績_第4頁
數(shù)據(jù)庫課程設(shè)計統(tǒng)計成績_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、題目:統(tǒng)計成績姓名: *學號: *班級: *專業(yè): 學院: 指導老師:*2011年6月14日數(shù)據(jù)結(jié)構(gòu)課程設(shè)計一、實驗題目統(tǒng)計成績:任務:給出n個學生的考試成績表,每條信息有姓名與分數(shù)組成,(1) 分數(shù)高低次序,打印出每個學生在考試中獲得的名次,分數(shù)相同的為同一名次;(2) 按名次列出每個學生的姓名與分數(shù)。要求:學生的考試成績表必須通過鍵盤輸入數(shù)據(jù)而建立,同時要對輸出進行格式控制。二、實驗目的通過本次實踐實驗活動加強對數(shù)據(jù)結(jié)構(gòu)的掌握,以及對算法的理解能力及設(shè)計程序的能力,以實現(xiàn)對語言以及C+語言的掌握,并用C語言或程序設(shè)計語言來編程,解決實際現(xiàn)實生活中的問題。理解數(shù)據(jù)結(jié)構(gòu)的精髓,將現(xiàn)實生活中的客

2、觀事物抽象為一種具體的數(shù)據(jù)結(jié)構(gòu),并設(shè)計一種具體的算法思想步驟,解決這些客觀事物所涉及到的問題。從而也使得我們更加熟練地掌握語言及C+語言和數(shù)據(jù)結(jié)構(gòu)。三、實驗內(nèi)容1. 需求分析:在生活中,特別是在學校,我們經(jīng)常要對學生的考試成績進行處理,因此,設(shè)計一個統(tǒng)計學生成績的程序是非常有用的。在此程序中,用線性表和快速排序函數(shù)實現(xiàn)。算法思想如下:建立一個存放學生信息的線性表,手動輸入學生信息,將其存放在線性表中相應位置,用一個QuickSort()函數(shù)對學生成績進行快速排序,手動控制排序方式(按科目排序,按總分排序)排序后用display()函數(shù)輸出。其中需注意的是:(1)考生成績手動輸入。(2)分數(shù)相同

3、名次相同。(3)對輸出格式進行控制,使輸出整齊。(4)可以對多門課程進行排名并輸出。(5)可以打印成績。保存到文本文檔。2概要設(shè)計:ai的結(jié)構(gòu)如下:number name fen n學號域 姓名域 成績域 名次域存儲結(jié)構(gòu)如下:a1a2an頭指針圖1-1 存儲結(jié)構(gòu)程序結(jié)構(gòu):main()dayin()place()display()QuickSort()creat()QSort() Partition()圖1-2 程序結(jié)構(gòu)圖如圖,main( )函數(shù)調(diào)用了四個子函數(shù), creat( )、QuickSort( )、place ( )、display ( )。其中,creat( )把手動輸入的學生成績建

4、立一個線性表。QuickSort( )實現(xiàn)學生成績的排序,它調(diào)用了一個子函數(shù),QSort( )實現(xiàn)快速排序,而QSort( ) 又調(diào)用了Partition( ),樞軸函數(shù)。dayin( )為實現(xiàn)打印學生成績單的函數(shù)。place( )用來排學生名次。display( )用來輸出排序后的學生成績表。函數(shù)及變量說明:creat( )為輸入學生信息函數(shù),用來輸入各個學生的學號,姓名,各科成績,學生人數(shù)由自己定,利用for語句來輸入相關(guān)信息,最后在輸出所輸入的學生信息。Partition()為樞軸函數(shù),交換順序表L中子表stulow.high的記錄,樞軸記錄到位,并返回其 所在位置,此時在它之前(后)的

5、記錄均不大(小)于它。void QSort()快速排序函數(shù),此函數(shù)中調(diào)用了樞軸函數(shù)int Partition(),對順序表L中的子序列L.stulow.high作快速排序。void QuickSort( )為對數(shù)據(jù)進行排序的函數(shù),此函數(shù)中調(diào)用了快速排序函數(shù),對數(shù)據(jù)進行總體的排序,用在主函數(shù)中,輸入信息后,對總分或者單科成績進行排序。void place( )為排名次函數(shù),利用for()對每個學生名次進行定義,同時總分相同的學生名次相同。dayin( )為實現(xiàn)打印學生成績單的函數(shù)。void display( )為輸出函數(shù),用printf對每個學生的信息進行輸出,并進行格式控制,使輸出對齊,其中v

6、oid display2()為輸出學生總分排序后的信息的函數(shù), display1()為手動輸入學生信息后輸出控制格式后的學生信息的函數(shù),display2()為總分排序時輸出函數(shù),較void display1()多了總分名次一項。 display3()為單科排序時輸出函數(shù),較void display2()多了單科名次一項。其中關(guān)于格式的控制,如輸出函數(shù)的一部分printf(%12s %10s %6d %6d %6dn,中的“%12s”要求輸出寬度為12,若實際位數(shù)多于定義的寬度,則按實際位數(shù)輸出, 若實際位數(shù)少于定義的寬度則補以空格或0。main( )為主函數(shù),其中定義了一個新的線性表,調(diào)用函數(shù)

7、進行學生信息的創(chuàng)建及分數(shù)排序,利用switch語句調(diào)用以上函數(shù)實現(xiàn)各個菜單的功能。程序流程圖:3. 詳細設(shè)計:主函數(shù):#includestdio.h#includestdlib.h#define maxsize 200 /maxsize為學生最大個數(shù)#includec8-2.h / 對兩個數(shù)值型關(guān)鍵字比較的約定#includec1.h/ typedef double KeyType;/定義關(guān)鍵字類型為double#includec-1.cpp/存儲結(jié)構(gòu)#includefunc1.cpp/創(chuàng)建學生信息函數(shù)#includefunc-2.cpp/排序函數(shù)(快速排序)#includefunc3.cpp

8、/輸出函數(shù)int main()SqList x;/新建線性表存放學生信息int choice;x=creat(); display1(x);int i,j,k;for(int t=0;tx.num;t+)/定義總分i=x.stut+1.fen0;j=x.stut+1.fen1;k=x.stut+1.fen2; x.stut+1.fen3=i+j+k; QuickSort(x,3);place(x,0,3); while(1) printf( 主選菜單 n);printf(-n);printf( 1.總分排序 n);printf( 2.語文排序 n); printf( 3.數(shù)學排序 n);pri

9、ntf( 4.英語排序 n);printf( 5.打印成績表 n);printf( 0.退 出 n); printf(-n);printf(請選擇:);scanf(%d,&choice);switch(choice)case 1: QuickSort(x,3); place(x,0,3); display2(x);break;case 2:QuickSort(x,0); place(x,1,0);display3(x);break;case 3: QuickSort(x,1);place(x,1,1);display3(x);break;case 4:QuickSort(x,2); place

10、(x,1,2);display3(x);break;case 5:dayin(x);break;case 0:printf(謝謝使用,再見!n);printf(n);printf( 作者: n);printf( 學號: n);printf( 班級: n);printf(n);return 0;default:printf(輸入錯誤,請重新輸入(1-4)n);break; 2.2 存儲結(jié)構(gòu)c-1.cpptypedef struct char number15;/學號域 char name100;/姓名域 int fen4;/成績域(fen0為語文成績fen1為數(shù)學成績fen2為英語成績/fen3

11、為總分) int n2;/名次域(n0為總分名次n1為單科名次)node;typedef structnode stumaxsize+1; /存放學生信息int num; /存放學生人數(shù)SqList;2.3 創(chuàng)建學生信息函數(shù)func1.cpp SqList creat()/創(chuàng)建學生信息 SqList a;int i;printf(*n); printf(n); printf( 歡迎進入學生成績排序系統(tǒng):n); printf(n); printf(*n);printf(請輸入學生人數(shù):);scanf(%d,&a.num); for(i=1;i=a.num;i+)/輸入每個學生的三門成績print

12、f(請輸入第%d個學生的學號和姓名:,i);scanf(%s%s,&a.stui.number,);printf(請輸入第%d個學生語文,數(shù)學,英語成績:,i); scanf(%d%d%d,&a.stui.fen0,&a.stui.fen1,&a.stui.fen2);return a;2.4排序函數(shù)(快速排序)func-2.cpp int Partition(SqList &L,int low,int high,int i) /樞軸函數(shù) / 交換順序表L中子表stulow.high的記錄,樞軸記錄到位,并返回其 / 所在位置,此時在它之前(后)的記錄均不大(小)于它。

13、KeyType pivotkey; / 樞軸關(guān)鍵字 pivotkey=L.stulow.feni; / 用子表的第1個記錄作初始樞軸記錄 L.stu0=L.stulow; / 將樞軸記錄保存到0 while(lowhigh) / 未分類的區(qū)間大于0 / 從表的兩端交替地向中間掃描 while(low=pivotkey) / 高端記錄的關(guān)鍵字大于樞軸關(guān)鍵字 -high; / 高端向低移,繼續(xù)比較 L.stulow=L.stuhigh; / 將比樞軸關(guān)鍵字小的記錄移到低端,樞軸在0不動 while(lowhigh&L.stulow.feni=pivotkey) / 低端記錄的關(guān)鍵字小于樞軸關(guān)鍵字

14、+low; / 低端向高移,繼續(xù)比較 L.stuhigh=L.stulow; / 將比樞軸關(guān)鍵字大的記錄移到高端,樞軸在0不動 L.stulow=L.stu0; / 樞軸記錄到位 return low; / 返回樞軸位置void QSort(SqList &L,int low,int high,int i) /快速排序函數(shù) / 對順序表L中的子序列L.rlow.high作快速排序。 int pivotloc; if(low0;k-)L.stuk.ni=L.num-k+1;/排名次if(L.stuk.fenj=L.stuk+1.fenj)L.stuk.ni=L.stuk+1.ni;/分數(shù)相同的同

15、學名次相同void dayin(SqList list)/打印成績表FILE *fp;char fname128;printf(請輸入打印成績的文檔名稱:n);scanf(%s,fname);if(fp=fopen(fname,w)=NULL)printf(不能打開這個文件n);exit(0);fprintf(fp,*n);fprintf(fp, 學號 姓名 語文 數(shù)學 英語 總分 總分名次n);for(int k=list.num;k0;k-)fprintf(fp, %12s %10s %6d %6d %6d %6d %8dn,list.stuk.number,,

16、list.stuk.fen0,list.stuk.fen1,list.stuk.fen2,list.stuk.fen3,list.stuk.n0);printf(打印完畢!n);fclose(fp);2.5輸出函數(shù)func3.cpp void display1(SqList list) /輸出函數(shù)printf(*n);printf( 學號 姓名 語文 數(shù)學 英語n); for(int k=1;k0;k-) printf(%12s %10s %6d %6d %6d %6d %8dn, list.stuk.number,,list.stuk.fen0,list.stuk

17、.fen1,list.stuk.fen2, list.stuk.fen3,list.stuk.n0);void display3(SqList list) /輸出函數(shù)printf(*n);printf( 學號 姓名 語文 數(shù)學 英語 總分 單科名次 總分名次n); for(int k=list.num,i=1;k0,i0;k-)L.stuk.n=L.num-k+1;/排名次if(L.stuk.fen4=L.stuk+1.fen4)L.stuk.n=L.stuk+1.n;/總分相同的同學名次相同 QSort(L,1,L.num,i);這樣每次選擇單科排序時都會執(zhí)行函數(shù)QuickSort(x,i)

18、;這樣每次單科排序函數(shù)執(zhí)行時都要首先進行一次名次排序,即:for(int k=L.num;k0;k-)L.stuk.n=L.num-k+1;/排名次if(L.stuk.fen4=L.stuk+1.fen4)L.stuk.n=L.stuk+1.n;/總分相同的同學名次相同 顯示的名次就由總分名次變成了單科的名次,所以分析后對程序進行了改進,將名次排序函數(shù)提出來,并且在主函數(shù)中調(diào)用,這樣只調(diào)用一次,排序時就不會出錯,改進如下:void QuickSort(SqList &L,int i)/對數(shù)據(jù)進行排序QSort(L,1,L.num,i);void place(SqList &L)/排名次函數(shù)fo

19、r(int k=L.num;k0;k-)L.stuk.n=L.num-k+1;/排名次if(L.stuk.fen4=L.stuk+1.fen4)L.stuk.n=L.stuk+1.n;/總分相同的同學名次相同然后對其就能行了改正。四、實驗體會:作為一名信息與計算科學專業(yè)的大二的學生,我覺得能做這樣的課程設(shè)計是十分有意義,而且是十分必要的事。此時:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計終于結(jié)束了,雖然很忙碌、很疲勞,但是收獲很大。幾乎每天的專注和辛勞,喚回了我對數(shù)據(jù)結(jié)構(gòu)課程設(shè)計的重新的認識,在這段做設(shè)計的時間里,我深刻的認識到了C,C+,這類基礎(chǔ)課的重要性,并且在編程過程中也學到了很多,對基礎(chǔ)編程有了深刻的認識。通過

20、這次課程設(shè)計我總結(jié)了一下一些體會:1.必須要掌握好基礎(chǔ)知識,在編程過程中有很多很基本的東西都要現(xiàn)看書查閱才去運用,足以說明知識基礎(chǔ)不牢固,在請教老師,同學之后有了改善,現(xiàn)在已經(jīng)可以靈活運用。2.態(tài)度必須認真,不能想起來就寫幾下,要理清思路,將程序流程弄明白,然后將程序?qū)懴聛恚⑶易⒁飧袷?,不能忘記“;”、“”等一些符號和大小寫要前后一致,括號要匹配。否則這樣的錯誤很難找出來,就會浪費很多時間。3.通過做課程設(shè)計,很清楚的認識到了數(shù)據(jù)結(jié)構(gòu)這門課的重要性,以后應該時常翻閱,為將來打下基礎(chǔ)。本次的課程設(shè)計,培養(yǎng)了我綜合應用數(shù)據(jù)結(jié)構(gòu)、c、c+這幾門課解決問題的能力,在設(shè)計的過程中還培養(yǎng)出了我的耐心及細

21、心,請教老師和同學也解決了許多個人無法解決的問題,在今后的學習過程中我會更加努力。所有程序:/第一個:/ c1.h (文件名) #include / 字符串函數(shù)頭文件 #include / 字符函數(shù)頭文件 #include / malloc()等 #include / INT_MAX等 #include / 標準輸入輸出頭文件,包括EOF(=Z或F6),NULL等 #include / atoi(),exit() #include / eof() #include / 數(shù)學函數(shù)頭文件,包括floor(),ceil(),abs()等 #include / ftime() #include / 提

22、供宏va_start,va_arg和va_end,用于存取變長參數(shù)表 / 函數(shù)結(jié)果狀態(tài)代碼。在教科書第10頁 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 / #define INFEASIBLE -1 沒使用 / #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行 typedef int Status; / Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 typedef int Boolean; / Boolean是布爾類型,其值是TRUE或FALSE,第

23、7、8章用到/第二個/ c8-2.h 對兩個數(shù)值型關(guān)鍵字的比較約定為如下的宏定義。在教科書第215頁 #define EQ(a,b) (a)=(b) #define LT(a,b) (a)(b) #define LQ(a,b) (a)=(b)/第三個 typedef struct char number15;/學號域 char name100;/姓名域 int fen4;/成績域(fen0為語文成績fen1為數(shù)學成績fen2為英語成績fen3為總分) int n2;/名次域(n0為總分名次n1為單科名次)node;typedef structnode stumaxsize+1; /存放學生信息

24、int num; /存放學生人數(shù)SqList;/第四個SqList creat()/創(chuàng)建學生信息 SqList a;int i;printf(*n); printf(n); printf( 歡迎進入學生成績排序系統(tǒng):n); printf(n); printf(*n);printf(請輸入學生人數(shù):);scanf(%d,&a.num); for(i=1;i=a.num;i+)/輸入每個學生的三門成績printf(請輸入第%d個學生的學號和姓名:n,i);scanf(%s%s,&a.stui.number,);/這里,name是數(shù)組名,不用加地址符pri

25、ntf(請輸入第%d個學生語文,數(shù)學,英語成績:n,i); scanf(%d%d%d,&a.stui.fen0,&a.stui.fen1,&a.stui.fen2);return a;/第五個SqList creat()/創(chuàng)建學生信息 SqList a;int i;printf(*n); printf(n); printf( 歡迎進入學生成績排序系統(tǒng):n); printf(n); printf(*n);printf(請輸入學生人數(shù):);scanf(%d,&a.num); for(i=1;i=a.num;i+)/輸入每個學生的三門成績printf(請輸入第%d個學生的學號和姓名:n,i);sca

26、nf(%s%s,&a.stui.number,);/這里,name是數(shù)組名,不用加地址符printf(請輸入第%d個學生語文,數(shù)學,英語成績:n,i); scanf(%d%d%d,&a.stui.fen0,&a.stui.fen1,&a.stui.fen2);return a;/第六個int Partition(SqList &L,int low,int high,int i) /樞軸函數(shù) / 交換順序表L中子表stulow.high的記錄,樞軸記錄到位,并返回其 / 所在位置,此時在它之前(后)的記錄均不大(小)于它。 KeyType pivotk

27、ey; / 樞軸關(guān)鍵字 pivotkey=L.stulow.feni; / 用子表的第1個記錄作初始樞軸記錄 L.stu0=L.stulow; / 將樞軸記錄保存到0 while(lowhigh) / 未分類的區(qū)間大于0 / 從表的兩端交替地向中間掃描 while(low=pivotkey) / 高端記錄的關(guān)鍵字大于樞軸關(guān)鍵字 -high; / 高端向低移,繼續(xù)比較 L.stulow=L.stuhigh; / 將比樞軸關(guān)鍵字小的記錄移到低端,樞軸在0不動 while(lowhigh&L.stulow.feni=pivotkey) / 低端記錄的關(guān)鍵字小于樞軸關(guān)鍵字 +low; / 低端向高移,

28、繼續(xù)比較 L.stuhigh=L.stulow; / 將比樞軸關(guān)鍵字大的記錄移到高端,樞軸在0不動 L.stulow=L.stu0; / 樞軸記錄到位 return low; / 返回樞軸位置void QSort(SqList &L,int low,int high,int i) /快速排序函數(shù) / 對順序表L中的子序列L.rlow.high作快速排序。 int pivotloc; if(low0;k-)L.stuk.ni=L.num-k+1;/排名次if(L.stuk.fenj=L.stuk+1.fenj)L.stuk.ni=L.stuk+1.ni;/分數(shù)相同的同學名次相同void dayi

29、n(SqList list)/打印成績表FILE *fp;char fname128;printf(請輸入打印成績的文檔名稱:n);scanf(%s,fname);if(fp=fopen(fname,w)=NULL)printf(不能打開這個文件n);exit(0);fprintf(fp,*n);fprintf(fp, 學號 姓名 語文 數(shù)學 英語 總分 總分名次n);for(int k=list.num;k0;k-) fprintf(fp,%12s %10s %6d %6d %6d %6d %8dn, list.stuk.number,,list.stuk.fen0,list.stuk.fen1,list.stuk.fen2, list.stuk.fen3,list.stuk.n0);printf(打印完畢!n);fclose(fp);/第七個#includestdio.h#inc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論