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

付费下载

下载本文档

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

文档简介

1、大类基础课程大型实验2014/2015(2)实验题目歌手比赛系统学生姓名学生学号学生班级任课教师提交日期精品文档计算机科学与技术学院。II 欢迎下载精品文档歌手比赛系统实验报告一、大型实验的内容歌手比赛系统(SCS: SingerContestSystem)用于对一次歌手比赛的成绩进行管理,要求完成的主要的功能包括选手信息管理、评委打分管理。 可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等工作。要求使用学习过的C/C+程序设计的知识完成歌手比赛系统的设计与实现。二、运行环境歌手比赛系统(SCS)在 Visual Studio 2010平台下开发,操作系统:Window

2、s 8.1。硬件环境:处理器: Intel(R) Core(TM) i5-5257M CPU 2.70GHz 2.70GHz内存: 8.00GB系统类型: 64 位操作系统三、实验课题分析(主要的模块功能、流程图)3.1歌手比赛系统的主要功能歌手比赛系统(SCS)主要功能为:选手信息管理、评委打分管理。可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等。详细的系统功能结构为图1 所示。歌手比赛系统SCS菜单模块选手模块评委模块图 1系统结构图。1欢迎下载精品文档系统各模块的功能具体描述为:1、菜单模块根据用户需求进行选择。菜单模块包括:( 1)输入选手数据; ( 2)评委

3、打分;( 3)成绩排序(按平均分) ;( 4)数据查询;( 5)追加学生数据;(6)写入数据文件; ( 7)退出系统。2、选手模块存储选手的姓名、编号、一个评委类,以及该选手的平均分和总分。3、评委模块存储 10 个评委对一个选手的打分情况。计算总分功能:根据10 个评委的打分(去掉最高分和最低分),计算选手的总分。计算平均分功能:根据10 个评委的打分(去掉最高分和最低分),计算选手的平均分。还有 2 个辅助功能:寻找最高分和最低分。3.2系统分析及设计系统涉及对象有两个基本类:选手类和评委类。还有一个菜单类。可以采用面向对象的方式实现歌手比赛系统,根据不同的需求,分为选手类和评委类。其中选

4、手类中以评委类为成员变量。系统的主要的类结构如图2 所示。选手类菜单类评委类图 2 系统主要类结构图分别设计菜单类、选手类、评委类,菜单类提供选择功能。用文本文件进行数据的保存,需要保存的数据主要包括选手的编号、信息、平均分和排名等。3.3系统的实现( 1)类的编写系统工程名为:Test 。包含了Student 类(选手类),Judge 类(图书类)两个基本类,另设 menu类,进行具体功能的选择及实现。Student类包含选手的编号、姓名、评委的打分( Judge 声明的对象obj )、选手的总分和平均分。Judge 类包含 10 个评委的打分。2欢迎下载精品文档具体类结构声明如下:Stud

5、ent类:class Studentpublic:void setID(string ID);void setName(string name);void setObj(Judge& j);voiid setSUM(double sum);void setAVE(double ave);string getID();string getName();Judge getObj();double getSUM();double getAVE();Student(Student&);Student(void);Student(void);private:string ID;strin

6、g name;Judge obj;double SUM;double AVE;Judge 类class Judgepublic:void setGrade(double g10);double* getGrade();void display();double sumGrade();/计算总分double aveGrade();/计算平均分double getMax();/辅助函数,寻找最高分double getMin();/辅助函数,寻找最低分Judge(void);Judge(Judge&);Judge(void);private:double grade10;。3欢迎下载精品文档

7、Menu类:class menupublic:void select();/选择操作void inputMessage();/输入选手信息void inputGrade();/评委打分void sort();/根据选手成绩进行排序void consult();/查询某个选手的成绩void insert();/插入新选手的信息和成绩void input();/将选手数据写入文件menu(void);menu(void);private:int count ;/计数,共有多少组数据Student stuMAX;Judge judMAX;( 3)交互界面以及登录菜单的实现系统运行开始的界面如图5 所

