《面向對象程序設計》課程設計報告學生成績管理系統(tǒng)_第1頁
《面向對象程序設計》課程設計報告學生成績管理系統(tǒng)_第2頁
《面向對象程序設計》課程設計報告學生成績管理系統(tǒng)_第3頁
《面向對象程序設計》課程設計報告學生成績管理系統(tǒng)_第4頁
《面向對象程序設計》課程設計報告學生成績管理系統(tǒng)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面向對象程序設計課程設計報告專 業(yè): 姓 名: 學 號: 指導教師: 二o一一 年 九 月 日一、課程設計問題描述設計完成一套學生成績管理系統(tǒng),要求能夠實現(xiàn)學生成績管理的基本功能,包括:學生成績的鍵盤錄入、學生成績的條件輸出、學生成績的條件抽取、學生成績的條件排序、條件修改。其中具體設計內容如下:(1)從鍵盤輸入學生基本信息(學號、姓名、英語成績、高數(shù)成績),計算每個學生的平均成績,并將數(shù)據(jù)存入文件student.txt文件中。(2)按如下格式輸出大于等于平均成績的學生信息: 學號 姓名 英語 高數(shù) 平均成績(3)將兩門可課都不及格的學生信息抽取出來,另存入文件bat.txt中。(4)提供按學

2、號進行查詢的功能。(5)盡可能使用運算符重載以簡化操作。(6)使用多文件結構和菜單操作,并考慮相應的操作權限。二、課程設計目的和要求:經過一學期對面向對象程序設計的初步學習,對于面向對象程序設計有了一定的編程基礎,為更好地理解和掌握面向對象程序設計,將通過為期一周的上機實踐編程,運用面向對象程序設計完成課程設計編程任務的同時,補充和完善面向對象程序設計的相關知識。三、系統(tǒng)環(huán)境(包括硬件環(huán)境和軟件環(huán)境)無。四、程序設計思想描述首先明確這是一個學生成績管理系統(tǒng),那么這個系統(tǒng)應該具備管理學生成績的基本功能。同時考慮到使用對象的不同,應考慮到權限方面的相應開放,為簡便用戶操作以及個人能力限制將采用文字

3、菜單模式。1、成績管理系統(tǒng)成績(中心)學生(以學生為管理對象)學生屬性和方法。*學生類 屬性包括:學號、姓名、英語成績、高數(shù)成績、平均成績、名次(以鏈表的當前位置為計)。*學生類 方法包括:構造函數(shù)、析構函數(shù)、設置函數(shù)、修改函數(shù)以及獲取相應屬性的函數(shù)。2、操作權限教師教師特權。*教師特權 包括:成績錄入、條件抽取、條件修改、排序以及刪除。操作權限學生普通權限。*教師與學生共同權限 包括:條件查詢。3、操作菜單:(一級菜單)1、教師(需要帳號驗證),2、學生,0、退出系統(tǒng)(二級菜單)1.1、成績錄入,1.2、查詢,1.3、成績修改,1.4排序,1.5、查看數(shù)據(jù),1.6、刪除1.0、返回上一層菜單

4、(三級菜單)1.1.1、單個錄入,1.1.2、批量錄入,1.1.0、返回上一層菜單(三級菜單)1.2.1、學號查詢,1.2.2、范圍查詢、1.2.3、不及格查詢(兩門都低于60分)(包含保存功能),1.2.0、返回上一層菜單(三級菜單)1.3.1、英語成績修改,1.3.2、高數(shù)成績修改,1.3.0、返回上一層菜單(三級菜單)1.4.1、平均分成績排序,1.4.2、英語成績排序,1.4.3、高數(shù)成績排序,1.4.4、學號排序,1.4.0、返回上一層菜單(三級菜單)1.6.1、按學號刪除,1.6.2、按姓名刪除,1.6.0、返回上一層菜單(二級菜單)2.1、個人查詢,2.2、相近查詢,2.0、返回

5、上一層菜單(三級菜單)2.2.1、平均分相近查詢,2.2.2、英語相近查詢,2.2.3、高數(shù)相近查詢,2.2.0、返回上一層菜單幾點說明:1、在進入二級菜單時先從文件中讀取數(shù)據(jù),若沒有數(shù)據(jù)則只能允許選擇教師工作模式。2、進入教師工作模式需要驗證碼,設置密碼為123456,目前不支持密碼修改。3、將所有功能函數(shù)設計模塊化,提高代碼利用率。4、利用模塊化的功能函數(shù),可以實現(xiàn)函數(shù)間的相互調用,實現(xiàn)菜單工作模式,大大降低編程難度,同時因為目前絕大多數(shù)電腦的cpu、內存等資源的性能比早期的計算機有了很大地提高,完全可以滿足合理的函數(shù)調用。5、為實現(xiàn)學生成績的排序功能,將采取鏈表的工作方式,同時利用此模式

