成績統計系統C++課程設計_第1頁
成績統計系統C++課程設計_第2頁
成績統計系統C++課程設計_第3頁
免費預覽已結束,剩余17頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、中南民族大學計算機科學學院課程設計報告課 程 面向對象程序設計語言題 目成績統計系統年級2014 級專業軟件工程學生學號指導教師 201年6月8日中南民族大學計算機科學學院本科課程設計任務書設計名稱:成績統計系統指導教師:下達時間:2015-5-8學生姓名:學號:專 業:軟件工程一、課程設計的基本要求根據所學知識,編寫指定題目的 C+吾言程序,并規范地完成課程設計報告。 通過課程設計,加深對C+面向對象程序設計課程所學知識的理解,熟練掌握和 鞏固C+吾言的基本知識和語法規范,掌握C+吾言的基礎知識,理解面向對象系統 的封裝性、繼承性和多態性;熟練使用 C 語言中的函數、數組、指針、鏈表和字符

2、串等基本知識;掌握類的定義、標準 String 類和向量; 理解掌握友元函數和重載 操作符,動態數組;理解掌握繼承和多態性;掌握模版的使用;能夠進行程序調試 過程中的異常處理;進一步掌握利用 C+S行類的定義和操作方法;進一步掌握類 的繼承和派生方法;進一步理解虛函數和多態;綜合利用上述知識,學習設計并編 寫面向對象的C+簡單應用程序;培養解決復雜任務功能分解方法(自頂向下逐步 求精、模塊化設計、信息隱藏等)。學會編制結構清晰、風格良好、數據結構適當的C+吾言程序,從而具備利用計算機編程分析解決綜合性實際問題的初步能力。具體要求如下:1、采取模塊化方式進行程序設計,要求程序的功能設計、數據結構

3、設計及 整體結構設計合理。學生也可根據自己對題目的理解增加新的功能模塊(視情況可 另外加分)。2、系統以菜單界面方式(至少采用文本菜單界面,如能采用圖形菜單界面 更好)工作,運行界面友好,演示程序以用戶和計算機的對話方式進行。3、程序算法說明清晰,理論分析與計算正確,運行情況良好,實驗測試數 據無誤,容錯性強(能對錯誤輸入進行判斷控制)。4、編程風格良好(包括縮進、空行、適當注釋、變量名和函數名見名知 意,程序容易閱讀等);5、寫出規范的課程設計報告,具體要求見相關說明文檔。二、課程設計的主要內容 用面向對象的方法設計成績管理系統。建立一個成績類管理所有成績信息,其中應包含如下一些功能:求最高

4、分、最低分、平均分、總分、按分數段統計等。要求能夠從文件中讀取成績信息進行初始化。三、課程設計的進程安排1 2015年 5月 8日(第 9周):布置并下達課程設計題目。2 2015年 5月 15日(第 10周)之前:聯系指導教師,理解課程設計題目及 相關要求,查閱相關資料,進行課程設計。3. 2015年5月15日至6月5日(第1013周):課程設計源程序的調試、 修改與檢查,書寫設計報告。地點:學院實驗機房 9-202 、 203、 204、 205、 206。4 2015年 6月 5日之前(第 13周):上交、檢查設計報告地點:計算機科學學院實驗機房。指導教師: 杜小坤 2015年5月8日成

5、績統計系統一 目的用面向對象的方法設計一個成績管理系統。建立一個成績類管理所有成績信息,其中包括以下功 能:查詢各科及總分最高分,查詢各科及總分最低分,查詢各科及總分平均分,以及查詢總分按分數 段統計信息。相應成績信息從文件中讀取并進行初始化 , 保留初始化的學生成績信息于文件中,并且可 以向文件中添加學生成績信息。二 需求分析1、查詢學生各科及總分最高分、最低分和平均分由于學生成績信息繁多,為便于使用者較快得到相應信息,其中查詢學生各科及總分最高分和最 低分是一個重要的查詢需求。2、查詢學生總分分數段統計信息為了快速了解學生成績的整體情況,其中查詢學生總分分數段的統計信息是一個便捷的查詢方