8、示:。4欢迎下载精品文档图 5开始登录界面主要通过选择结构和循环结构实现界面的前进和后退。例如,第一个登录界面出现7个选择: 1. 输入选手数据, 2. 评委打分, 3. 成绩排序(按平均分) 4. 数据查询 5. 追加选手数据 6. 写入数据文件 7. 退出系统。用 switch case 分别实现,选择之后转到下一个界面。四、实验调试、测试、运行记录及分析系统在调试测试过程中遇到若干问题,不过经过仔细反复的检查已经消除各种bug。主要的测试经过如下:开始页面 :在开始界面输入“1”即可跳转到输入选手信息界面,输入选手信息。输入选手信息完毕后,自动返回开始页面。输入 “2”,即可跳转到评委打

9、分页面。为各选手打分。输入分数完毕后,自动返回至开始页面。5欢迎下载精品文档输入 “3”,跳转到排序页面,根据选手的平均分进行排名。排序完毕后,自动返回到开始页面。输入“ 4”,跳转到数据查询页面。输入想查询的选手的编号,即可得知该选手的10 位评委的打分。查询完毕后,自动跳转到开始页面。输入 “ 5”,跳转到追加选手数据页面。 输入新插入的选手的编号及姓名, 以及 10 个评委对该选手的打分。为验证选手数据已更新,进行查询操作及排序操作。6欢迎下载精品文档输入 “ 6”,将所有选手的信息,包括编号、信息、10 个评委的打分,写入数据文件。7欢迎下载精品文档输入 “ 7”,退出系统。容错测试:

10、1. 如果输入相同 ID 的选手:2. 如果插入相同的选手:3. 如果输入了选手 ID 和姓名,但还未进行打分就进行排序:。8欢迎下载精品文档4. 程序开始就选择5,追加选手数据,测试插入是否成功(数据查询和排序)。9欢迎下载精品文档遇到的问题及解决方法如下:问题 1:问题描述: 很少使用文件的读取方法, 因此一开始在实现将信息写入文件的功能时遇到了困难,不知如何下手。解决方法: 利用网络资源,搜索 c+的读写文件方式,在稍作修改后,应用到本次实验中。成功实现了文件的读写。图 6调试测试问题1五、实验总结我设计的歌手比赛系统基本满足任务书的功能要求,类的结构和关系清晰,功能完善,完成了歌手比赛

11、系统的基本功能,能正常运行。存在的缺点主要是数据存储方面,因评委只有十人,不存在大批量的数据,因此采用基本的数组结构存储数据。其次在存储选手信息方面,采用了类的数组方式,有浪费内存的弊端, 并且,一旦选手人数过多,也会影响程序效率。可以用更好的数据存储方式来存储数据,例如vector等。通过这次C+的大型实验, 我深刻的明白到:课本知识与实践能力相结合的重要性。要。10欢迎下精品文档想把一门专业课程学好,必须增强自己的动手实践能力,更多的实践才能让我们的编程能力有更多的提高。 并且,我们也要充分利用好网络资源,写代码的过程其实是一个复习旧知识、学习新知识的过程,当我们遇到不明白的地方,或者对程

12、序功能抱有疑问时,要学会自己去查找资料并且解决问题,而网络资源能帮我们解答很多基本的疑问。充分利用好网络的代码资源,不断充实自己、丰富自己的代码知识。六、附录:源代码Judge.h#include <iostream>using namespace std;class Judgepublic:void setGrade(double g10);double* getGrade();void display();double sumGrade();/计算总分double aveGrade();/计算平均分double getMax();/辅助函数,寻找最高分double getMin

13、();/辅助函数,寻找最低分int judgeN();Judge(void);Judge(Judge&);Judge(void);private:double grade10;Judge.cpp#include "Judge.h"。11欢迎下精品文档Judge:Judge(void)for(int i = 0; i < 10; i+)gradei = 0;Judge:Judge(Judge& j)for(int i = 0; i < 10; i+)gradei = j.gradei;Judge:Judge(void)void Judge:setG