6、實現(xiàn)其他功能。6、學生屬性中的學號與姓名將采用字符竄變量來標記以應對不同的學號和姓名模式。五、程序結構(包括類設計、主程序設計及流程圖)學生類的設計:屬性:學號、姓名、英語成績、高數(shù)成績、平均成績、排名、指針域方法:學號、姓名、英語成績、高數(shù)成績相應的修改函數(shù),獲取屬性的相關函數(shù),構造及析構函數(shù)。鏈表類的設計:屬性:鏈表頭、鏈表長度、鏈表是否排序、當前結點在鏈表中的排名。方法:增加結點的函數(shù),按學號、英語成績、高數(shù)成績排序、查詢的函數(shù),保存鏈表的函數(shù),讀取數(shù)據(jù)的函數(shù),以學號、姓名刪除結點的函數(shù),獲取排名的函數(shù),獲取屬性值的相關函數(shù)。幾點說明:1、 將鏈表類作為學生類的友元類可以實現(xiàn)在鏈表方法中

7、操作學生類,降低編程難度。2、 關于主程序的設計,由于采用的是菜單操作模式,關鍵在于功能的模塊化,也就是類相關功能的實現(xiàn),故主程序的設計將會相對簡單,只要安排好相應函數(shù)之間的調用即可實現(xiàn)相應的功能。3、 關于流程圖,采用上述菜單功能即可實現(xiàn)所有流程的切換,以下將給出工作時的菜單流程。六、程序測試案例一級菜單教師二級菜單(有數(shù)據(jù))教師二級菜單(無數(shù)據(jù))學生二級菜單增加結點菜單查詢菜單排序菜單修改菜單刪除菜單相近查詢菜單七、設計中遇到的問題及解決方案1、為了解決菜單的返回及流程的銜接,我采用了函數(shù)調用的方法。2、為了解決由于學號和姓名不同形式造成的影響,我采用了字符串變量的方法來記錄相關的信息,同

8、時借用字符串中的方法find_first_of()來檢查菜單選擇的輸入是否正確,這點也可以應用到輸入姓名和學號時進行檢查。3、在進行不及格同學的信息收集的時候,為了避免影響到鏈表,同時又需要利用現(xiàn)成的鏈表方法來操作,所以采用重新定義一個鏈表對象來裝載收集到的信息。4、在對鏈表的結點進行排序的時候,為簡化操作,定義一個空白結點,插入鏈表頭部,在操作完畢后對空白結點給予刪除。5、為了達到權限的控制問題,采用了密碼驗證的簡單方法,而為了實現(xiàn)密碼驗證則是采用了字符串變量的比較。八、程序源代碼見附錄。九、總結和體會經過一周的課程設計訓練,個人的編程能力得到了很好的考驗,同時也對軟件開發(fā)的過程有了一個大致

9、的了解。一周的設計學習,我發(fā)現(xiàn),軟件開發(fā)前的需求分析是至關重要的,需求分析的深淺往往能決定一個軟件的好壞。盡管在開始編程之前,本人花了一個早上的時間來構思分析,但在后期的開發(fā)設計中,仍然發(fā)現(xiàn)功能缺陷,為此還是花費了不少功夫來修修補補,而在此工程中,往往會出現(xiàn)一些貫穿整個程序的問題,而這種缺陷往往是致命的,除了盡可能修補之外,有時候往往需要重新構思,不論是前者還是后者,這都無異于重新編寫程序,而這往往容易削弱個人的編程興致,而這也是一個十分負面的影響,由此可見,軟件開發(fā)前的需求分析不論是對自己還是對程序都是至關重要的,這點在團隊協(xié)作中尤其得到體現(xiàn)?;蛟S個人開發(fā)軟件的時候容易產生邊寫邊想,便想邊寫