6、式,能夠為使用者快速達到其需求信息。三 概要設計1、建立一個 Student 類,用于存取學生的成績信息類中成員包括學生的姓名、學號、數學成績、英語成績、C+成績;成員函數包括構造函數、求取總分成績函數。2、定義相關函數用于求取最高分、最低分、平均分以及總分排序在類外分別求取最高分、最低分、平均分和總分成績排序函數,利用這幾個函數來實現成績管理系統相應功能。3、定義菜單函數定義菜單界面函數,提示使用者使用相應功能以及要進行的操作步驟。四 詳細設計1、 Student 類和主要功能函數偽代碼public:/ 類成員string name; / 姓名 long sno; / 學號 int Math

7、; /數學成績int English; /英語成績int Cjj; /C+成績/ 類主要函數int Totalscore()return Math+English+Cjj; /計算學生總分成績void input(); / 輸入學生信息;/ 主要功能函數int FindMaxscore( 定義一個數組為形參 ) / 求最高分函數for(i=0;i<n; int i+)if( 數組某成員大于定義的最大值 )定義的最大值 =數組某成員 ;return 定義的最大值 ;int FindMinscore( 定義一個數組為形參 ) / 求最低分 for(i=0;i<n;i+)if( 數組某成

8、員小于定義的最小值 )定義的最小值 =數組某成員 ;return 定義的最小值 ;int Averagescore( 定義一個數組為形參 ) / 求平均分 for(i=1;i<n;i+) 累加求數組成員的總和; return 平均分;void Datasort( 定義一個數組為形參 ) / 分數由最高到最低排序 采用交換排序法,依次比較數組相鄰成員的大小,較大的成員排在前面,較小的成員排在后 面;2、 main() 函數中主要功能偽代碼int main() cout<<" 請輸入添加的學生人數 n( 無學生信息添加請輸入 0):"<<endl;

9、cin>>n;Student stuN; / 定義一個 Student 類數組for(int m=0;m<n;m+)stum.input();/ 調用 Student 類添加學生信息函數,添加學生信息ofstream out("f1.text",ios:out|ios:app); / 件 f1.text 并添加學生信息定義輸出文件流對象 out, 打開輸出文for(int s=0;s<n;s+)out<<<<" "<<stus.sno<<" "&