14、rade(double g10)for(int i = 0; i < 10; i+)gradei = gi;double* Judge:getGrade()return grade;void Judge:display()for(int i = 0; i< 10; i+)。12欢迎下精品文档cout<<" 第 "<<i+1<<" 位评委的打分是:"<<gradei<<endl;double Judge:sumGrade()double max = getMax();double mi

15、n = getMin();double Sum = 0;for(int i = 0; i < 10; i+)Sum = Sum + gradei;Sum = Sum - max;Sum = Sum - min;return Sum;double Judge:aveGrade()double Ave;double max = getMax();double min = getMin();double Sum = 0;for(int i = 0; i < 10; i+)Sum = Sum + gradei;Sum = Sum - max;Sum = Sum - min;Ave = Su

16、m / 8;。13欢迎下精品文档return Ave;double Judge:getMax()/辅助函数,寻找最高分double max = 0;for(int i = 0; i < 10; i+)if(max < gradei)max = gradei;return max;double Judge:getMin()/辅助函数,寻找最低分double min = 100;for(int i = 0; i < 10; i+)if(min > gradei)min = gradei;return min;int Judge:judgeN()if(grade0=0)ret

17、urn 1;else。14欢迎下精品文档return 0;Student.h#include <iostream>using namespace std;#include <string>#include "Judge.h"class Studentpublic:void setID(string ID);void setName(string name);void setObj(Judge& j);void setSUM(double sum);void setAVE(double ave);string getID();string ge

18、tName();Judge getObj();double getSUM();double getAVE();int judgeNull();/判断是否为空Student(Student&);Student(void);Student(void);private:string ID;string name;Judge obj;。15欢迎下精品文档double SUM;double AVE;Student.cpp#include "Student.h"Student:Student(void)Student:Student(Student &s)ID = s.

19、getID();name = s.getName();AVE = s.getAVE();SUM = s.getSUM();obj = s.getObj();Student:Student(void)void Student:setID(string id)ID = id;void Student:setName(string n)。16欢迎下精品文档name = n;void Student:setObj(Judge &j)obj = Judge(j);void Student:setSUM(double sum)SUM = sum;void Student:setAVE(double

20、 ave)AVE =ave;string Student:getID()return ID;string Student:getName()return name;double Student:getSUM()return SUM;double Student:getAVE()。17欢迎下精品文档return AVE;Judge Student:getObj()return obj;int Student:judgeNull()if(ID.empty()&&name.empty()return 1;elsereturn 0;menu.h#include <iostream

21、>#include <fstream>#include "Student.h"#define MAX 1000using namespace std;class menupublic:void select();/选择操作void inputMessage();/输入选手信息void inputGrade();/评委打分。18欢迎下精品文档void sort();/根据选手成绩排序(平均分)void consult();/查询某个选手的成绩void insert();/插入某个新选手的信息和成绩void input();/将选手数据写入文件menu(voi

22、d);menu(void);private:int count ;/计数,共有多少组数据Student stuMAX;Judge judMAX;menu.cpp#include "StdAfx.h"#include "menu.h"menu:menu(void)count = 0;newcount=0;ifstream f("C:UsersappleDesktopdata.txt");if(!f)cout<<"open error!"<<endl;exit(1);f>>count