10、的習慣,而這也是受需求分析好壞的影響。同時,在完成課程設計的基本要求,但為了提升自己的能力,磨練自己,對自己提出了相對較高的要求,要求自己開發(fā)出功能較完善的程序,而這次的課程設計也基本達到了自己的要求,相對而言還是比較滿意的。以此同時,我強烈感覺到所學的知識實在是有限,而此次的課程設計無非是把有限的知識加以利用罷了。十、參考文獻(按“作者,書名,出版社,出版時間”格式逐一列出,如下:)1 、陳波 吉根林c語言程序設計教程 中國鐵道出版社 2010年2 、譚浩強 c+程序設計 清華大學出版社 2010附錄stdafx.h#include#include#include#includeiomani

11、pusing namespace std;extern class link; /引用性聲明/定義一個學生類class studentpublic:friend link;student();student(string cnum,string cname,float cenglish,float cmath);int changenum(); /修改學號,修改成功返回1int changename(); /修改姓名,修改成功返回1int changeenglish(); /修改英語,修改成功返回1int changemath(); /修改高數(shù),修改成功返回1int changedouble(

12、); /同時修改英語,高數(shù),修改成功返回1int getrank(); /獲取當前排名,失敗返回0student * getnext(); /獲取下一個對象地址string getnum(); /獲取當前對象學號string getname(); /獲取當前對象姓名float getaverage(); /獲取當前對象平均分float getenglish(); /獲取當前對象英語成績float getmath(); /獲取當前對象高數(shù)成績student(); /創(chuàng)建析構函數(shù)private:string num; /學號string name; /姓名float english; /英語成績f

13、loat math; /高數(shù)成績float average; /平均成績int rank; /排名(以平均分為準)student* next; /結點指針域;/定義一個鏈表類class linkpublic:link();int addone(); /增加一個結點,頭部插入法int addmore(int n); /增加多個結點int sortbyaverage(); /排序結點(平均分),降序為準(冒泡排序)int sortbyenglish(); /排序結點(英語)int sortbymath(); /排序結點(高數(shù))int sortbynum(); /排序結點(學號),以升序排列stud

14、ent * searchbynum(); /查找結點(學號),查找成功返回查找對象student * searchbyname(); /查找結點(姓名),查找成功返回查找對象,采用鏈表遍歷查找int savelink(); /保存鏈表,成功返回1int savebat(); /保存不及格學生信息int readlink(); /讀取鏈表int getlen(); /計算鏈表長度int delbynum(); /刪除結點,通過學號,刪除成功返回1int delbyname(); /刪除結點,通過姓名,刪除成功返回1void showone(student* p); /顯示結點,此處用運算符重載v

15、oid showlink(student* p); /顯示鏈表int getrankbyaverage(); /經排序后獲取平均分排名,排名成功返回1int getrankbyenglish(); /經排序后獲取英語排名,排名成功返回1int getrankbymath(); /經排序后獲取高數(shù)排名,排名成功返回1void searchbat(); /搜索兩門都不及格學生float getallaverage(); /計算獲取平均分的平均分float getenglishaverage(); /計算獲取英語平均分float getmathaverage(); /計算獲取高數(shù)平均分link();

16、 /創(chuàng)建析構函數(shù)student* head; /定義一個鏈表頭private:int flag; /標記當前結點的位置int len; /當前鏈表長度int sortflag; /檢查是否已經排序,0表示未排序;/定義菜單選項void thirdmenu(); /三級菜單void secondmenu_t(); /教師二級菜單void secondmenu_s(); /學生二級菜單void firstmenu( link &link ); /一級菜單void menu( link &link );/操作菜單界面void greet(); /問候界面void checkid( link &lin

17、k); /驗證身份,默認密碼123456void thirdmenu_add( link &link ); /教師三級菜單void thirdmenu_sort( link &link );void thirdmenu_change( link &link );void thirdmenu_changebynum( link &link );void thirdmenu_changebyname( link &link );void thirdmenu_changebymath( link &link );void thirdmenu_changebyenglish( link &link )

18、;void thirdmenu_sortbynum( link &link );void thirdmenu_sortbymath( link &link );void thirdmenu_sortbyenglish( link &link );void thirdmenu_sortbyaverage( link &link );void thirdmenu_search( link &link );void thirdmenu_addone( link &link ); /三級菜單,單個錄入void thirdmenu_addmore( link &link ); /三級菜單,批量錄入voi

19、d thirdmenu_searchbynum( link &link ); /三級菜單,學號查詢void thirdmenu_searchbyrank( link &link );void thirdmenu_searchbad( link &link );void secondmenu_t( link &link ); /教師二級菜單void secondmenu_ssearchone( link &link );void secondmenu_ssearchnear( link &link );void thirdmenu_searchmathnear( link &link );voi

