大型实验报告歌手比赛系统_第1页
大型实验报告歌手比赛系统_第2页
大型实验报告歌手比赛系统_第3页
大型实验报告歌手比赛系统_第4页
大型实验报告歌手比赛系统_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...---可修编.大类根底课程大型实验2014/2015(2)实验题目歌手比赛系统学生学生学号学生班级任课教师提交日期计算机科学与技术学院..歌手比赛系统实验报告大型实验的容歌手比赛系统〔SCS:SingerContestSystem〕用于对一次歌手比赛的成绩进展管理,要求完成的主要的功能包括选手信息管理、评委打分管理。可以完成成绩排序〔按平均分〕,选手数据查询,追加学生数据,写入数据文件等工作。要求使用学习过的C/C++程序设计的知识完成歌手比赛系统的设计与实现。运行环境歌手比赛系统〔SCS〕在VisualStudio2010平台下开发,操作系统:Windows8.1。硬件环境:处理器:Intel(R)Core(TM)i5-5257MCPU2.70GHz2.70GHz存:8.00GB系统类型:64位操作系统实验课题分析〔主要的模块功能、流程图〕3.1歌手比赛系统的主要功能歌手比赛系统〔SCS〕主要功能为:选手信息管理、评委打分管理。可以完成成绩排序〔按平均分〕,选手数据查询,追加学生数据,写入数据文件等。详细的系统功能构造为图1所示。歌手比赛系统SCS歌手比赛系统SCS菜单模块评委模块选手模块菜单模块评委模块选手模块图1系统构造图系统各模块的功能具体描述为:1、菜单模块根据用户需求进展选择。菜单模块包括:〔1〕输入选手数据;〔2〕评委打分;〔3〕成绩排序〔按平均分〕;〔4〕数据查询;〔5〕追加学生数据;〔6〕写入数据文件;〔7〕退出系统。选手模块存储选手的、编号、一个评委类,以及该选手的平均分和总分。3、评委模块存储10个评委对一个选手的打分情况。计算总分功能:根据10个评委的打分〔去掉最高分和最低分〕,计算选手的总分。计算平均分功能:根据10个评委的打分〔去掉最高分和最低分〕,计算选手的平均分。还有2个辅助功能:寻找最高分和最低分。3.2系统分析及设计系统涉及对象有两个根本类:选手类和评委类。还有一个菜单类。可以采用面向对象的方式实现歌手比赛系统,根据不同的需求,分为选手类和评委类。其中选手类中以评委类为成员变量。系统的主要的类构造如图2所示。菜单类选手类菜单类选手类评委类评委类图2系统主要类构造图分别设计菜单类、选手类、评委类,菜单类提供选择功能。用文本文件进展数据的保存,需要保存的数据主要包括选手的编号、信息、平均分和排名等。3.3系统的实现〔1〕类的编写系统工程名为:Test。包含了Student类〔选手类〕,Judge类〔图书类〕两个根本类,另设menu类,进展具体功能的选择及实现。Student类包含选手的编号、、评委的打分〔Judge声明的对象obj〕、选手的总分和平均分。Judge类包含10个评委的打分。具体类构造声明如下: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();//辅助函数,寻找最高分doublegetMin();//辅助函数,寻找最低分 Judge(void); Judge(Judge&); ~Judge(void);private:doublegrade[10];};Menu类:classmenu{public:voidselect();//选择操作voidinputMessage();//输入选手信息voidinputGrade();//评委打分voidsort();//根据选手成绩进展排序voidconsult();//查询某个选手的成绩voidinsert();//插入新选手的信息和成绩voidinput();//将选手数据写入文件 menu(void); ~menu(void);private:intcount;//计数,共有多少组数据 Studentstu[MAX]; Judgejud[MAX];};〔3〕交互界面以及登录菜单的实现系统运行开场的界面如图5所示:图5开场登录界面主要通过选择构造和循环构造实现界面的前进和后退。例如,第一个登录界面出现7个选择:1.输入选手数据,2.评委打分,3.成绩排序〔按平均分〕4.数据查询5.追加选手数据6.写入数据文件7.退出系统。用switchcase分别实现,选择之后转到下一个界面。实验调试、测试、运行记录及分析系统在调试测试过程中遇到假设干问题,不过经过仔细反复的检查已经消除各种bug。主要的测试经过如下:开场页面:在开场界面输入"1〞即可跳转到输入选手信息界面,输入选手信息。输入选手信息完毕后,自动返回开场页面。输入"2〞,即可跳转到评委打分页面。为各选手打分。输入分数完毕后,自动返回至开场页面。输入"3〞,跳转到排序页面,根据选手的平均分进展排名。排序完毕后,自动返回到开场页面。输入"4〞,跳转到数据查询页面。输入想查询的选手的编号,即可得知该选手的10位评委的打分。查询完毕后,自动跳转到开场页面。输入"5〞,跳转到追加选手数据页面。输入新插入的选手的编号及,以及10个评委对该选手的打分。为验证选手数据已更新,进展查询操作及排序操作。输入"6〞,将所有选手的信息,包括编号、信息、10个评委的打分,写入数据文件。输入"7〞,退出系统。容错测试:1.如果输入一样ID的选手:2.如果插入一样的选手:3.如果输入了选手ID和,但还未进展打分就进展排序:4.程序开场就选择5,追加选手数据,测试插入是否成功〔数据查询和排序〕遇到的问题及解决方法如下:问题1:问题描述:很少使用文件的读取方法,因此一开场在实现将信息写入文件的功能时遇到了困难,不知如何下手。解决方法:利用网络资源,搜索c++的读写文件方式,在稍作修改后,应用到本次实验中。成功实现了文件的读写。图6调试测试问题1实验总结我设计的歌手比赛系统根本满足任务书的功能要求,类的构造和关系清晰,功能完善,完成了歌手比赛系统的根本功能,能正常运行。存在的缺点主要是数据存储方面,因评委只有十人,不存在大批量的数据,因此采用根本的数组构造存储数据。其次在存储选手信息方面,采用了类的数组方式,有浪费存的弊端,并且,一旦选手人数过多,也会影响程序效率。可以用更好的数据存储方式来存储数据,例如vector等。通过这次C++的大型实验,我深刻的明白到:课本知识与实践能力相结合的重要性。要想把一门专业课程学好,必须增强自己的动手实践能力,更多的实践才能让我们的编程能力有更多的提高。并且,我们也要充分利用好网络资源,写代码的过程其实是一个复习旧知识、学习新知识的过程,当我们遇到不明白的地方,或者对程序功能抱有疑问时,要学会自己去查找资料并且解决问题,而网络资源能帮我们解答很多根本的疑问。充分利用好网络的代码资源,不断充实自己、丰富自己的代码知识。附录:源代码Judge.h#include<iostream>usingnamespacestd;classJudge{public: voidsetGrade(doubleg[10]); double*getGrade(); voiddisplay(); doublesumGrade();//计算总分 doubleaveGrade();//计算平均分 doublegetMax();//辅助函数,寻找最高分 doublegetMin();//辅助函数,寻找最低分 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()//辅助函数,寻找最高分{ doublemax=0; for(inti=0;i<10;i++) { if(max<grade[i]) max=grade[i]; } returnmax;}doubleJudge::getMin()//辅助函数,寻找最低分{ 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();//根据选手成绩排序〔平均分〕 voidconsult();//查询某个选手的成绩 voidinsert();//插入某个新选手的信息和成绩 voidinput();//将选手数据写入文件 menu(void); ~menu(void);private: intcount;//计数,共有多少组数据 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<<"************************"<<"欢送进入歌手比赛系统"<<"************************"<<endl<<endl; cout<<"\t\t\t1.输入选手数据"<<endl; cout<<"\t\t\t2.评委打分"<<endl; cout<<"\t\t\t3.成绩排序〔按平均分〕"<<endl; cout<<"\t\t\t4.数据查询"<<endl; cout<<"\t\t\t5.追加选手数据"<<endl; cout<<"\t\t\t6.写入数据文件"<<endl; cout<<"\t\t\t7.退出系统"<<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是否重复 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()<<"的选手的分数:"<<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<<"无选手分数信息!操作错误!返回开场页面。"<<endl<<endl<<endl; } else { cout<<"************************"<<"欢送进入排序页面!"<<"************************"<<endl<<endl; cout<<"各选手按照平均分从高到低的排序如下"<<endl; //以下进展冒泡排序 Studenttemp; Student*newStu=newStudent[count];//排序用的新的数组 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<<"无选手分数信息!操作错误!返回开场页面。"<<endl<<endl<<endl; } else { cout<<"编号为:"<<ID<<"的选手的成绩如下"<<endl<<endl; stu[index].getObj().display(); cout<<"总分(去掉最高分和最低分)为:"<<stu[index].getObj().sumGrade()<<endl; cout<<"平均分(去掉最高分和最低分)为:"<<stu[index].getObj().aveGrade()<<endl; break; } } if(i==count-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论