23、;。19欢迎下精品文档for(int i = 0; i < count; i+)string fID,fname;f>>fID>>fname;stui.setID(fID);stui.setName(fname);double x10;for(int j = 0; j < 10; j+)f>>xj;judi.setGrade(x);stui.setObj(judi);stui.setAVE(judi.aveGrade();stui.setSUM(judi.sumGrade();f.close();menu:menu(void)void menu:

24、select()while(1)char n;。20欢迎下精品文档cout<<"*"<<"欢迎进入歌手比赛系统"<<"*"<<endl<<endl;cout<<"ttt1.输入选手数据 "<<endl;cout<<"ttt2.评委打分 "<<endl;cout<<"ttt3.成绩排序(按平均分)"<<endl;cout<<"

25、ttt4.数据查询 "<<endl;cout<<"ttt5.追加选手数据 "<<endl;cout<<"ttt6.写入数据文件 "<<endl;cout<<"ttt7.退出系统 "<<endl;cout<<endl<<endl<<endl;cout<<" 请选择操作项目: "cin>>n;switch(n)case '1':inputMessage

26、();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:。21欢迎下精品文档cout<<" 输入指令错误 "<<endl;void menu:inputMessage()cout<<

27、;"*"<<"欢迎进入选手信息页面"<<"*"<<endl<<endl;cout<<" 请输入共有几位选手: "int n;cin>>n;cout<<endl<<endl<<endl;cout<<" 请输入各选手信息(包括编号及姓名)"<<endl;string ID ;string name;for(int i = count; i < (n+count);

28、 i+)cin>>ID>>name;/ 以下判断 ID 是否重复bool pank=true;for(int j = 0; j < count; j+)if(ID=stuj.getID()pank=false;cout<<" 已存在 ID 相同的选手 , 请重新输入!"<<endl;return;。22欢迎下精品文档stui.setID(ID);stui.setName(name);/ count = n+count; newcount=n;cout<<endl<<endl<<endl

29、;void menu:inputGrade()if(stu0.judgeNull()cout<<" 无选手信息!操作错误!返回开始页面。"<<endl<<endl<<endl;elsecout<<"*"<<"欢迎进入评委打分页面"<<"*"<<endl<<endl;cout<<" 请各位评委打分(共10 位评委):"<<endl;for(int i = count;

30、 i < (count+newcount); i+)double grade10;cout<<" 编号为 "<<stui.getID()<<"的选手的分数:"<<endl;for(int j = 0; j < 10; j+)cin>>gradej;judi.setGrade(grade);。23欢迎下精品文档stui.setObj(judi);stui.setAVE(judi.aveGrade();stui.setSUM(judi.sumGrade();count = count+n

31、ewcount;cout<<endl<<endl<<endl;void menu:sort()if(jud0.judgeN()cout<<" 无选手分数信息!操作错误!返回开始页面。"<<endl<<endl<<endl;elsecout<<"*"<<"欢迎进入排序页面!"<<"*"<<endl<<endl;cout<<" 各选手按照平均分从高到低的排

32、序如下"<<endl;/ 以下进行冒泡排序Student temp;Student *newStu = new Studentcount;/排序用的新的数组for(int p = 0; p < count; p+)newStup = stup;for(int i = 0; i < count-1; i+)。24欢迎下精品文档for(int j = i+1; j <count; j+)double ave1 = newStui.getAVE();double ave2 = newStuj.getAVE();if(ave1 < ave2)temp =

33、newStui;newStui = newStuj;newStuj = temp;for(int k = 0 ; k < count; k+)string ID = newStuk.getID();string name = newStuk.getName();cout<<" 编号: "<<ID<<"姓名: "<<name<<endl;cout<<endl<<endl<<endl;void menu:consult()cout<<"

34、*"<<"欢迎进入查询页面"<<"*"<<endl<<endl;cout<<" 请输入想查询的选手的编号: "<<endl;string ID;cin>>ID;int index;/标记查询到的该选手的下标。25欢迎下精品文档cout<<endl;for(int i = 0; i < count; i+)if(ID = stui.getID()index = i;if(stui.judgeNull()cout<<

35、"无 选 手 分 数 信 息 ! 操 作 错 误 ! 返 回 开 始 页 面 。"<<endl<<endl<<endl;elsecout<<" 编号为: "<<ID<<" 的选手的成绩如下"<<endl<<endl;stuindex.getObj().display();cout<<"总分(去掉最高分和最低分)为:"<<stuindex.getObj().sumGrade()<<endl;cout<<"平均分(去掉最高分和最低分)为:"<<stuindex.getObj().aveGrade()<<endl;break;if(i = count - 1)cout<<" 不存在该选手,输入错误,返回开始页面!"cout<<endl<<endl<<endl;void menu:insert()。26欢迎下精品文档cout<<"*"<<"欢迎进入插入页面&quo

温馨提示

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

评论

0/150

提交评论