20、d thirdmenu_searchenglishnear( link &link );void thirdmenu_searchaveragenear( link &link );void secondmenu_s( link &link ); /學生二級菜單void thirdmenu_searchbat( link &link );void thirdmenu_changebydouble( link &link );void fourthmenu_rankofaverage( link &link );void fourthmenu_rankofenglish( link &link

21、);void fourthmenu_rankofmath( link &link );void thirdmenu_del( link &link );void thirdmenu_delbynum( link &link );void thirdmenu_delbyname( link &link );stdafx.cpp#include stdafx.hstatic int id=0; /定義一個全局變量來記錄是否經過身份驗證static int read=0; /定義一個全巨變量來記錄是否讀取過student.txt中的數(shù)據(jù)/student 類的實現(xiàn)student:student() e

22、nglish=0; math=0; average=0; rank=0; next=null; student:student(string cnum,string cname,float cenglish,float cmath):num(cnum),name(cname),english(cenglish),math(cmath)average=(english+math)/2; /平均數(shù)在輸出時注意格式rank=0;next=null;int student:changenum() /修改學號,修改成功返回1string cnum;coutcnum;if( num = cnum )ret

23、urn 0;num=cnum;return 1;int student:changename() /修改姓名,修改成功返回1string cname;coutcname;if( name = cname )return 0;name=cname;return 1;int student:changeenglish() /修改英語,修改成功返回1float cenglish;coutcenglish;if( english = cenglish )return 0;english=cenglish;return 1;int student:changemath() /修改高數(shù),修改成功返回1fl

24、oat cmath;coutcmath;if( math = cmath )return 0;math=cmath;return 1;int student:changedouble() /同時修改英語,高數(shù),修改成功返回1if( changeenglish() & changemath() )return 1;return 0;int student:getrank() /獲取當前排名,失敗返回0return rank;student * student:getnext() /獲取下一個對象地址return next;float student:getaverage() /獲取當前對象平均分

25、return average;float student:getenglish() /獲取當前對象英語成績return english;float student:getmath() /獲取當前對象高數(shù)成績return math;string student:getnum() /獲取當前對象學號return num;string student:getname() /獲取當前對象姓名return name;student:student() /創(chuàng)建析構函數(shù)/link 類的實現(xiàn)link:link() head=null; flag=0; len=0; sortflag=1; int link:a

26、ddone() /增加一個結點,頭部插入法float cenglish=0,cmath=0;string cnum,cname;student* p;coutcnum;cincname;cincenglish;cincmath;p=new student(cnum,cname,cenglish,cmath);p-next=head;head=p;sortflag=0; /鏈表被改動,未排序getlen();cout數(shù)據(jù)錄入成功!endl;return len;int link:addmore(int n) /增加多個結點for(int i=0;in;i+)cout第i+1個n;addone()

27、;sortflag=0; /鏈表被改動,未排序getlen();cout成功錄入n個學生數(shù)據(jù)!next=head;head=p;student *pcurrent,*pbefore,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-next;while( n!=0 ) /用n 來判斷比較停止位置if( pcurrent-average average )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交換完后會

28、出現(xiàn)pcurrent 與 pafter 位置倒換pafter=pcurrent-next;/此時應該糾正elsepbefore=pbefore-next;/沒有交換則平行遷移指針pcurrent=pcurrent-next;pafter=pafter-next;n-;head=head-next;/delete p; /此結點如何刪除?sortflag=1; /鏈表被排序return len;int link:sortbyenglish() /排序結點(英語)getlen();student *p=new student(); /定義一個空白結點,插入鏈表以簡化排序操作,此結點不計入 len

29、中。p-next=head;head=p;student *pcurrent,*pbefore,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-next;while( n!=0 )/用n 來判斷比較停止位置if( pcurrent-english english )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交換完后會出現(xiàn)pcurrent 與 pafter 位置倒換pafter=pcurrent-next

30、;/此時應該糾正elsepbefore=pbefore-next;/沒有交換則平行遷移指針pcurrent=pcurrent-next;pafter=pafter-next;n-;head=head-next;/delete p; /此結點如何刪除?sortflag=1; /鏈表被排序return len;int link:sortbymath() /排序結點(高數(shù))getlen();student *p=new student(); /定義一個空白結點,插入鏈表以簡化排序操作,此結點不計入 len 中。p-next=head;head=p;student *pcurrent,*pbefore

