大型实验报告材料歌手比赛系统.docx
- 文档编号:26284999
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:34
- 大小:303.09KB
大型实验报告材料歌手比赛系统.docx
《大型实验报告材料歌手比赛系统.docx》由会员分享,可在线阅读,更多相关《大型实验报告材料歌手比赛系统.docx(34页珍藏版)》请在冰豆网上搜索。
大型实验报告材料歌手比赛系统
大类基础课程大型实验
2014/2015
(2)
实验题目歌手比赛系统
学生姓名
学生学号
学生班级
任课教师
提交日期
计算机科学与技术学院
歌手比赛系统实验报告
一、大型实验的内容
歌手比赛系统(SCS:
SingerContestSystem)用于对一次歌手比赛的成绩进行管理,要求完成的主要的功能包括选手信息管理、评委打分管理。
可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等工作。
要求使用学习过的C/C++程序设计的知识完成歌手比赛系统的设计与实现。
二、运行环境
歌手比赛系统(SCS)在VisualStudio2010平台下开发,操作系统:
Windows8.1。
硬件环境:
处理器:
Intel(R)Core(TM)i5-5257MCPU@2.70GHz2.70GHz
内存:
8.00GB
系统类型:
64位操作系统
三、实验课题分析(主要的模块功能、流程图)
3.1歌手比赛系统的主要功能
歌手比赛系统(SCS)主要功能为:
选手信息管理、评委打分管理。
可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等。
详细的系统功能结构为图1所示。
图1系统结构图
系统各模块的功能具体描述为:
1、菜单模块
根据用户需求进行选择。
菜单模块包括:
(1)输入选手数据;
(2)评委打分;(3)成绩排序(按平均分);(4)数据查询;(5)追加学生数据;(6)写入数据文件;(7)退出系统。
2、选手模块
存储选手的姓名、编号、一个评委类,以及该选手的平均分和总分。
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
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<<"第"<
"< } } 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 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 usingnamespacestd; #include #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 #include #include"Student.h" #defineMAX1000 usingnamespacestd; 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! "< exit (1); } f>>count; for(inti=0;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<<"************************"<<"欢迎进入歌手比赛系统"<<"************************"< cout<<"\t\t\t1.输入选手数据"< cout<<"\t\t\t2.评委打分"< cout<<"\t\t\t3.成绩排序(按平均分)"< cout<<"\t\t\t4.数据查询"< cout<<"\t\t\t5.追加选手数据"< cout<<"\t\t\t6.写入数据文件"< cout<<"\t\t\t7.退出系统"< cout< 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<<"输入指令错误"< } } } } voidmenu: : inputMessage() { cout<<"************************"<<"欢迎进入选手信息页面"<<"************************"< cout<<"请输入共有几位选手: "; intn; cin>>n; cout< cout<<"请输入各选手信息(包括编号及姓名)"< stringID; stringname; for(inti=count;i<(n+count);i++) { cin>>ID>>name; //以下判断ID是否重复 boolpank=true; for(intj=0;j { if(ID==stu[j].getID()) { pank=false; cout<<"已存在ID相同的选手,请重新输入! "< return; } } stu[i].setID(ID); stu[i].setName(name); } //count=n+count; newcount=n; cout< } voidmenu: : inputGrade() { if(stu[0].judgeNull()) { cout<<"无选手信息! 操作错误! 返回开始页面。 "< } else { cout<<"************************"<<"欢迎进入评委打分页面"<<"************************"< cout<<"请各位评委打分(共10位评委): "< for(inti=count;i<(count+newcount);i++) { doublegrade[10]; cout<<"编号为"< "< 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< } } voidmenu: : sort() { if(jud[0].judgeN()) { cout<<"无选手分数信息! 操作错误! 返回开始页面。 "< } else { cout<<"************************"<<"欢迎进入排序页面! "<<"************************"< cout<<"各选手按照平均分从高到低的排序如下"< //以下进行冒泡排序 Studentt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大型 实验 报告 材料 歌手 比赛 系统