1、 大类基础课程大型实验 2014/2015(2) 实验题目 歌手比赛系统 学生姓名ﻩ 学生学号ﻩ 学生班级 ﻩ 任课教师 ﻩ 提交日期 ﻩ 计算机科学与技术学院 歌手比赛系统 实验报告 一、 大型实验得内容 歌手比赛系统(SCS:Singer Contest System)用于对一次歌手比赛得成绩进行管理,要求完成得主要得功能包括选
2、手信息管理、评委打分管理。可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等工作。要求使用学习过得C/C++程序设计得知识完成歌手比赛系统得设计与实现。 二、 运行环境 歌手比赛系统(SCS)在Visual Studio 2010平台下开发,操作系统:Windows 8、1 。 硬件环境: 处理器:Intel(R) Core(TM) i5—5257M CPU 2、70GHz 2、70GHz 内存:8、00GB 系统类型:64位操作系统 三、 实验课题分析(主要得模块功能、流程图) 3、1 歌手比赛系统得主要功能 歌手
3、比赛系统(SCS)主要功能为:选手信息管理、评委打分管理。可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等。详细得系统功能结构为图1所示。 歌手比赛系统SCS 菜单模块 评委模块 选手模块 图1 系统结构图 系统各模块得功能具体描述为: 1、菜单模块 根据用户需求进行选择。菜单模块包括:(1)输入选手数据;(2)评委打分; (3)成绩排序(按平均分);(4)数据查询; (5)追加学生数据; (6)写入数据文件;(7)退出系统。 2、 选手模块 存储选手得姓名、编号、一个评委类,以及该选手得平均分与总分。 3、评委模块 存储10
4、个评委对一个选手得打分情况。 计算总分功能:根据10个评委得打分(去掉最高分与最低分),计算选手得总分。 计算平均分功能:根据10个评委得打分(去掉最高分与最低分),计算选手得平均分. 还有2个辅助功能:寻找最高分与最低分。 3、2 系统分析及设计 系统涉及对象有两个基本类:选手类与评委类。还有一个菜单类。 可以采用面向对象得方式实现歌手比赛系统,根据不同得需求,分为选手类与评委类。其中选手类中以评委类为成员变量.系统得主要得类结构如图2所示. 菜单类 选手类 评委类 图2 系统主要类结构图 分别设计菜单类、选手类、评委类,菜单类提供选择功能。 用文
5、本文件进行数据得保存,需要保存得数据主要包括选手得编号、信息、平均分与排名等。 3、3系统得实现 (1)类得编写 系统工程名为:Test.包含了Student类(选手类),Judge类(图书类)两个基本类,另设menu类,进行具体功能得选择及实现。 Student类包含选手得编号、姓名、评委得打分(Judge声明得对象obj)、选手得总分与平均分。Judge类包含10个评委得打分。 具体类结构声明如下: l Student类: class Student { public: void setID(string ID); ﻩvoid setName(st
6、ring 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; ﻩstring name; ﻩJudge obj; ﻩdoub
7、le SUM; ﻩdouble AVE; }; l Judge类 class Judge { public: ﻩvoid setGrade(double g[10]); double* getGrade(); void display(); double sumGrade();//计算总分 double aveGrade();//计算平均分 ﻩdouble getMax();//辅助函数,寻找最高分 ﻩdouble getMin();//辅助函数,寻找最低分 ﻩJudge(void); Judge(Judge&); ~Judge(void); pr
8、ivate: double grade[10]; }; l Menu类: class menu { public: ﻩvoid select();//选择操作 void inputMessage();//输入选手信息 void inputGrade();//评委打分 void sort();//根据选手成绩进行排序 void consult();//查询某个选手得成绩 void insert();//插入新选手得信息与成绩 ﻩvoid input();//将选手数据写入文件 menu(void); ﻩ~menu(void); private:
9、int count ;//计数,共有多少组数据 ﻩStudent stu[MAX]; ﻩJudge jud[MAX]; }; (3)交互界面以及登录菜单得实现 系统运行开始得界面如图5所示: 图5 开始登录界面 主要通过选择结构与循环结构实现界面得前进与后退。例如,第一个登录界面出现7个选择:1、输入选手数据,2、评委打分,3、成绩排序(按平均分)4、数据查询5、追加选手数据6、写入数据文件7、退出系统。用switch case分别实现,选择之后转到下一个界面. 四、 实验调试、测试、运行记录及分析 系统在调试测试过程中遇到若干问题,不过经
10、过仔细反复得检查已经消除各种bug。 主要得测试经过如下: 开始页面: 在开始界面输入“1”即可跳转到输入选手信息界面,输入选手信息。 输入选手信息完毕后,自动返回开始页面。 输入“2”,即可跳转到评委打分页面。为各选手打分. 输入分数完毕后,自动返回至开始页面。 输入“3”,跳转到排序页面,根据选手得平均分进行排名。排序完毕后,自动返回到开始页面。 输入“4”,跳转到数据查询页面.输入想查询得选手得编号,即可得知该选手得10位评委得打分。查询完毕后,自动跳转到开始页面。 输入“5”,跳转到追加选手数据页面.输入新插入得选手得编号及姓
11、名,以及10个评委对该选手得打分.为验证选手数据已更新,进行查询操作及排序操作。 输入“6”,将所有选手得信息,包括编号、信息、10个评委得打分,写入数据文件。 输入“7”,退出系统。 容错测试: 1、如果输入相同ID得选手: 2、如果插入相同得选手: 3、如果输入了选手ID与姓名,但还未进行打分就进行排序: 4、程序开始就选择5,追加选手数据,测试插入就是否成功(数据查询与排序) 遇到得问题及解决方法如下: l 问题1: 问题描述:很少使用文件得读取方法,因此一开始在实现将信息写入文件得功能时遇到了困难,不知如何下手。 解决方法:利用网络
12、资源,搜索c++得读写文件方式,在稍作修改后,应用到本次实验中。成功实现了文件得读写。 图6 调试测试问题1 五、 实验总结 我设计得歌手比赛系统基本满足任务书得功能要求,类得结构与关系清晰,功能完善,完成了歌手比赛系统得基本功能,能正常运行。 存在得缺点主要就是数据存储方面,因评委只有十人,不存在大批量得数据,因此采用基本得数组结构存储数据。其次在存储选手信息方面,采用了类得数组方式,有浪费内存得弊端,并且,一旦选手人数过多,也会影响程序效率。可以用更好得数据存储方式来存储数据,例如vector等。 通过这次C++得大型实验,我深刻得明白到:课本知识与实践能力相结合得重
13、要性。要想把一门专业课程学好,必须增强自己得动手实践能力,更多得实践才能让我们得编程能力有更多得提高。并且,我们也要充分利用好网络资源,写代码得过程其实就是一个复习旧知识、学习新知识得过程,当我们遇到不明白得地方,或者对程序功能抱有疑问时,要学会自己去查找资料并且解决问题,而网络资源能帮我们解答很多基本得疑问。充分利用好网络得代码资源,不断充实自己、丰富自己得代码知识。 六、 附录:源代码 Judge、h #include 〈iostream> using namespace std; class Judge { public: void setGrade(double g[
14、10]); ﻩdouble* getGrade(); ﻩvoid display(); double sumGrade();//计算总分 double aveGrade();//计算平均分 ﻩdouble getMax();//辅助函数,寻找最高分 ﻩdouble getMin();//辅助函数,寻找最低分 ﻩint judgeN(); ﻩJudge(void); ﻩJudge(Judge&); ﻩ~Judge(void); private: double grade[10]; }; Judge、cpp #include ”Judge、h” Judge:
15、Judge(void) { for(int i = 0; i 〈 10; i++) ﻩ grade[i] = 0; } Judge::Judge(Judge& j) { for(int i = 0; i < 10; i++) ﻩﻩgrade[i] = j、grade[i]; } Judge::~Judge(void) { } void Judge::setGrade(double g[10]) { ﻩfor(int i = 0; i 〈 10; i++) ﻩ{ grade[i] = g[i]; ﻩ} } double* Judge::getGr
16、ade()
{
return grade;
}
void Judge::display()
{
ﻩfor(int i = 0; i< 10; i++)
{
ﻩ cout〈<”第”〈〈i+1<<"位评委得打分就是:"<〈grade[i]〈 17、}
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 + grade[i];
}
ﻩSum = Sum — max;
Sum = Sum - min;
Ave = Sum / 8;
ﻩreturn Ave;
18、
}
double Judge::getMax()//辅助函数,寻找最高分
{
ﻩdouble max = 0;
ﻩfor(int i = 0; i < 10; i++)
ﻩ{
ﻩif(max 〈 grade[i])
ﻩmax = grade[i];
ﻩ}
return max;
}
double Judge::getMin()//辅助函数,寻找最低分
{
ﻩdouble min = 100;
ﻩfor(int i = 0; i 〈 10; i++)
ﻩ{
ﻩﻩif(min 〉 grade[i])
ﻩﻩ min = grade[i];
}
re 19、turn min;
}
int Judge::judgeN()
{
if(grade[0]==0)
ﻩ return 1;
ﻩelse
ﻩ return 0;
}
Student、h
#include 〈iostream>
using namespace std;
#include 20、tSUM(double sum);
ﻩvoid setAVE(double ave);
string getID();
string getName();
ﻩJudge getObj();
double getSUM();
ﻩdouble getAVE();
ﻩint judgeNull();// 判断就是否为空
Student(Student&);
Student(void);
ﻩ~Student(void);
private:
ﻩstring ID;
string name;
ﻩJudge obj;
ﻩdouble SUM;
double AV 21、E;
};
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)
{
}
void Student::setID(string id)
{
ﻩID = id;
}
void Studen 22、t::setName(string n)
{
ﻩname = n;
}
void Student::setObj(Judge &j)
{
ﻩobj = Judge(j);
}
void Student::setSUM(double sum)
{
SUM = sum;
}
void Student::setAVE(double ave)
{
AVE =ave;
}
string Student::getID()
{
ﻩreturn ID;
}
string Student::getName()
{
ﻩreturn name;
}
double 23、Student::getSUM()
{
ﻩreturn SUM;
}
double Student::getAVE()
{
ﻩreturn AVE;
}
Judge Student::getObj()
{
ﻩreturn obj;
}
int Student::judgeNull()
{
ﻩif(ID、empty()&&name、empty())
ﻩ return 1;
ﻩelse
ﻩreturn 0;
}
menu、h
#include <iostream〉
#include <fstream>
#include ”Student、h"
#d 24、efine MAX 1000
using namespace std;
class menu
{
public:
ﻩvoid select();//选择操作
void inputMessage();//输入选手信息
ﻩvoid inputGrade();//评委打分
ﻩvoid sort();//根据选手成绩排序(平均分)
ﻩvoid consult();//查询某个选手得成绩
ﻩvoid insert();//插入某个新选手得信息与成绩
void input();//将选手数据写入文件
ﻩmenu(void);
~menu(void);private:
ﻩi 25、nt count ;//计数,共有多少组数据
ﻩStudent stu[MAX];
Judge jud[MAX];
};
menu、cpp
#include "StdAfx、h”
#include "menu、h"
menu::menu(void)
{
count = 0;
ﻩnewcount=0;
ifstream f("C:\\Users\\apple\\Desktop\\data、txt”);
if(!f)
{
ﻩcout〈〈"open error!”<〈endl;
ﻩexit(1);
}
ﻩf>>count;
for(int i = 26、 0; i 〈 count; i++)
{
string fID,fname;
ﻩ f〉>fID〉>fname;
ﻩ stu[i]、setID(fID);
stu[i]、setName(fname);
ﻩdouble x[10];
ﻩ for(int j = 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]、sumGrad 27、e());
}
f、close();
}
menu::~menu(void)
{
}
void menu::select()
{
while(1)
ﻩ{
ﻩ char n;
cout<<"************************"<<”欢迎进入歌手比赛系统"〈<"************************”<<endl<〈endl;
ﻩ cout<<"\t\t\t1、输入选手数据"<<endl;
ﻩﻩcout〈<”\t\t\t2、评委打分”< 28、<<"\t\t\t4、数据查询”<<endl;
cout〈〈"\t\t\t5、追加选手数据”<〈endl;
ﻩcout<<"\t\t\t6、写入数据文件"<<endl;
cout<<"\t\t\t7、退出系统"< 29、break;
ﻩﻩcase '4’:
ﻩ consult();break;
case '5':
ﻩ ﻩinsert();break;
ﻩ case '6':
input();break;
case ’7':
ﻩ ﻩ return ;break;
ﻩ default:
ﻩ {
ﻩﻩ cout〈〈"输入指令错误"〈<endl;
ﻩﻩﻩ}
ﻩﻩ}
ﻩ}
}
void menu::inputMessage()
{
ﻩcout<〈"************************”<〈”欢迎进入选手信息页面"<<”*********** 30、***********"<〈endl<〈endl;
ﻩcout〈<”请输入共有几位选手: ";
int n;
ﻩcin〉〉n;
ﻩcout<<endl〈〈endl<<endl;
ﻩcout〈<"请输入各选手信息(包括编号及姓名)"<<endl;
string ID ;
string name;
ﻩfor(int i = count; i < (n+count); i++)
{ﻩ
ﻩ cin>〉ID〉>name;
ﻩ//以下判断ID就是否重复
ﻩbool pank=true;
for(int j = 0; j 〈 count; j++)
ﻩﻩ{
31、
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;
}
void menu::inputGrade()
{
ﻩif(stu[0]、judgeNull())
{
ﻩﻩcout〈〈"无选手信息! 32、操作错误!返回开始页面。"< 33、
ﻩfor(int j = 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〈 34、geN())
ﻩ{
cout〈<”无选手分数信息!操作错误!返回开始页面。”<<endl〈〈endl<〈endl;
ﻩ}
else
{
ﻩ cout〈<"************************"<<"欢迎进入排序页面!"<〈”************************”<〈endl〈〈endl;
ﻩcout<〈"各选手按照平均分从高到低得排序如下"〈〈endl;
//以下进行冒泡排序
Student temp;
ﻩﻩStudent *newStu = new Student[count];//排序用得新得数组
ﻩfor(int p = 35、0; p < count; p++)
ﻩ {
ﻩ newStu[p] = stu[p];
ﻩ }
ﻩfor(int i = 0; i 〈 count-1; i++)
ﻩﻩ{
ﻩ ﻩfor(int j = i+1; j 36、 newStu[j] = temp;
ﻩ ﻩ}
ﻩ}
ﻩ }
ﻩfor(int k = 0 ; k 〈 count; k++)
{
string ID = newStu[k]、getID();
ﻩ string name = newStu[k]、getName();
cout<〈”编号:”<<ID〈〈” 姓名:"<<name<〈endl;
ﻩ }
ﻩcout〈〈endl〈〈endl<<endl;
}
}
void menu::consult()
{
cout〈<”************************"<<”欢迎进 37、入查询页面"〈〈"************************"<<endl〈 38、误!返回开始页面。"〈〈endl<〈endl<〈endl;
ﻩ ﻩ}
ﻩ ﻩelse
ﻩﻩﻩﻩ {
ﻩ cout〈〈”编号为:"〈 39、ﻩﻩﻩ}
ﻩﻩﻩif(i == count - 1)
ﻩ ﻩ cout〈<"不存在该选手,输入错误,返回开始页面!”;
ﻩﻩ}
cout< 40、k = true;;
for(int i = 0; i 〈count; i++)
ﻩ{
ﻩ if(ID == stu[i]、getID())
ﻩ{
cout<<"已存在ID相同得选手,请重新输入!”<〈endl;
ﻩﻩpank = false;
ﻩﻩreturn;
ﻩ}
}
ﻩif(pank)
ﻩ{
ﻩ stu[count]、setID(ID);
ﻩstu[count]、setName(name);
ﻩcout〈<"请各位评委打分"<<endl;
ﻩﻩdouble grade[10];
ﻩfor(int i = 0; i < 10; i++)
41、
ﻩ{
cin>>grade[i];
ﻩ}
ﻩJudge j;
ﻩ j、setGrade(grade);
ﻩﻩstu[count]、setAVE(j、aveGrade());
stu[count]、setSUM(j、sumGrade());
stu[count]、setObj(j);
jud[count]、setGrade(grade);
count++;
ﻩnewcount++;
ﻩ cout< 42、apple\\Desktop\\data、txt”);
if(!f)
{
cout<〈”open error!"<<endl;
exit(1);
}
f<






