大型實驗報告(歌手比賽系統(tǒng))_第1頁
大型實驗報告(歌手比賽系統(tǒng))_第2頁
大型實驗報告(歌手比賽系統(tǒng))_第3頁
大型實驗報告(歌手比賽系統(tǒng))_第4頁
大型實驗報告(歌手比賽系統(tǒng))_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

大類根底課程大型實驗2023/2023(2)實驗題目歌手比賽系統(tǒng)學生姓名 學生學號學生班級任課教師提交日期計算機科學與技術(shù)學院歌手比賽系統(tǒng)實驗報告大型實驗的內(nèi)容歌手比賽系統(tǒng)〔SCS:SingerContestSystem〕用于對一次歌手比賽的成績進行管理,要求完成的主要的功能包括選手信息管理、評委打分管理??梢酝瓿沙煽兣判颉舶雌骄帧?,選手數(shù)據(jù)查詢,追加學生數(shù)據(jù),寫入數(shù)據(jù)文件等工作。要求使用學習過的C/C++程序設(shè)計的知識完成歌手比賽系統(tǒng)的設(shè)計與實現(xiàn)。運行環(huán)境歌手比賽系統(tǒng)〔SCS〕在VisualStudio2023平臺下開發(fā),操作系統(tǒng):Windows8.1。硬件環(huán)境:處理器:Intel(R)Core(TM)i5-5257MCPU@2.70GHz2.70GHz內(nèi)存:8.00GB系統(tǒng)類型:64位操作系統(tǒng)實驗課題分析〔主要的模塊功能、流程圖〕3.1歌手比賽系統(tǒng)的主要功能歌手比賽系統(tǒng)〔SCS〕主要功能為:選手信息管理、評委打分管理。可以完成成績排序〔按平均分〕,選手數(shù)據(jù)查詢,追加學生數(shù)據(jù),寫入數(shù)據(jù)文件等。詳細的系統(tǒng)功能結(jié)構(gòu)為圖1所示。歌手比賽系統(tǒng)SCS歌手比賽系統(tǒng)SCS菜單模塊評委模塊選手模塊菜單模塊評委模塊選手模塊圖1系統(tǒng)結(jié)構(gòu)圖系統(tǒng)各模塊的功能具體描述為:1、菜單模塊根據(jù)用戶需求進行選擇。菜單模塊包括:〔1〕輸入選手數(shù)據(jù);〔2〕評委打分;〔3〕成績排序〔按平均分〕;〔4〕數(shù)據(jù)查詢;〔5〕追加學生數(shù)據(jù);〔6〕寫入數(shù)據(jù)文件;〔7〕退出系統(tǒng)。選手模塊存儲選手的姓名、編號、一個評委類,以及該選手的平均分和總分。3、評委模塊存儲10個評委對一個選手的打分情況。計算總分功能:根據(jù)10個評委的打分〔去掉最高分和最低分〕,計算選手的總分。計算平均分功能:根據(jù)10個評委的打分〔去掉最高分和最低分〕,計算選手的平均分。還有2個輔助功能:尋找最高分和最低分。3.2系統(tǒng)分析及設(shè)計系統(tǒng)涉及對象有兩個根本類:選手類和評委類。還有一個菜單類??梢圆捎妹嫦?qū)ο蟮姆绞綄崿F(xiàn)歌手比賽系統(tǒng),根據(jù)不同的需求,分為選手類和評委類。其中選手類中以評委類為成員變量。系統(tǒng)的主要的類結(jié)構(gòu)如圖2所示。菜單類選手類菜單類選手類評委類評委類圖2系統(tǒng)主要類結(jié)構(gòu)圖分別設(shè)計菜單類、選手類、評委類,菜單類提供選擇功能。用文本文件進行數(shù)據(jù)的保存,需要保存的數(shù)據(jù)主要包括選手的編號、信息、平均分和排名等。3.3系統(tǒng)的實現(xiàn)〔1〕類的編寫系統(tǒng)工程名為:Test。包含了Student類〔選手類〕,Judge類〔圖書類〕兩個根本類,另設(shè)menu類,進行具體功能的選擇及實現(xiàn)。Student類包含選手的編號、姓名、評委的打分〔Judge聲明的對象obj〕、選手的總分和平均分。Judge類包含10個評委的打分。具體類結(jié)構(gòu)聲明如下:Student類:classStudent{public:voidsetID(stringID);voidsetName(stringname);voidsetObj(Judge&j);voiidsetSUM(doublesum);voidsetAVE(doubleave); stringgetID(); stringgetName(); JudgegetObj();doublegetSUM();doublegetAVE(); Student(Student&); Student(void); ~Student(void);private: stringID; stringname; Judgeobj;doubleSUM;doubleAVE;};Judge類classJudge{public:voidsetGrade(doubleg[10]);double*getGrade();voiddisplay();doublesumGrade();//計算總分doubleaveGrade();//計算平均分doublegetMax();//輔助函數(shù),尋找最高分doublegetMin();//輔助函數(shù),尋找最低分 Judge(void); Judge(Judge&); ~Judge(void);private:doublegrade[10];};Menu類:classmenu{public:voidselect();//選擇操作voidinputMessage();//輸入選手信息voidinputGrade();//評委打分voidsort();//根據(jù)選手成績進行排序voidconsult();//查詢某個選手的成績voidinsert();//插入新選手的信息和成績voidinput();//將選手數(shù)據(jù)寫入文件 menu(void); ~menu(void);private:intcount;//計數(shù),共有多少組數(shù)據(jù) Studentstu[MAX]; Judgejud[MAX];};〔3〕交互界面以及登錄菜單的實現(xiàn)系統(tǒng)運行開始的界面如圖5所示:圖5開始登錄界面主要通過選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)實現(xiàn)界面的前進和后退。例如,第一個登錄界面出現(xiàn)7個選擇:1.輸入選手數(shù)據(jù),2.評委打分,3.成績排序〔按平均分〕4.數(shù)據(jù)查詢5.追加選手數(shù)據(jù)6.寫入數(shù)據(jù)文件7.退出系統(tǒng)。用switchcase分別實現(xiàn),選擇之后轉(zhuǎn)到下一個界面。實驗調(diào)試、測試、運行記錄及分析系統(tǒng)在調(diào)試測試過程中遇到假設(shè)干問題,不過經(jīng)過仔細反復(fù)的檢查已經(jīng)消除各種bug。主要的測試經(jīng)過如下:開始頁面:在開始界面輸入“1〞即可跳轉(zhuǎn)到輸入選手信息界面,輸入選手信息。輸入選手信息完畢后,自動返回開始頁面。輸入“2〞,即可跳轉(zhuǎn)到評委打分頁面。為各選手打分。輸入分數(shù)完畢后,自動返回至開始頁面。輸入“3〞,跳轉(zhuǎn)到排序頁面,根據(jù)選手的平均分進行排名。排序完畢后,自動返回到開始頁面。輸入“4〞,跳轉(zhuǎn)到數(shù)據(jù)查詢頁面。輸入想查詢的選手的編號,即可得知該選手的10位評委的打分。查詢完畢后,自動跳轉(zhuǎn)到開始頁面。輸入“5〞,跳轉(zhuǎn)到追加選手數(shù)據(jù)頁面。輸入新插入的選手的編號及姓名,以及10個評委對該選手的打分。為驗證選手數(shù)據(jù)已更新,進行查詢操作及排序操作。輸入“6〞,將所有選手的信息,包括編號、信息、10個評委的打分,寫入數(shù)據(jù)文件。輸入“7〞,退出系統(tǒng)。容錯測試:1.如果輸入相同ID的選手:2.如果插入相同的選手:3.如果輸入了選手ID和姓名,但還未進行打分就進行排序:4.程序開始就選擇5,追加選手數(shù)據(jù),測試插入是否成功〔數(shù)據(jù)查詢和排序〕遇到的問題及解決方法如下:問題1:問題描述:很少使用文件的讀取方法,因此一開始在實現(xiàn)將信息寫入文件的功能時遇到了困難,不知如何下手。解決方法:利用網(wǎng)絡(luò)資源,搜索c++的讀寫文件方式,在稍作修改后,應(yīng)用到本次實驗中。成功實現(xiàn)了文件的讀寫。圖6調(diào)試測試問題1實驗總結(jié)我設(shè)計的歌手比賽系統(tǒng)根本滿足任務(wù)書的功能要求,類的結(jié)構(gòu)和關(guān)系清晰,功能完善,完成了歌手比賽系統(tǒng)的根本功能,能正常運行。存在的缺點主要是數(shù)據(jù)存儲方面,因評委只有十人,不存在大批量的數(shù)據(jù),因此采用根本的數(shù)組結(jié)構(gòu)存儲數(shù)據(jù)。其次在存儲選手信息方面,采用了類的數(shù)組方式,有浪費內(nèi)存的弊端,并且,一旦選手人數(shù)過多,也會影響程序效率??梢杂酶玫臄?shù)據(jù)存儲方式來存儲數(shù)據(jù),例如vector等。通過這次C++的大型實驗,我深刻的明白到:課本知識與實踐能力相結(jié)合的重要性。要想把一門專業(yè)課程學好,必須增強自己的動手實踐能力,更多的實踐才能讓我們的編程能力有更多的提高。并且,我們也要充分利用好網(wǎng)絡(luò)資源,寫代碼的過程其實是一個復(fù)習舊知識、學習新知識的過程,當我們遇到不明白的地方,或者對程序功能抱有疑問時,要學會自己去查找資料并且解決問題,而網(wǎng)絡(luò)資源能幫我們解答很多根本的疑問。充分利用好網(wǎng)絡(luò)的代碼資源,不斷充實自己、豐富自己的代碼知識。附錄:源代碼Judge.h#include<iostream>usingnamespacestd;classJudge{public: voidsetGrade(doubleg[10]); double*getGrade(); voiddisplay(); doublesumGrade();//計算總分 doubleaveGrade();//計算平均分 doublegetMax();//輔助函數(shù),尋找最高分 doublegetMin();//輔助函數(shù),尋找最低分 intjudgeN(); Judge(void); Judge(Judge&); ~Judge(void);private: doublegrade[10];};Judge.cpp#include"Judge.h"Judge::Judge(void){ for(inti=0;i<10;i++) grade[i]=0;}Judge::Judge(Judge&j){ for(inti=0;i<10;i++) grade[i]=j.grade[i];}Judge::~Judge(void){}voidJudge::setGrade(doubleg[10]){ for(inti=0;i<10;i++) { grade[i]=g[i]; }}double*Judge::getGrade(){ returngrade;}voidJudge::display(){ for(inti=0;i<10;i++) { cout<<"第"<<i+1<<"位評委的打分是:"<<grade[i]<<endl; }}doubleJudge::sumGrade(){ doublemax=getMax(); doublemin=getMin(); doubleSum=0; for(inti=0;i<10;i++) { Sum=Sum+grade[i]; } Sum=Sum-max; Sum=Sum-min; returnSum;}doubleJudge::aveGrade(){ doubleAve; doublemax=getMax(); doublemin=getMin(); doubleSum=0; for(inti=0;i<10;i++) { Sum=Sum+grade[i]; } Sum=Sum-max; Sum=Sum-min; Ave=Sum/8; returnAve;}doubleJudge::getMax()//輔助函數(shù),尋找最高分{ doublemax=0; for(inti=0;i<10;i++) { if(max<grade[i]) max=grade[i]; } returnmax;}doubleJudge::getMin()//輔助函數(shù),尋找最低分{ doublemin=100; for(inti=0;i<10;i++) { if(min>grade[i]) min=grade[i]; } returnmin;}intJudge::judgeN(){ if(grade[0]==0) return1; else return0;}Student.h#include<iostream>usingnamespacestd;#include<string>#include"Judge.h"classStudent{public: voidsetID(stringID); voidsetName(stringname); voidsetObj(Judge&j); voidsetSUM(doublesum); voidsetAVE(doubleave); stringgetID(); stringgetName(); JudgegetObj(); doublegetSUM(); doublegetAVE(); intjudgeNull();//判斷是否為空 Student(Student&); Student(void); ~Student(void);private: stringID; stringname; Judgeobj; doubleSUM; doubleAVE;};Student.cpp#include"Student.h"Student::Student(void){}Student::Student(Student&s){ ID=s.getID(); name=s.getName(); AVE=s.getAVE(); SUM=s.getSUM(); obj=s.getObj();}Student::~Student(void){}voidStudent::setID(stringid){ ID=id;}voidStudent::setName(stringn){ name=n;}voidStudent::setObj(Judge&j){ obj=Judge(j);}voidStudent::setSUM(doublesum){ SUM=sum;}voidStudent::setAVE(doubleave){ AVE=ave;}stringStudent::getID(){ returnID;}stringStudent::getName(){ returnname;}doubleStudent::getSUM(){ returnSUM;}doubleStudent::getAVE(){ returnAVE;}JudgeStudent::getObj(){ returnobj;}intStudent::judgeNull(){ if(ID.empty()&&name.empty()) return1; else return0;}menu.h#include<iostream>#include<fstream>#include"Student.h"#defineMAX1000usingnamespacestd;classmenu{public:voidselect();//選擇操作 voidinputMessage();//輸入選手信息 voidinputGrade();//評委打分 voidsort();//根據(jù)選手成績排序〔平均分〕 voidconsult();//查詢某個選手的成績 voidinsert();//插入某個新選手的信息和成績 voidinput();//將選手數(shù)據(jù)寫入文件 menu(void); ~menu(void);private: intcount;//計數(shù),共有多少組數(shù)據(jù) Studentstu[MAX]; Judgejud[MAX];};menu.cpp#include"StdAfx.h"#include"menu.h"menu::menu(void){ count=0; newcount=0; ifstreamf("C:\\Users\\apple\\Desktop\\data.txt"); if(!f) { cout<<"openerror!"<<endl; exit(1); } f>>count; for(inti=0;i<count;i++) { stringfID,fname; f>>fID>>fname; stu[i].setID(fID); stu[i].setName(fname); doublex[10]; for(intj=0;j<10;j++) { f>>x[j]; } jud[i].setGrade(x); stu[i].setObj(jud[i]); stu[i].setAVE(jud[i].aveGrade()); stu[i].setSUM(jud[i].sumGrade()); } f.close();}menu::~menu(void){}voidmenu::select(){ while(1) { charn; cout<<"************************"<<"歡送進入歌手比賽系統(tǒng)"<<"************************"<<endl<<endl; cout<<"\t\t\t1.輸入選手數(shù)據(jù)"<<endl; cout<<"\t\t\t2.評委打分"<<endl; cout<<"\t\t\t3.成績排序〔按平均分〕"<<endl; cout<<"\t\t\t4.數(shù)據(jù)查詢"<<endl; cout<<"\t\t\t5.追加選手數(shù)據(jù)"<<endl; cout<<"\t\t\t6.寫入數(shù)據(jù)文件"<<endl; cout<<"\t\t\t7.退出系統(tǒng)"<<endl; cout<<endl<<endl<<endl; cout<<"請選擇操作工程:"; cin>>n; switch(n) { case'1': inputMessage();break; case'2': inputGrade();break; case'3': sort();break; case'4': consult();break; case'5': insert();break; case'6': input();break; case'7': return;break; default: { cout<<"輸入指令錯誤"<<endl; } } }}voidmenu::inputMessage(){ cout<<"************************"<<"歡送進入選手信息頁面"<<"************************"<<endl<<endl; cout<<"請輸入共有幾位選手:"; intn; cin>>n; cout<<endl<<endl<<endl; cout<<"請輸入各選手信息〔包括編號及姓名〕"<<endl; stringID; stringname; for(inti=count;i<(n+count);i++) { cin>>ID>>name; //以下判斷ID是否重復(fù) boolpank=true; for(intj=0;j<count;j++) { if(ID==stu[j].getID()) { pank=false; cout<<"已存在ID相同的選手,請重新輸入!"<<endl; return; } } stu[i].setID(ID); stu[i].setName(name); }// count=n+count; newcount=n; cout<<endl<<endl<<endl;}voidmenu::inputGrade(){ if(stu[0].judgeNull()) { cout<<"無選手信息!操作錯誤!返回開始頁面。"<<endl<<endl<<endl; } else { cout<<"************************"<<"歡送進入評委打分頁面"<<"************************"<<endl<<endl; cout<<"請各位評委打分〔共10位評委〕:"<<endl; for(inti=count;i<(count+newcount);i++) { doublegrade[10]; cout<<"編號為"<<stu[i].getID()<<"的選手的分數(shù):"<<endl; for(intj=0;j<10;j++) { cin>>grade[j]; } jud[i].setGrade(grade); stu[i].setObj(jud[i]); stu[i].setAVE(jud[i].aveGrade()); stu[i].setSUM(jud[i].sumGrade()); } count=count+newcount; cout<<endl<<endl<<endl; }}voidmenu::sort(){ if(jud[0].judgeN()) { cout<<"無選手分數(shù)信息!操作錯誤!返回開始頁面。"<<endl<<endl<<endl; } else { cout<<"************************"<<"歡送進入排序頁面!"<<"************************"<<endl<<endl; cout<<"各選手按照平均分從高到低的排序如下"<<endl; //以下進行冒泡排序 Studenttemp; Student*newStu=newStudent[count];//排序用的新的數(shù)組 for(intp=0;p<count;p++) { newStu[p]=stu[p]; } for(inti=0;i<count-1;i++) { for(intj=i+1;j<count;j++) { doubleave1=newStu[i].getAVE(); doubleave2=newStu[j].getAVE(); if(ave1<ave2) { temp=newStu[i]; newStu[i]=newStu[j]; newStu[j]=temp; } } } for(intk=0;k<count;k++) { stringID=newStu[k].getID(); stringname=newStu[k].getName(); cout<<"編號:"<<ID<<"姓名:"<<name<<endl; } cout<<endl<<endl<<endl; }}voidmenu::consult(){ cout<<"************************"<<"歡送進入查詢頁面"<<"************************"<<endl<<endl; cout<<"請輸入想查詢的選手的編號:"<<endl; stringID; cin>>ID; intindex;//標記查詢到的該選手的下標 cout<<endl; for(inti=0;i<count;i++) { if(ID==stu[i].getID()) { index=i; if(stu[i].judgeNull()) { cout<<"無選手分數(shù)信息!操作錯誤!返回開始頁面。"<<endl<<endl<<endl; } else { cout<<"編號為:"<<ID<<"的選手的成績?nèi)缦?<<endl<<endl; stu[index].getObj().display(); cout<<"總分(去掉最高分和最低分)為:"<<stu[index].getObj().sumGrade()<<endl; cout<<"平均分(去掉最高分和最低分)為:"<<stu[index].getObj().aveGrade()<<endl; break; } } if(i==count-1) cout<<"不存在

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論