31、,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-next;while( n!=0 ) /用n 來判斷比較停止位置if( pcurrent-math math )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交換完后會出現(xiàn)pcurrent 與 pafter 位置倒換pafter=pcurrent-next;/此時應該糾正elsepbefore=pbefore-next;/沒有交換則平行遷移指針pcurren

32、t=pcurrent-next;pafter=pafter-next;n-;head=head-next;/delete p; /此結點如何刪除?sortflag=1; /鏈表被排序return len;int link:sortbynum() /排序結點(學號),以升序排列getlen();student *p=new student(); /定義一個空白結點,插入鏈表以簡化排序操作,此結點不計入 len 中。p-next=head;head=p;student *pcurrent,*pbefore,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-

33、next;while( n!=0 )/用n 來判斷比較停止位置if( pcurrent-num pafter-num )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交換完后會出現(xiàn)pcurrent 與 pafter 位置倒換pafter=pcurrent-next;/此時應該糾正elsepbefore=pbefore-next;/沒有交換則平行遷移指針pcurrent=pcurrent-next;pafter=pafter-next;n-;head=

34、head-next;/delete p; /此結點如何刪除?sortflag=1; /鏈表被排序return len;student * link:searchbynum() /查找結點(學號),查找成功返回查找對象string cnum;coutcnum;student *p=head;while( p-num != cnum )p=p-next;if( p = null )cout未找到!endl;return null;cout成功找到!endl;showone(p);return p;student * link:searchbyname() /查找結點(姓名),查找成功返回查找對象,

35、采用鏈表遍歷查找string cname;coutcname;student *p=head;while( p-name != cname )p=p-next;if( p=null )cout未找到!endl;return null;cout成功找到!endl;showone(p);return p;int link:savelink() /保存鏈表,成功返回1ofstream outfile(student.txt,ios:out);if( ! outfile ) cout無法打開student.txt文件或不存在該文件,系統(tǒng)退出!endl;system( pause );exit( 0 )

36、;student *p=head;while( p != null )outfilenum name english mathnext;outfile.close();cout數(shù)據(jù)成功保持!endl;return 1;int link:savebat() /保存鏈表,成功返回1ofstream outfile(bat.txt,ios:out);if( ! outfile ) cout無法打開student.txt文件或不存在該文件,系統(tǒng)退出!endl;system( pause );exit( 0 );student *p=head;while( p != null )outfilenum n

37、ame english math averagenext;outfile.close();return 1;int link:readlink() /讀取鏈表ifstream infile(student.txt,ios:in);if( ! infile ) cout無法打開student.txt文件或無法建立該文件,系統(tǒng)退出!cnum;infilecname;infilecenglish;infilecmath;if( cnum.length() = 0 & cname.length() = 0)break;p=new student(cnum,cname,cenglish,cmath);p

38、-next=head;head=p;cenglish=0,cmath=0; /讀完后初始化,避免影響下一次閱讀infile.close();if( head = null ) /沒有讀取數(shù)據(jù)時,head 指向 nullcout沒有數(shù)據(jù)可導入endl;/沒有數(shù)據(jù)導入,read可以不標記為1return 0;elsecout成功導入數(shù)據(jù)next;return len;int link:delbynum() /刪除結點,通過學號,刪除成功返回1student *p=searchbynum(),*help;if( p = null )cout刪除失敗!next = null ) /空結點特殊處理hel

39、p=head;while( help-next-next != null)help=help-next;help-next=null;delete p;cout成功刪除!next;*help=*p;help-next=p-next;delete p;cout成功刪除!endl;getlen();return 1;int link:delbyname() /刪除結點,通過姓名,刪除成功返回1student *p=searchbyname(),*help;if( p = null )cout刪除失敗!next = null ) /空結點特殊處理help=head;while( help-next-

40、next != null)help=help-next;help-next=null;delete p;cout成功刪除!next;*help=*p;help-next=p-next;delete p;cout成功刪除!endl;getlen();return 1;void link:showone(student* p) /顯示結點,此處用運算符重載if( p != null )coutrank != 0 )cout 排名endl;elsecoutendl;coutsetiosflags( ios:left ); /格式化輸出coutsetw( 10 )numsetw( 10 )namesetw( 10 )englishsetw( 10 )mathsetw( 10 )average;if( p-rank=0 )coutendl;elsecoutsetw( 10 )rankendl;elsecout沒有數(shù)據(jù)可供輸出!endl;void link:showlink(student* p) /顯示鏈表if( p

溫馨提示

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

評論

0/150

提交評論