10、lt;<stus.Cjj; /向文件中寫入添加的學生具體信息out.close();ifstream in("f1.text",ios:in); /f1.textint j=0;"<<stus.Math<<" "<<stus.English<<"定義輸入文件流對象 in, 打開輸入文件while(!in.eof()/ 直到文件末尾跳出循環 in>>>>stu2j.sno>>stu2j.Math>>stu2j.Eng

11、lish>>stu2j.Cjj;/ 依次 讀入學生信息score1j=stu2j.getMath();score2j=stu2j.getEnglish();score3j=stu2j.getCjj();score4j=stu2j.Totalscore();/放入一個數組中分別將學生數學成績、英語成績、C+成績、總分成績j+; int t;docout<<" 請輸入菜單相應功能數字:cin>>t;if(t 等于 1) 調用求取最高分函數,顯示學生各科及總分最高分;if(t 等于 2) 調用求取最低分函數,輸出學生各科及總分最低分;if(t 等于 3)

12、 調用求取平均分函數,輸出學生各科及總分平均分;if(t 等于 4) 調用排序函數并輸出學生成績總分排名及全體成員各科信息;if(t 等于 5) cout<<"* 學生成績總分分數段統計情況 *"<<endl;int Total1N=0,Total2N=0,Total3N=0; / 定義三個數組,數組成員并 初始化為零,存放各個分數段學生總分成績for(j=0;j<N;j+)if( 某學生總分大于 290 分 )Total1j= 某學生總分;else if( 某學生總分大于 280 分 )Total2j= 某學生總分 ;else if( 某學生

13、總分大于等于 270 分 )Total3j= 某學生總分 ;cout<<setw(25)<<"290< 總分<=300分數段: n"for(j=0;j<N;j+)if(Total1j)/ 如果 Total1j 不為零則執行 if 內語句cout<< <Total1j<<endl; cout<<setw(25)<<"280< 總分 <=290 分數段: n"for(j=0;j<N;j+) if(Total2j)/如果 Total2j 不為零則執

14、行 if 內語句cout<< Total2j<<endl;cout<<setw(25)<<"270<= 總分<=280 分數段: n"for(j=0;j<N;j+)if(Total3j) / 如果 Total3j 不為零則執行 if 內語句cout<<Total3|j<<e ndl;if(t 等于6)cout<<"歡迎使用成績統計系統!"<<endl;break;if(t!=1 &&t!=2&&t!=3&

15、;&t!=4&&t!=5&&t!=6) /錯誤判斷cout<<"輸入錯誤! "<<endl;while(t);in.close();關閉文件 f1.textreturn 0;五調試分析在調試過程中,令我印象最深刻的是在定義Stude nt類對象并初始化時,其中部分輸入使用了中文字符,導致在調試檢查時花了很長時間才發現這個錯誤。其次,在調用求取最高分、最低分、平均分函數時,由于一個學生有多個信息,在使用相應學生信息作為實參來調用函數時,我用類似stu2.getMath()這樣的形式作為數組名,結果一直顯示錯誤,最

16、后通過score1j=stu2j.getMath();這一語句來轉換,成功解決了這一錯誤。其中,在實現總分排名這一功能時,我是使用了一個排序函數,然后取用在數組中相應位置數作為排名成績,在操作調試過程中因為排序函數定義成void或者int型錯誤以及在使用for循環邏輯錯誤,使得結果一直無法輸出學生總分成績以及排名信息。不過,經過耐心的調試和修改,最后成功解 決了這一問題。最后,最重要的是文件操作部分的內容,這是本次課程設計中的難點。當時,我是依據課本上的一個例子仿照編寫的,直接在main函數里定義文件,向文件里編寫數據,然后讀取。后面功能函數實現所調用的實參均是按照文件讀取中格式輸入,結果導致

17、每次運行添加的學生信息在下一次運行時無 法保留。我自己在百度上參考了一些例子,也參照了班里同學的例子。由于在編寫程序初設計程序整 體功能結構框架沒有重視文件操作這一功能,導致在修改源程序達到永久保存添加學生信息功能時, 修改時有點繁瑣。不過,經過和同學討論和書本上相關例子,最終解決了文件添加學生信息的功能。六測試結果以下是我編寫成績統計系統過程中使用的初步學生成績信息,其中總分、最高分、最低分、平均 分均是經過實際驗證得到的數據。姓名學號數學成績英語成績C+成績總分王2011909192273李2012959294281趙2013959899292柳2014969798291洪20159495

18、96285梁2016979899294最高分979899294最低分909192273平均分94.595.1796.33286圖一:r-fl.text -文件® 編輯韜式gj垂香(百 幫肪(擊圧 2 011 90 9-1 9暉 2012 95 92 9卻趙 2013 95 98 99荊卩 2 014 9« 97 98洪 2»1 94 9S 9占粱 2 016 97 9S 99上圖一是文 件fl.text中原本保留的學生成績信息截圖顯示。圖二:圖三:上圖二、三是查詢各科及總分最高分運行結果。圖四:上圖四是查詢各科及總分最低分運行結果。 圖五:上圖五是查詢各科及總分平

19、均分結果顯示。 圖六:上圖六是查詢學生成績總分排名及各科信息結果顯示。圖七:上圖七是查詢學生總分分數段信息結果及退出功能顯示。 圖八:上圖八是結束第一次運行,第二次運行向文件fl.text中添加三位學生信息。圖九:上圖九是添加完三位學生信息后,文件fl.text中學生信息顯示截圖。圖十:上圖十是第二次重新運行向文件中添加三位學生信息后運行功能四結果顯示。七用戶使用說明在添加完學生信息后,會有以下提示:(一)進入界面后會有以下提示:1、 查詢各科及總分最高分(請輸入1);2、 查詢各科及總分最低分(請輸入2);3、 查詢各科及總分平均分(請輸入3);4、 查詢總分排名及全體成員各科信息(請輸入4

20、);5、 查詢總分分數段統計情況(請輸入5);6、退出(請輸入6 )。(二)在用戶輸入1后會有以下提示:1.1 、查詢數學最高分請輸入 11;1.2 、查詢英語最高分請輸入 12;1.3、查詢C+最高分請輸入13;1.4、 查詢總分最高分請輸入14;1.5 、返回菜單請輸入 15。(三)在用戶輸入 2 后會有以下提示:2.1 、查詢數學最低分請輸入21;2.2 、查詢英語最低分請輸入22;2.3、查詢C+最低分請輸入23;2.4 、查詢總分最低分請輸入 24;2.5 、返回菜單請輸入 25 。( 四 )在用戶輸入 3 后會有以下提示:3.1 、查詢數學平均分請輸入 31 ;3.2 、查詢英語平

21、均分請輸入 32;3.3、查詢C+平均分請輸入 33;3.4 、查詢總分平均分請輸入 34;3.5 、返回菜單請輸入35。八 課程設計總結在編寫這次課程設計之前,我所編寫的程序大部分都是提供了詳細的設計信息,以及設計的框 架,只需要向里面填寫相應代碼即可,這讓我感覺所學的知識一直沒有用到實際應用過程中去。通過這一次課程設計,從理解任務書題意,到具體框架設計,到具體功能代碼的實現,以及到最 后正確結果的輸出讓我體會到了這一年來所學知識的真正應用。在此過程中,也讓我對C 語言和兩本書中不熟悉的知識點更加熟悉了解,從中也提高了我對專業課學習的興趣。本次課程設計,其中比較難得地方是做好文件操作處理這一

22、功能,由于起初在理解任務書及設計 程序整體結構框架時沒有考慮到位,導致最后添加功能時很繁瑣,不過最后還是成功解決了這一問 題。從中也讓我明白了,一個優秀的程序要建立在一個優秀的需求分析的基礎上,并要結合良好的詳 細設計,才能在后續修改過程中變得更加簡單。C+附具體源碼:#include<iostream> #include<fstream>#include<iomanip>#include<string>using namespace std;#define N 40class Student /public:string name; / lon

23、g sno; / int Math; / int English; /建立一個學生類姓名學號 數學成績 英語成績int Cjj; /C+ 成績Student();構造函數Student(string name1,long sno1,int Math1,int English1,int Cjj1); / string getname()return name; / 取姓名 long getsno()return sno;/取學號int getMath()return Math;/取數學成績int getEnglish()return English; / 取英語成績 int getCjj()re

24、turn Cjj; /取 C+成績int Totalscore()return Math+English+Cjj; /計算學生總分成績void input(); / 輸入學生信息;Student:Student()name=" "sno=0;Math=0;English=0;Cjj=0;Student:Student(string name1,long sno1,int Math1,int English1,int Cjj1) name=name1; sno=sno1;Math=Math1;English=English1;Cjj=Cjj1;void Student:inp

25、ut()cout<<"請依次輸入學生姓名,學號,數學成績,英語成績,C+成績"<<endl;cout<<" 姓名: "cin>>name;cout<<" 學號: "cin>>sno;cout<<" 數學成績: "cin>>Math;cout<<" 英語成績: "cin>>English;cout<<"C+ 成績: "cin>>Cjj;

26、/Student 類結束void menu() / 總菜單界面cout<<"*"<<endl;cout<<"* "<<endl;cout<<"歡迎進入成績統計系統"<<endl;cout<<"1、查詢各科及總分最高分(請輸入1)"<<endl;cout<<"2、查詢各科及總分最低分(請輸入2)"<<endl;cout<<"3、查詢各科及總分平均分(請輸入3

27、)"<<endl;cout<<"4、查詢總分排名及全體成員各科信息(請輸入4) "<<endl;cout<<"5、查詢總分分數段統計情況(請輸入5)"<<endl;cout<<"6、退出(請輸入 6)"<<endl;*"<<endl;*cout<<"cout<<""<<endl;cout<<endl<<endl;void menu1

28、() / 菜單 1 界面cout<<"*"<<endl;cout<<"1.1、查詢數學最高分請輸入11"<<endl;cout<<"1.2、查詢英語最高分請輸入12"<<endl;cout<<"1.3、查詢C+最高分請輸入13"<<endl;cout<<"1.4、查詢總分最高分請輸入14"<<endl;cout<<"1.5、返回菜單請輸入 15"

29、<<endl;*"<<endl;cout<<"cout<<endl;void menu2() / 菜單 2 界面cout<<"2.1、查詢數學最低分請輸入21"<<endl;cout<<"2.2、查詢英語最低分請輸入22"<<endl;cout<<"2.3、查詢C+最低分請輸入23"<<endl;cout<<"2.4、查詢總分最低分請輸入24"<<end

30、l;cout<<"*"<<endl;cout<<" 2.5 、返回菜單請輸入 25 "<<endl;*cout<<""<<endl;cout<<endl;void menu3() / 菜單 3 界面"<<endl;cout<<"cout<<"3.1、查詢數學平均分請輸入31"<<endl;cout<<"3.2、查詢英語平均分請輸入32"

31、;<<endl;cout<<"3.3、查詢C+平均分請輸入33"<<endl;cout<<"3.4、查詢總分平均分請輸入34"<<endl;cout<<"*"<<endl;cout<<" 3.5 、返回菜單請輸入 35 "<<endl;*cout<<endl;int FindMaxscore(int score,int n) /求最高分 int i,pMaxScore;pMaxScore=scor

32、e0; for(i=0;i<n;i+)if(scorei>pMaxScore) pMaxScore=scorei;return pMaxScore;int FindMinscore(int score,int n) /求最低分 int i,pMinScore;pMinScore=score0; for(i=0;i<n;i+)if(scorei<pMinScore) pMinScore=scorei;return pMinScore;int Averagescore(int score,int n) / 求平均分 int i;float aver;aver=score0;

33、for(i=1;i<n;i+)aver=aver+scorei;return aver/n;void Datasort(int score,int n) /分數由最高到最低排序 int i,j,temp;for(i=0;i<n-1;i+)for(j=i+1;j<n;j+)if(scorej>scorei)temp=scorej;scorej=scorei;scorei=temp;int main()int n=0;cout<<" 請輸入添加的學生人數 n( 無學生信息添加請輸入 0):"<<endl;cin>>n;

34、Student stuN;for(int m=0;m<n;m+)stum.input();ofstream out("f1.text",ios:out|ios:app); / 定義輸出文件流對象 out, 打開輸出文 件 f1.text 并添加學生信息if(!out) / 如果文件打開失敗, out 返回 0 值 cout<<"cannot open output file.n"abort(); / 退出程序for(int s=0;s<n;s+)out<<<<" "&l

35、t;<stus.sno<<" "<<stus.Math<<" "<<stus.English<<""<<stus.Cjj;out.close();Student stu2N;int score1N,score2N,score3N,score4N;打開輸入文件ifstream in("f1.text",ios:in); / 定義輸入文件流對象 in, f1.textif(!in) / 如果文件打開失敗, in 返回 0 值 cout<

36、<"cannot open input file.n"abort();int j=0;while(!in.eof() in>>>>stu2j.sno>>stu2j.Math>>stu2j.English>>stu2j.Cjj; score1j=stu2j.getMath();score2j=stu2j.getEnglish(); score3j=stu2j.getCjj();score4j=stu2j.Totalscore();j+;Datasort(score4,j); / 總分由高到低

37、排序menu(); / 菜單界面函數int t;docout<<" 請輸入菜單相應功能數字: "cin>>t;cout<<endl;if(t=1)int e;menu1();cout<<"* 學生成績各科及總分最高分 *"<<endl; docout<<" 請輸入功能 1 相應數字: " cin>>e; cout<<endl;if(e=11)cout<<setw(20)<<" 數 學 最 高 "&

38、lt;<setw(6)<<FindMaxscore(score1,j)<<endl;if(e=12)cout<<setw(20)<<" 英 語 最 高"<<setw(6)<<FindMaxscore(score2,j)<<endl;if(e=13)最高分: "<<setw(6)<<FindMaxscore(score3,j)<<endl;cout<<setw(20)<<"C+if(e=14) cout<

39、;<setw(20)<<" 總 分 最 高 分 "<<setw(6)<<FindMaxscore(score4,j)<<endl;if(e=15) break;if(e!=11&&e!=12&&e!=13&&e!=14&&e!=15) / 錯誤判斷 cout<<" 輸入錯誤! "<<endl;while(e);if(t=2)int f; menu2(); cout<<"* 學生成績各科及總分最

40、低分 *"<<endl;docout<<" 請輸入功能 2 相應數字: "cin>>f;cout<<endl;if(f=21)cout<<setw(20)<<" 數學最低分: "<<setw(6)<<FindMinscore(score1,j)<<endl; if(f=22)cout<<setw(20)<<" 英語最低分: "<<setw(6)<<FindMinscore

41、(score2,j)<<endl; if(f=23)cout<<setw(20)<<"C+ 最低分: "<<setw(6)<<FindMinscore(score3,j)<<endl; if(f=24)cout<<setw(20)<<" 總分最低分: "<<setw(6)<<FindMinscore(score4,j)<<endl; if(f=25)break;if(f!=21&&f!=22&&

42、;f!=23&&f!=24&&f!=25)cout<<" 輸入錯誤! "<<endl; while(f);if(t=3) int g;menu3();cout<<"* 學生成績各科及總分平均分 *"<<endl;docout<<" 請輸入功能 3 相應數字: cin>>g;cout<<endl;if(g=31)cout<<setw(20)<<"數學學科平均分"<<setw(6

43、)<<Averagescore(score1,j)<<endl;if(g=32)cout<<setw(20)<<"英語學科平均分"<<setw(6)<<Averagescore(score2,j)<<endl;if(g=33)cout<<setw(20)<<"C+學科平均分"<<setw(6)<<Averagescore(score3,j)<<endl;if(g=34)cout<<setw(20)&l

44、t;<" 總分平均分: "<<setw(6)<<Averagescore(score4,j)<<endl; if(g=35)break; if(g!=31&&g!=32&&g!=33&&g!=34&&g!=35)cout<<" 輸入錯誤! "<<endl;while(g);if(t=4)cout<<"* 學生成績總分排名及全體成員各科信息 *"<<endl;cout<<s

45、etw(10)<<" 姓名 "<<setw(10)<<" 學號 "<<setw(10)<<" 數學 "<<setw(10)<<" 英語 "<<setw(10)<<"C+"<<setw(10)<<" 總分 "<<setw(10)<<" 總分名次 "<<endl;for(int j=0;j<

46、;N;j+)for(int a=0;a<N;a+)if(stu2j.Totalscore()=score4a) cout<<setw(10)<<stu2j.getname()<<setw(10)<<stu2j.getsno()<<setw(10)<<stu2j.getMath() / 輸出學生各科成 績及總分信息<<setw(10)<<stu2j.getEnglish()<<setw(10)<<stu2j.getCjj()<<setw(10)<<stu2j.Totalscor e()<<setw(10)<<a+1<<endl;if(t=5)cout<<"* 學生成績總分分數段統計情況 *"<<endl;int T

溫馨提示

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

評論

0/150

提交評論