《高級(jí)程序設(shè)計(jì)語(yǔ)言》課程設(shè)計(jì)- 學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
河南工程學(xué)院高級(jí)程序設(shè)計(jì)語(yǔ)言課程設(shè)計(jì)成果報(bào)告學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)學(xué)生學(xué)號(hào): 學(xué)生姓名: 學(xué) 院: 計(jì)算機(jī)學(xué)院 專業(yè)班級(jí): 軟件工程1341班 專業(yè)課程: 高級(jí)程序設(shè)計(jì)語(yǔ)言 指導(dǎo)教師: 2014 年 6 月 27 日題 目學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)考核項(xiàng)目考核內(nèi)容得分平時(shí)考核(30分)出勤情況、態(tài)度、效率;知識(shí)掌握情況、基本操作技能、知識(shí)應(yīng)用能力、獲取知識(shí)能力系統(tǒng)設(shè)計(jì)(20分)分析系統(tǒng)的功能模塊編程調(diào)試(20分)實(shí)現(xiàn)系統(tǒng)的各個(gè)功能模塊,并完成調(diào)試回答問(wèn)題(15分)回答老師針對(duì)課程設(shè)計(jì)提出的問(wèn)題課程設(shè)計(jì)報(bào)告撰寫(xiě)(10分)嚴(yán)格按照規(guī)范要求完成課程設(shè)計(jì)報(bào)告源代碼(5分)按照規(guī)范要求完成課程設(shè)計(jì)源代碼的排版總 評(píng) 成 績(jī)指導(dǎo)教師評(píng)語(yǔ):日期: 年 月 日目 錄第1章 系統(tǒng)設(shè)計(jì)的概述和目的11.1系統(tǒng)設(shè)計(jì)的目的11.2 系統(tǒng)設(shè)計(jì)的任務(wù)1第2章 系統(tǒng)實(shí)現(xiàn)思路22.1 系統(tǒng)需求分析22.2 系統(tǒng)功能分析22.3 系統(tǒng)性能要求3第3章 系統(tǒng)詳細(xì)設(shè)計(jì)43.1模塊設(shè)計(jì)與分析43.2主函數(shù)設(shè)計(jì)53.3特色算法分析6第4章 系統(tǒng)調(diào)試運(yùn)行15課程設(shè)計(jì)體會(huì)19參考文獻(xiàn)20第1章 系統(tǒng)設(shè)計(jì)的概述和目的在計(jì)算機(jī)領(lǐng)域中,任何好的創(chuàng)意和設(shè)計(jì)最終都需要通過(guò)高水平的程序設(shè)計(jì)實(shí)現(xiàn),因此學(xué)習(xí)程序設(shè)計(jì)是計(jì)算機(jī)及相關(guān)專業(yè)學(xué)生必備的基本技能之一。1.1系統(tǒng)設(shè)計(jì)的目的C+課程設(shè)計(jì)是計(jì)算機(jī)應(yīng)用技術(shù)專業(yè)的重要實(shí)踐性環(huán)節(jié)之一,是學(xué)生學(xué)習(xí)該課程后的一次全面綜合訓(xùn)練。通過(guò)本課程設(shè)計(jì)的實(shí)踐,更進(jìn)一步總結(jié)C+課程學(xué)習(xí)中的的數(shù)據(jù)類型、程序結(jié)構(gòu)、數(shù)組、函數(shù)、指針、結(jié)構(gòu)體等基本概念,掌握其使用方法。掌握面向?qū)ο蟪绦蛟O(shè)計(jì)中有關(guān)類、對(duì)象、繼承、重載、多態(tài)性、輸入輸出流類體系、文件操作的基本概念,初步學(xué)會(huì)用類與對(duì)象這種面向?qū)ο蟮某绦蛟O(shè)計(jì)方法編寫(xiě)應(yīng)用程序。培養(yǎng)使用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法編寫(xiě)計(jì)算機(jī)程序的能力。同時(shí),也鍛煉學(xué)生的團(tuán)隊(duì)分工、協(xié)作能力,讓同學(xué)們?cè)趯?shí)踐的過(guò)程中,提高發(fā)現(xiàn)問(wèn)題、分析問(wèn)題、解決問(wèn)題的能力。學(xué)會(huì)團(tuán)結(jié)互助,共同合作,培養(yǎng)良好的團(tuán)隊(duì)精神。1.2 系統(tǒng)設(shè)計(jì)的任務(wù)(1)設(shè)計(jì)四個(gè)類,包括學(xué)生類(描述學(xué)生基本信息)、成績(jī)類、班級(jí)類、課程類(描述課程信息:課程編號(hào),科目名稱,如高等數(shù)學(xué),大學(xué)英語(yǔ)等);(2)學(xué)生成績(jī)及課程信息用文件保存,程序執(zhí)行時(shí)從文件讀入;(3)能按學(xué)期、按班級(jí)完成對(duì)學(xué)生成績(jī)的錄入、修改,能按班級(jí)統(tǒng)計(jì)學(xué)生的成績(jī);(4)求學(xué)生的總分及平均分,并能根據(jù)學(xué)生的平均成績(jī)進(jìn)行排序,能查詢學(xué)生成績(jī),不及格科目及學(xué)生名單;能按班級(jí)輸出學(xué)生的成績(jī)單。 設(shè)置學(xué)生的成績(jī)信息:學(xué)生學(xué)號(hào)、姓名、所選課程名稱、平時(shí)成績(jī)、期末成績(jī)、平時(shí)成績(jī)所占百分比 計(jì)算學(xué)生總評(píng)成績(jī):總評(píng)成績(jī)=平時(shí)成績(jī)*平時(shí)成績(jī)所占百分比+期末成績(jī)*(1-平時(shí)成績(jī)所占百分比) 顯示學(xué)生的姓名、所選課程名稱以及平時(shí)成績(jī)、期末成績(jī)和總評(píng)成績(jī)信息。分單人顯示和以班輸出(班成績(jī)單格式輸出到文件) 注意:至少應(yīng)包含一個(gè)班、30人、三門課 第2章 系統(tǒng)實(shí)現(xiàn)思路系統(tǒng)主要根據(jù)學(xué)生成績(jī)管理的需要,而建立一個(gè)“學(xué)生成績(jī)管理系統(tǒng)”,以方便對(duì)成績(jī)的各項(xiàng)管理操作。2.1 系統(tǒng)需求分析學(xué)生成績(jī)管理系統(tǒng)可以用來(lái)管理規(guī)模較大的成績(jī)信息,對(duì)學(xué)生的成績(jī)信息進(jìn)行維護(hù)和統(tǒng)計(jì)。系統(tǒng)的目標(biāo)用戶為老師或其他需要統(tǒng)計(jì)各種信息的人員。系統(tǒng)可以極大的減少用戶的工作量,為用戶節(jié)省更多的時(shí)間,讓用戶在幾秒鐘內(nèi)獲得各種統(tǒng)計(jì)信息,在第一時(shí)間對(duì)學(xué)生成績(jī)有全面的了解。系統(tǒng)給用戶提供了簡(jiǎn)單而實(shí)用的功能,如圖2-1所示。學(xué)生成績(jī)管理系統(tǒng)操作查詢成績(jī)統(tǒng)計(jì)按總成績(jī)排名錄入增加刪除修改總成績(jī)查詢姓名、平均分查詢每個(gè)學(xué)生的平均成績(jī)各科不及格的人數(shù)輸出所有學(xué)生的成績(jī) 2-1模塊框架圖2.2 系統(tǒng)功能分析根據(jù)課程設(shè)計(jì)題目的要求,以及我們小組成員的討論,最終確定此程序有以下功能: 1、資料維護(hù):系統(tǒng)維護(hù)包括對(duì)各個(gè)學(xué)生姓名、成績(jī)、學(xué)號(hào)的錄入操作,對(duì)數(shù)據(jù)表中的信息進(jìn)行瀏覽。 2、成績(jī)查詢:可以對(duì)學(xué)生成績(jī)進(jìn)行詳細(xì)查詢。 3、排列顯示:包括統(tǒng)計(jì)學(xué)生排名成績(jī)等。(1)能夠?qū)崿F(xiàn)學(xué)生學(xué)號(hào)、姓名、成績(jī)的錄入(2)能夠?qū)崿F(xiàn)對(duì)學(xué)生信息的瀏覽、查找、刪除(3)能夠?qū)崿F(xiàn)對(duì)學(xué)生信息按學(xué)號(hào)順序顯示,成績(jī)排名(4)能夠?qū)Ω骺瞥煽?jī)統(tǒng)計(jì)情況輸出2.3 系統(tǒng)性能要求根據(jù)學(xué)生成績(jī)管理系統(tǒng)的標(biāo)準(zhǔn),以及考慮到用戶的需求,所以我們?cè)诰帉?xiě)系統(tǒng)程序時(shí)注意其實(shí)用性如下:(1)系統(tǒng)安全、可靠(2)功能齊全(3)操作方便(4)易于維護(hù)和擴(kuò)充第3章 系統(tǒng)詳細(xì)設(shè)計(jì)要開(kāi)發(fā)學(xué)生成績(jī)管理信息系統(tǒng),首先需要進(jìn)行需求分析和總體設(shè)計(jì),分析系統(tǒng)的使用對(duì)象和用戶需求,設(shè)計(jì)系統(tǒng)的體系結(jié)構(gòu),決定使用的開(kāi)發(fā)工具和后臺(tái)數(shù)據(jù)庫(kù),規(guī)劃項(xiàng)目開(kāi)發(fā)進(jìn)程。3.1模塊設(shè)計(jì)與分析(1)輸入學(xué)生資料模塊主要功能用來(lái)對(duì)學(xué)生的成績(jī)進(jìn)行收集和輸入。在學(xué)生信息保存在系統(tǒng)中的前提下,成績(jī)錄入需要輸入學(xué)生資料,比如班級(jí),學(xué)號(hào),姓名。在準(zhǔn)確輸入學(xué)生資料后,就可以對(duì)該學(xué)生的各科成績(jī)進(jìn)行錄入。該學(xué)生各科成績(jī)輸入成功后,系統(tǒng)會(huì)提示是否繼續(xù)進(jìn)行操作,如果想繼續(xù)輸入學(xué)生成績(jī)就輸入y,不想再輸入學(xué)生成績(jī)的話就輸入n,再輸入n之后,系統(tǒng)返回到主菜單。 (2)輸出學(xué)生資料模塊主要功能用來(lái)對(duì)學(xué)生的成績(jī)進(jìn)行輸出。在系統(tǒng)已經(jīng)錄入了學(xué)生資料成績(jī)的前提下,使用該功能可以顯示所有學(xué)生的信息,資料等等。具體包括學(xué)生的班級(jí),學(xué)號(hào),姓名和各科成績(jī)。在查看學(xué)生的資料,成績(jī)各方面的信息后,按任意鍵就可以返回到主菜單。(3) 按學(xué)生姓名進(jìn)行排列模塊主要功能是用來(lái)對(duì)學(xué)生的資料按姓名進(jìn)行排序。在系統(tǒng)保存學(xué)生資料,成績(jī)的前提下,使用此功能可以對(duì)學(xué)生的資料按姓名進(jìn)行排序,這樣就方便查找姓氏相同或是相近的同學(xué)的資料。(4) 添加學(xué)生資料模塊主要功能是用來(lái)添加學(xué)生資料,成績(jī)。如果系統(tǒng)有保存學(xué)生資料的情況下,想錄入學(xué)生成績(jī)的話,就不用添加學(xué)生資料這模塊。如果系統(tǒng)沒(méi)有保存該學(xué)生信息的話,就要使用此模塊,在成功添加學(xué)生資料后,就可以對(duì)該學(xué)生進(jìn)行其他的操作。 (5)按姓名查找,刪除該學(xué)生資料模塊主要功能是用來(lái)刪除學(xué)生資料。在系統(tǒng)保存學(xué)生資料的前提下,想刪除某學(xué)生的資料,可以輸入學(xué)生姓名,系統(tǒng)查找該學(xué)生資料后,就可以刪除了。由于學(xué)生輟學(xué),畢業(yè)等原因,及時(shí)對(duì)系統(tǒng)進(jìn)行更新,刪除一些沒(méi)用的信息,可以使系統(tǒng)更加優(yōu)化。 (6)查找并顯示學(xué)生資料模塊主要功能是用來(lái)查找學(xué)生資料。在系統(tǒng)保存了某學(xué)生資料的前提下,想要查找該學(xué)生資料,可以輸入該學(xué)生姓名,這樣系統(tǒng)就會(huì)顯示該學(xué)生資料和各科成績(jī)等信息。 (7)按姓名查找,修改學(xué)生資料模塊主要功能是用來(lái)修改學(xué)生資料。在系統(tǒng)保存了某學(xué)生資料的前提下,想要查找該學(xué)生資料,可以輸入該學(xué)生姓名,系統(tǒng)就會(huì)顯示該學(xué)生資料和各科成績(jī)等信息,這樣就可以修改該學(xué)生的資料,成績(jī)等信息。 (8)從文件中讀入數(shù)據(jù)模塊主要功能是用來(lái)從文件中讀入學(xué)生數(shù)據(jù)。由于一些資料可以用Word文檔或Excel表格輸入,故在此模塊中增加了導(dǎo)入數(shù)據(jù)的功能。這樣就方便很多,不用把學(xué)生資料一個(gè)一個(gè)添加,節(jié)省了很多時(shí)間精力。 (9)儲(chǔ)存學(xué)生資料并退出系統(tǒng)模塊主要功能是用來(lái)儲(chǔ)存學(xué)生資料。在對(duì)系統(tǒng)進(jìn)行一系列操作,比如添加、刪除、修改學(xué)生資料后,對(duì)系統(tǒng)的最新操作進(jìn)行保存,及時(shí)更新系統(tǒng),方便下一次的操作。3.2主函數(shù)設(shè)計(jì)在main()函數(shù)中主要是通過(guò)”switch(menu()”選擇判斷來(lái)調(diào)用相關(guān)功能模塊。系統(tǒng)的運(yùn)行是在一個(gè)永真的循環(huán)里進(jìn)行的,只有在主界面并選擇“退出本系統(tǒng)”時(shí),才會(huì)跳出永真循環(huán),并退出程序。主函數(shù)在程序中起核心作用,本程序的主函數(shù)主要完成了界面的設(shè)計(jì)、調(diào)用成績(jī)類的函數(shù)計(jì)算總成績(jī)、平均成績(jī)和總評(píng)成績(jī),然后是定義指針?lè)奖愫竺嬲{(diào)用類的數(shù)據(jù)成員,還定義了全局變量用于輸入數(shù)據(jù)的下標(biāo)。(1)首先是介紹界面設(shè)計(jì)和選擇操作的設(shè)計(jì): void main()cout<<" 歡迎進(jìn)入學(xué)生成績(jī)管理系統(tǒng) "<<endl;cout<<"請(qǐng)選擇你需要的操作!"<<endl;cout<<"操作:"<<endl;cout<<"(1)數(shù)據(jù)錄入"<<endl;cout<<"(2)增加學(xué)生"<<endl;cout<<"(3)刪除學(xué)生"<<endl;cout<<"(4)修改數(shù)據(jù)"<<endl;cout<<"查詢:"<<endl;cout<<"(5)按總成績(jī)查詢"<<endl;cout<<"(6)按平均分查詢"<<endl;cout<<"(7)按姓名查詢"<<endl;cout<<"(8)輸出所以學(xué)生的數(shù)據(jù)"<<endl;cout<<"成績(jī)統(tǒng)計(jì)"<<endl;cout<<"(9)每個(gè)學(xué)生的平均成績(jī)"<<endl;cout<<"(10)各科不及格人數(shù)"<<endl;cout<<"排名"<<endl;cout<<"(11)按總分查詢排名"<<endl;cout<<"(12)退出"<<endl;這里是查詢的主頁(yè)面的界面設(shè)計(jì),頁(yè)面輸出以后都會(huì)顯示這些操作選項(xiàng)供用戶選擇,達(dá)到了簡(jiǎn)潔明了的效果。3.3特色算法分析功能:定義菜單函數(shù),通過(guò)輸出函數(shù)顯示系統(tǒng)功能。利用switch語(yǔ)句實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。 1.算法思路:switch語(yǔ)句的執(zhí)行流程是:首先計(jì)算switch后面圓括號(hào)中表達(dá)式的值,然后用此值依次與各個(gè)case的常量表達(dá)式比較,若圓括號(hào)中表達(dá)式的值與某個(gè)case后面的常量表達(dá)式的值相等,就執(zhí)行此case后面的語(yǔ)句,執(zhí)行后遇break語(yǔ)句就退出switch語(yǔ)句。 代碼: void main() /主函數(shù)調(diào)用。 int n=0; for(;) switch(menu() case 1: 輸入學(xué)生資料 cout<<setw(15)<<" "<<"輸入學(xué)生資料"<<endl; n=Input(stu,n); break; case 2: 輸出所有學(xué)生資料 cout<<setw(15)<<" "<<"輸出所有學(xué)生資料"<<endl;Display(stu,n); break; case 3: 按姓名排序 cout<<setw(15)<<" "<<"按姓名排序"<<endl; Sort(stu,n); cout<<setw(15)<<" " system("pause"); break; case 4: 插入學(xué)生資料 cout<<setw(15)<<" "<<"插入學(xué)生資料"<<endl; n=Insert(stu,n); cout<<setw(15)<<" " system("pause"); break; case 5: 刪除學(xué)生資料 cout<<setw(15)<<" "<<"刪除學(xué)生資料"<<endl; cout<<setw(15)<<" "<<"輸入他(她)的姓名:" n=Delete(stu,n); cout<<setw(15)<<" " system("pause"); break; case 6: 查找學(xué)生cout<<setw(15)<<" "<<"查找學(xué)生"<<endl; Query(stu,n); cout<<setw(15)<<" " system("pause"); break; case 7: 修改學(xué)生資料 cout<<setw(15)<<" "<<"修改學(xué)生資料"<<endl; cout<<setw(15)<<" "<<"輸入你要修改的學(xué)生的姓名:" n=Xiugai(stu,n); system("pause"); break; case 8: 從文件中讀入數(shù)據(jù) cout<<setw(15)<<" "<<"從文件中讀入數(shù)據(jù)"<<endl; n=AddfromText(stu,n); break; case 9: 將所有資料寫(xiě)入文件 cout<<setw(15)<<" "<<"將所有資料寫(xiě)入文件"<<endl; WritetoText(stu,n); cout<<setw(15)<<" " system("pause"); break; (2)首先定義一個(gè)類來(lái)來(lái)定義數(shù)據(jù)函數(shù)的錄入class Tstu char name20; int number; float math,cpp,english,average,sum; public: Tstu() ; Tstu ( char n20, int num,float ma,float cj,float eng ) ; float getsum(); float getaver(); friend void main(); ; Tstu:Tstu ( char n20, int num,float ma,float cj,float eng ) strcpy(name,n); number=num; math=ma; cpp=cj; english=eng; float Tstu:getsum() /得到總分的函數(shù) sum=cpp+english+math; return sum; float Tstu:getaver() average=getsum()/3; return average; (3)然后用switch函數(shù)判斷和選擇case 1: 數(shù)據(jù)的錄入case 2: 增加學(xué)生數(shù)據(jù)case 3:刪除學(xué)生信息case 4:修改數(shù)據(jù)case 5:按總分查詢case 6:按姓名查詢case 7:輸出所有學(xué)生數(shù)據(jù)case 8:統(tǒng)計(jì)每個(gè)學(xué)生的平均成績(jī)case 9:統(tǒng)計(jì)各學(xué)科不及格人數(shù)case 10:按總分排名2.下面是操作選項(xiàng)的選擇下標(biāo)的設(shè)計(jì),設(shè)計(jì)全局變量可以很好的控制下標(biāo)的選擇,而且定義的指向各個(gè)類的指針可以方便后面操作程序的編寫(xiě)。(1)cout<<"選擇操作請(qǐng)選擇相應(yīng)操作前的阿拉伯?dāng)?shù)字!"<<endl;int p=0;/全局變量,用于選擇菜單時(shí)的輸入 char w;/全局變量,用于在大項(xiàng)中選擇是否繼續(xù)操作 student *s10000;/類定義的指針將所錄入的數(shù)據(jù)按類中的形式分別存儲(chǔ)subjic *d10000;result *f10000;ofstream *file10000; int i=0;/全局變量,用于做每個(gè)錄入數(shù)據(jù)的下標(biāo) int j=0;int chrisl=0;/用于判斷do-while語(yǔ)句do/判斷輸入是否正確cin>>p;if(p>=1&&p<=12)chrisl=1;elsecout<<"!輸入錯(cuò)誤,請(qǐng)重新輸入:"<<endl;while(chrisl=0);doswitch(p)(2)這里是各個(gè)操作的具體編譯:其中數(shù)據(jù)錄入、數(shù)據(jù)刪除、按總成績(jī)查詢、按平均分查詢、按姓名查詢都是以文件的方式讀入,其他的按總成績(jī)排序和不及格人數(shù)的輸出case 1:/數(shù)據(jù)錄入char c;/用于在小項(xiàng)中選擇是否繼續(xù)操作char name30;/定義各個(gè)數(shù)據(jù)int number;float math,cpp,chinese;float pingshicj;float zpcj;上面是數(shù)據(jù)成員的定義,接下來(lái)是具體操作的編譯:docout<<"請(qǐng)輸入姓名"<<endl;cin>>name;cout<<"請(qǐng)輸入學(xué)號(hào)"<<endl;cin>>number;cout<<"請(qǐng)輸入數(shù)學(xué)成績(jī)"<<endl;cin>>math;cout<<"請(qǐng)輸入c+成績(jī)"<<endl;cin>>cpp;cout<<"請(qǐng)輸入語(yǔ)文成績(jī)"<<endl;cin>>chinese;cout<<"請(qǐng)輸入平時(shí)成績(jī)"<<endl;cin>>pingshicj;(3)以下是查詢操作的編寫(xiě)首先為按總分查詢,以指針來(lái)調(diào)用類中數(shù)據(jù),其他的查詢操作都是以相同的方式設(shè)計(jì)完成,因代碼篇幅過(guò)多這里不一一列出 case 5:/按總分查詢 int j=0;float SUM;char c;int flag; if(i=0) cout<<"數(shù)據(jù)庫(kù)中沒(méi)有數(shù)據(jù),請(qǐng)輸入后再操"<<endl;break; do flag=0; cout<<"請(qǐng)輸入你要查詢的學(xué)生的總成績(jī):"<<endl; cin>>SUM; for(int j=0;j<i;j+) if(fj->getsum()=SUM) flag=1; cout<<"你要查詢的學(xué)生是:"<<(*sj).name<<endl; cout<<"該生的信息為:"<<endl; cout<<"學(xué)號(hào):"<<(*sj).num<<"數(shù)學(xué)分?jǐn)?shù):"<<(*dj).math<<"c+分?jǐn)?shù):"<<(*dj).cpp<< "語(yǔ)文分?jǐn)?shù):"<<(*dj).chinese<<"平時(shí)成績(jī):"<<(*fj).pingshicj<<endl; if(flag=0)cout<<"對(duì)不起!您要查詢的學(xué)生不存在!"<<endl; cout<<"是否繼續(xù)查?(y/n):" cin>>c; if(c!='y'&&c!='n') cout<<"指令錯(cuò)誤!請(qǐng)重新輸入!"<<endl; cin>>c; ; while(c='y'); break; 按平均分查詢操作的設(shè)計(jì),您可以方便的查詢到你所希望的平均分的學(xué)生輸出所以學(xué)生數(shù)據(jù)操作case 6:/輸出所有學(xué)生數(shù)據(jù)cout<<"所有學(xué)生數(shù)據(jù)如下:"<<endl;ifstream file;file.open("f1.txt",ios:in);cout<<file.rdbuf();file.close();break;統(tǒng)計(jì)學(xué)生的平時(shí)成績(jī),以一個(gè)if語(yǔ)句判斷系統(tǒng)內(nèi)是否有數(shù)據(jù),如果沒(méi)有數(shù)據(jù)需要重新輸入Case7:/統(tǒng)計(jì)每個(gè)學(xué)生的平均成績(jī)if(i=0)cout<<"系統(tǒng)中沒(méi)有輸入數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)!"<<endl;break;for(int m=0;m<i;m+)cout<<(*sm).name<<"學(xué)號(hào):"<<(*sm).number<<"總<<(*fm)分:".getsum()<<"平均分:"<<(*fm).getaver()<<"平時(shí)成績(jī):"<<(*fj).pingshicj<<endl; break; 統(tǒng)計(jì)不及格人數(shù),以if語(yǔ)句判斷是否大于60分case 8:/統(tǒng)計(jì)各學(xué)科不及格人數(shù)if(i=0)cout<<"系統(tǒng)中沒(méi)有輸入數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)!"<<endl;break;int m,n,k,j;m=0;n=0;k=0;for(j=0;j<i;j+) if(dj->math<60)m+; if(dj->cpp<60)n+;if(dj->chinese<60)k+; cout<<"數(shù)學(xué)不及格人數(shù)為:"<<m<<endl; cout<<"c+不及格人數(shù)為:"<<n<<endl; cout<<"語(yǔ)文不及格人數(shù)為:"<<k<<endl; break; 第4章 系統(tǒng)調(diào)試運(yùn)行首先進(jìn)行模塊測(cè)試,在這個(gè)系統(tǒng)中,我將我的幾個(gè)模塊作為一個(gè)單獨(dú)的實(shí)體來(lái)測(cè)試,從而保證每個(gè)模塊作為一個(gè)單元能正確運(yùn)行。進(jìn)而進(jìn)行子系統(tǒng)測(cè)試,子系統(tǒng)測(cè)試是把經(jīng)過(guò)單元測(cè)試的模塊放在一起形成一個(gè)子系統(tǒng)來(lái)測(cè)試。模塊相互間的協(xié) 行系統(tǒng)測(cè)試,系統(tǒng)測(cè)試是把經(jīng)過(guò)測(cè)試的子系統(tǒng)裝配成一個(gè)完整的系統(tǒng)來(lái)測(cè)試,在這個(gè)過(guò)程中我發(fā)現(xiàn)設(shè)計(jì)和編碼的一些錯(cuò)誤,并改正。進(jìn)入主界面,首先可以看到,主界面共有11個(gè)操作選項(xiàng),11個(gè)小選項(xiàng)又分為4個(gè)大的選項(xiàng):操作、查詢、成績(jī)統(tǒng)計(jì)和排名,當(dāng)用戶看完操作選項(xiàng)以后是一條溫馨的提示:選擇操作請(qǐng)選擇相應(yīng)的阿拉伯?dāng)?shù)字。如圖4-1所示。用戶選擇的是數(shù)字“1”,接下來(lái)就是輸入學(xué)生姓名等信息了。4-1 登陸界面圖輸入完學(xué)生信息以后界面顯示的信息,可以看到,當(dāng)輸入完成時(shí)系統(tǒng)會(huì)自動(dòng)顯示出學(xué)生信息,如圖4-2所示。4-2學(xué)生數(shù)據(jù)的錄入圖選擇刪除操作,可以發(fā)現(xiàn)當(dāng)完成刪除操作后都會(huì)提醒您是否要繼續(xù),如圖4-3。 4-3學(xué)生數(shù)據(jù)的刪除圖數(shù)據(jù)的修改操作,您可以發(fā)現(xiàn)當(dāng)完成刪除操作后都會(huì)提醒您是否要繼續(xù),如圖4-4所示。4-4學(xué)生數(shù)據(jù)的修改圖執(zhí)行按總成績(jī)查詢操作,需要先輸入總成績(jī),如圖4-5所示。 4-5按總成績(jī)查詢圖執(zhí)行按學(xué)生姓名操作,需要先輸入學(xué)生姓名,如圖4-6所示。 4-6按姓名查詢圖每個(gè)學(xué)生平均成績(jī)的輸出,如圖4-7所示。 4-7每個(gè)學(xué)生的平均成績(jī)圖各科不及格人數(shù)的輸出如圖4-8所示。 4-8各科不及格的人數(shù)圖系統(tǒng)的退出,如圖4-9所示。4-9退出圖課程設(shè)計(jì)體會(huì)通過(guò)這次的實(shí)訓(xùn)我深刻的體會(huì)到了要想把程序做好要有清晰的思路有較強(qiáng)的語(yǔ)言組織能力,一絲的馬虎否則會(huì)前功盡棄。程序的檢查和系統(tǒng)的調(diào)用程序?qū)懲旰蟛⒉荒鼙WC它一定能運(yùn)行,所以要對(duì)它進(jìn)行調(diào)試發(fā)現(xiàn)其中的弊端并作出相應(yīng)的修改以完善程序的目的。經(jīng)過(guò)努力,課程設(shè)計(jì)基本完成了。通過(guò)本次實(shí)訓(xùn),我對(duì)所學(xué)的C+語(yǔ)言知識(shí)有同學(xué)請(qǐng)教,借助網(wǎng)絡(luò)等等。實(shí)驗(yàn)過(guò)程中也走了很多的彎路,由于在開(kāi)始設(shè)計(jì)的時(shí)候思路不時(shí)很清晰,對(duì)于一些問(wèn)題不能很好的提出解決問(wèn)題的方法,在設(shè)計(jì)過(guò)程中,代碼總是重復(fù)的修改,在很多問(wèn)題上,代碼并不時(shí)最優(yōu)的。相信在以后的學(xué)習(xí)中,隨著知識(shí)的增多,問(wèn)題會(huì)逐漸得到解決。在課程設(shè)計(jì)的實(shí)踐中,學(xué)到很多有用的知識(shí),也積累了不少寶貴的經(jīng)驗(yàn)。我相信本次的課程設(shè)計(jì)會(huì)使我以后再各種方面都有很大的提高。參考文獻(xiàn)1 譚浩強(qiáng).C+面向?qū)ο蟪绦蛟O(shè)計(jì).清華大學(xué)出版社2 譚浩強(qiáng).C+面向?qū)ο蟪绦蛟O(shè)計(jì)習(xí)題上機(jī)指導(dǎo).清華大學(xué)出版社3 Kenneth C.Louden.編譯原理及實(shí)踐.機(jī)械工業(yè)出版社4 H.M.Deitel(美) P.J.Deitel(美).C+大學(xué)教程.電子工業(yè)出版社5 Herbert Schildt.C+編譯藝術(shù).清華大學(xué)出版社 6 Al Stevens Clayton Walnum(美).標(biāo)準(zhǔn)C+寶典.電子工業(yè)出版社#include<iostream> #include<string> #include<fstream>#include<sstream>#include<iomanip>using namespace std; class Tstu /通過(guò)定義一個(gè)類來(lái)定義數(shù)據(jù)錄入的函數(shù) char name20; int number; float math,cpp,english,average,sum; public: Tstu() ; Tstu ( char n20, int num,float ma,float cj,float eng ) ; float getsum();/得到總分的函數(shù) float getaver(); /得到平均分的函數(shù) friend void main(); /將主函數(shù)定義為友元函數(shù),方便訪問(wèn)類中的成員 ; Tstu:Tstu ( char n20, int num,float ma,float cj,float eng ) strcpy(name,n); /得到姓名 number=num; /得到學(xué)號(hào) math=ma; /得到數(shù)學(xué)成績(jī) cpp=cj; /得到c+成績(jī) english=eng; /得到英語(yǔ)成績(jī) float Tstu:getsum() /得到總分的函數(shù) sum=cpp+english+math; return sum; float Tstu:getaver() /得到平均分的函數(shù) average=getsum()/3; return average; void main() cout<<"*歡迎來(lái)到學(xué)生成績(jī)查詢系統(tǒng)*"<<endl; cout<<"請(qǐng)選擇您需要的操作!"<<endl; /菜單的輸出 cout<<"操作:"<<endl; cout<<"(1)數(shù)據(jù)錄入"<<endl; cout<<"(2)增加學(xué)生"<<endl; cout<<"(3)刪除學(xué)生"<<endl; cout<<"(4)修改數(shù)據(jù)"<<endl; cout<<"查詢:"<<endl; cout<<"(5)按總成績(jī)查詢"<<endl; cout<<"(6)按姓名查詢"<<endl; cout<<"(7)輸出所有學(xué)生的數(shù)據(jù)"<<endl; cout<<"成績(jī)統(tǒng)計(jì):"<<endl; cout<<"(8)每個(gè)學(xué)生的平均成績(jī)"<<endl; cout<<"(9)各科不及格人數(shù)"<<endl; cout<<"排名:"<<endl; cout<<"(10)按總分查詢排名"<<endl; cout<<"(11)退出"<<endl; cout<<"選擇相關(guān)操作請(qǐng)輸入相對(duì)的括號(hào)里的阿拉伯?dāng)?shù)字及字母!"<<endl; int p=0; /全局變量,用于選擇菜單時(shí)的輸入 char w;/全局變量,用于在大項(xiàng)中選擇是否繼續(xù)操作 Tstu *s100; /類定義的指針將所錄入的數(shù)據(jù)按類中的形式分別存儲(chǔ) ofstream *file100; int i=0; /全局變量,用于做每個(gè)錄入數(shù)據(jù)的下標(biāo) int j=0; int chris1=0; /用于判斷dowhile語(yǔ)句 do /判斷輸入是否正確 cin>>p; if(p>=1&&p<=11) chris1=1; else cout<<"指令錯(cuò)誤!請(qǐng)重新輸入:"<<endl; while(chris1=0); do switch(p) case 1: /數(shù)據(jù)的錄入 char c; /用于在小項(xiàng)中選擇是否繼續(xù)操作 char name20; int number; float math,cpp,english; do cout<<"請(qǐng)輸入姓名:"<<endl; cin>>name; cout<<"請(qǐng)輸入學(xué)號(hào):"<<endl; cin>>number; cout<<"請(qǐng)輸入數(shù)學(xué)成績(jī):"<<endl; cin>>math; cout<<"請(qǐng)輸入C+成績(jī):"<<endl; cin>>cpp; cout<<"請(qǐng)輸入英語(yǔ)成績(jī):"<<endl; cin>>english; fstream outfile,infile; /作一個(gè)文本文檔在文件夾中用于顯示所錄入的數(shù)據(jù) outfile.open("f1.txt",ios:out|ios:app); if(!file) cout<<"f1.txt can not open.n" return; outfile<<name<<" "<<"學(xué)號(hào):"<<number<<" "<<"數(shù)學(xué)成績(jī):"<<math<<" "<<"C+成績(jī):"<<cpp<<" "<<"外語(yǔ)成績(jī):"<<english<<endl; outfile.close(); infile.open("f1.txt",ios:in); if(!file) /判斷文件是否打開(kāi) cout<<"f1.txt can not open.n" return; char ch; while(infile.get(ch) cout<<ch; cout<<endl; infile.close(); j+; si=new Tstu(name, number,math, cpp, english); i+; cout<<"數(shù)據(jù)錄入成功,想繼續(xù)錄入嗎(y/n)"<<endl; cin>>c; chris1=0; do if(c!='y'&&c!='n') cout<<"指令錯(cuò)誤!請(qǐng)重新輸入!"<<endl; cin>>c; else chris1=1; while(chris1=0); while(c='y'); /重復(fù)輸入 break; case 2: /增加學(xué)生數(shù)據(jù) char name20; int number; float math,cpp,english; char c; do cout<<"請(qǐng)輸入您要增加的學(xué)生的姓名:"<<endl; cin>>name; cout<<"請(qǐng)輸入你要增加的學(xué)生的學(xué)號(hào):"<<endl; cin>>number; cout<<"請(qǐng)輸入數(shù)學(xué)成績(jī):"<<endl; cin>>math; cout<<"請(qǐng)輸入C+成績(jī):"<<endl; cin>>cpp; cout<<"請(qǐng)輸入英語(yǔ)成績(jī):"<<endl; cin>>english; fstream outfile,infile; outfile.open("f1.txt",ios:out|ios:app); if(!file) cout<<"f1.txt can not open.n" return; outfile<<name<<" "<<"學(xué)號(hào):"<<number<<" "<<"數(shù)學(xué)成績(jī):"<<math<<" "<<"C+成績(jī):"<<cpp<<" "<<"外語(yǔ)成績(jī):"<<english<<endl; outfile.close(); infile.open("f1.txt",ios:in); if(!file) cout<<"f1.txt can not open.n" return; char h; while(infile.get(h) cout<<h; cout<<endl; infile.close(); j+; si=new Tstu(name,number, math, cpp, english); i+; cout<<"數(shù)據(jù)錄入成功,想繼續(xù)錄入嗎(y/n)"<<endl; cin>>c; if(c!='y'&&c!='n') cout<<"指令錯(cuò)誤!請(qǐng)重新輸入!"<<endl; cin>>c; while(c='y'); break; case 3:/刪除學(xué)生信息 char c; string xingming,line,str,name; do ifstream fin("f1.txt"); fstream outfile("f2.txt",ios:trunc|ios:out); /作一個(gè)文本文檔在文件夾中用于顯示所錄入的數(shù)據(jù) cout<<"請(qǐng)輸入您要?jiǎng)h除的學(xué)生的姓名:"<<endl; cin>>xingming; while(!fin.eof() ) getline(fin,line); istringstream stream(line); name = line.substr(0,line.find(" ",0);/找到名字,判斷是否相等 if(name != xingming) outfile<<line<<endl; outfile.close(); fin.close(); fstream f("f1.txt",ios:trunc|ios:out); ifstream outf("f2.txt"); f<<outf.rdbuf(); outf.close(); f.close(); cout<<"數(shù)據(jù)刪除成功,想繼續(xù)刪除嗎(y/n)"<<endl; cin>>c; if(c!='y'&&c!='n') cout<<"指令錯(cuò)誤!請(qǐng)重新輸入!"<<endl; cin>>c; while(c='y'); break; case 4:/修改數(shù)據(jù) string sname,line,str,name; int nu;float eng,ma,com;int flag;char c;if(i=0)cout<<"系統(tǒng)中沒(méi)有輸入數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)!"<<endl;break;do flag=0; cout<<"請(qǐng)輸入您要修改的學(xué)生的姓名:" cin>>name; fstream fin("f1.txt",ios:in); ofstream outfile("f.txt",ios:trunc|ios:out); cout<<endl; while(!fin.eof() ) /在文件中查找 getline(fin,line); istringstream stream(line); sname = line.substr(0,line.find(" ",0);if(name!=sname)outfile<<line<<endl;else flag=1; fin.close(); if(flag=1) cout<<"請(qǐng)輸入修改學(xué)生姓名及其新學(xué)號(hào),數(shù)學(xué),c+和英語(yǔ)成績(jī):"cin>>name>>nu>>ma>>com>>eng;cout<<endl;outfile<<name<<" "<<"學(xué)號(hào):"<<nu<<" "<<"數(shù)學(xué)成績(jī):"<<ma<<" "<<"C+成績(jī):"<<com<<" "<<"外語(yǔ)成績(jī):"<<eng<<endl; outfile.close();fstream outf("f1.txt",ios:trunc|ios:out);fstream inf("f.txt",ios:in);outf<<inf.rdbuf()<<endl;outf.close();inf.close(); if(flag=0)cout<<"對(duì)不起,您要修改的學(xué)生不存在!請(qǐng)查證后輸入!"<<endl; cout<<"想繼續(xù)修改嗎(y/n):" cin>>c; cout<<endl; if(c!='y'&&c!='n') cout<<" 指令錯(cuò)誤!請(qǐng)重新輸入!"<<endl<<" "cin>>c; while(c='y');break; case 5:/按總分查詢 int j=0;float SUM;char c;int flag; if(i=0)cout<<"系統(tǒng)中沒(méi)有輸入數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)!"<<endl;break; do flag=0; cout<<"請(qǐng)輸入您要查詢的學(xué)生的總成績(jī):"<<endl; cin>>SUM; for(int j=0;j<i;j+) if(sj->getsum()=SUM) flag=1;cout<<"您要查詢的學(xué)生是:"<<(*sj).name<<endl;cout<<"該生的信息為:"<<endl;cout<<" 學(xué)號(hào):"<<(*sj).number<<" 數(shù)學(xué)分?jǐn)?shù):"<<(*sj).math<<" c+分?jǐn)?shù):"<<(*sj).cpp<<" 英語(yǔ)分?jǐn)?shù)"<<(*sj).english<<endl; if(flag=0)cout<<"對(duì)不起!您要查詢的學(xué)生不存在!"<<endl;cout<<"是否繼續(xù)查?(y/n):"cin>>c;if(c!='y'&&c!='n')cout<<"指令錯(cuò)誤!請(qǐng)重新輸入!"<<endl; cin>>c; ; while(c='y'); break; case 6:/按姓名查詢 char n20;char c;int j=0;int flag; if(i=0)cout<<"系統(tǒng)中沒(méi)有輸入數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)!"<<endl;break; do flag=0; cout<<"請(qǐng)輸入要查詢的名字: "<<endl; cin>>n; for(int j=0;j<i;j+) if(strcmp(n,(*sj).name)=0)flag=1;cout<<"您要查詢的學(xué)生是:"<<(*sj).name<<endl;cout<<"該生的信息是:學(xué)號(hào):"<<(*sj).number<<" 數(shù)學(xué)分?jǐn)?shù):"<<(*sj).math<<"c+分?jǐn)?shù):"<<(*sj).cpp<<"英語(yǔ)分?jǐn)?shù):"<<(*sj).english<<endl; if(flag=0)cout<<"對(duì)不起您要查詢的學(xué)生不存在,請(qǐng)查證后再輸入!"<<endl;cout<<"您想繼續(xù)查詢嗎?(y/n):"cin>>c;if(c!='y'&&c!='n')cout<<"指令錯(cuò)誤!請(qǐng)重新輸入:"<<endl;cin>>c; while(c='y'); break; case 7:/輸出所有學(xué)生數(shù)據(jù) cout<<"所有學(xué)生數(shù)據(jù)如下:"<<endl; ifstream file; file.open("f1.txt",ios:in); cout<<file.rdbuf(); file.close(); break; case 8:/統(tǒng)計(jì)每個(gè)學(xué)生的平均成績(jī) if(i=0) cout<<"系統(tǒng)中沒(méi)有輸入數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)!"<<endl;break; for(int m=0;m<i;m+) cout<<(*sm).name<<" 學(xué)號(hào):"<<(*sm).number<<" 總分:"<<(*sm).getsum()<<" 均分:"<<(*sm).getaver()<<endl; break; case 9:/統(tǒng)計(jì)各學(xué)科不及格人數(shù) if(i=0) cout<<"系統(tǒng)中沒(méi)有輸入數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)!"<<endl;break; int m,n,k,j;m=0;n=0;k=0; for(j=0;j<i;j+) if(sj->math<60)m+; if(sj->cpp<60)n+; if(sj->english<60)k+;