资源描述
大类基础课程大型实验
2014/2015(2)
实验题目 歌手比赛系统
学生姓名ﻩ
学生学号ﻩ
学生班级 ﻩ
任课教师 ﻩ
提交日期
ﻩ 计算机科学与技术学院
歌手比赛系统 实验报告
一、 大型实验得内容
歌手比赛系统(SCS:Singer Contest System)用于对一次歌手比赛得成绩进行管理,要求完成得主要得功能包括选手信息管理、评委打分管理。可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等工作。要求使用学习过得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 歌手比赛系统得主要功能
歌手比赛系统(SCS)主要功能为:选手信息管理、评委打分管理。可以完成成绩排序(按平均分),选手数据查询,追加学生数据,写入数据文件等。详细得系统功能结构为图1所示。
歌手比赛系统SCS
菜单模块
评委模块
选手模块
图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个评委得打分。
具体类结构声明如下:
l Student类:
class Student
{
public:
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;
ﻩstring name;
ﻩJudge obj;
ﻩdouble 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);
private:
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:
int count ;//计数,共有多少组数据
ﻩStudent stu[MAX];
ﻩJudge jud[MAX];
};
(3)交互界面以及登录菜单得实现
系统运行开始得界面如图5所示:
图5 开始登录界面
主要通过选择结构与循环结构实现界面得前进与后退。例如,第一个登录界面出现7个选择:1、输入选手数据,2、评委打分,3、成绩排序(按平均分)4、数据查询5、追加选手数据6、写入数据文件7、退出系统。用switch case分别实现,选择之后转到下一个界面.
四、 实验调试、测试、运行记录及分析
系统在调试测试过程中遇到若干问题,不过经过仔细反复得检查已经消除各种bug。
主要得测试经过如下:
开始页面:
在开始界面输入“1”即可跳转到输入选手信息界面,输入选手信息。
输入选手信息完毕后,自动返回开始页面。
输入“2”,即可跳转到评委打分页面。为各选手打分.
输入分数完毕后,自动返回至开始页面。
输入“3”,跳转到排序页面,根据选手得平均分进行排名。排序完毕后,自动返回到开始页面。
输入“4”,跳转到数据查询页面.输入想查询得选手得编号,即可得知该选手得10位评委得打分。查询完毕后,自动跳转到开始页面。
输入“5”,跳转到追加选手数据页面.输入新插入得选手得编号及姓名,以及10个评委对该选手得打分.为验证选手数据已更新,进行查询操作及排序操作。
输入“6”,将所有选手得信息,包括编号、信息、10个评委得打分,写入数据文件。
输入“7”,退出系统。
容错测试:
1、如果输入相同ID得选手:
2、如果插入相同得选手:
3、如果输入了选手ID与姓名,但还未进行打分就进行排序:
4、程序开始就选择5,追加选手数据,测试插入就是否成功(数据查询与排序)
遇到得问题及解决方法如下:
l 问题1:
问题描述:很少使用文件得读取方法,因此一开始在实现将信息写入文件得功能时遇到了困难,不知如何下手。
解决方法:利用网络资源,搜索c++得读写文件方式,在稍作修改后,应用到本次实验中。成功实现了文件得读写。
图6 调试测试问题1
五、 实验总结
我设计得歌手比赛系统基本满足任务书得功能要求,类得结构与关系清晰,功能完善,完成了歌手比赛系统得基本功能,能正常运行。
存在得缺点主要就是数据存储方面,因评委只有十人,不存在大批量得数据,因此采用基本得数组结构存储数据。其次在存储选手信息方面,采用了类得数组方式,有浪费内存得弊端,并且,一旦选手人数过多,也会影响程序效率。可以用更好得数据存储方式来存储数据,例如vector等。
通过这次C++得大型实验,我深刻得明白到:课本知识与实践能力相结合得重要性。要想把一门专业课程学好,必须增强自己得动手实践能力,更多得实践才能让我们得编程能力有更多得提高。并且,我们也要充分利用好网络资源,写代码得过程其实就是一个复习旧知识、学习新知识得过程,当我们遇到不明白得地方,或者对程序功能抱有疑问时,要学会自己去查找资料并且解决问题,而网络资源能帮我们解答很多基本得疑问。充分利用好网络得代码资源,不断充实自己、丰富自己得代码知识。
六、 附录:源代码
Judge、h
#include 〈iostream>
using namespace std;
class Judge
{
public:
void setGrade(double g[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::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::getGrade()
{
return grade;
}
void Judge::display()
{
ﻩfor(int i = 0; i< 10; i++)
{
ﻩ cout〈<”第”〈〈i+1<<"位评委得打分就是:"<〈grade[i]〈<endl;
}
}
double Judge::sumGrade()
{
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;
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;
}
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];
}
return min;
}
int Judge::judgeN()
{
if(grade[0]==0)
ﻩ return 1;
ﻩelse
ﻩ return 0;
}
Student、h
#include 〈iostream>
using namespace std;
#include <string>
#include ”Judge、h"
class Student
{
public:
ﻩvoid setID(string ID);
void setName(string name);
void setObj(Judge& j);
void setSUM(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 AVE;
};
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 Student::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 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"
#define 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:
ﻩint 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 = 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]、sumGrade());
}
f、close();
}
menu::~menu(void)
{
}
void menu::select()
{
while(1)
ﻩ{
ﻩ char n;
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;
ﻩﻩﻩ}
ﻩﻩ}
ﻩ}
}
void menu::inputMessage()
{
ﻩcout<〈"************************”<〈”欢迎进入选手信息页面"<<”************************"<〈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++)
ﻩﻩ{
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〈〈"无选手信息!操作错误!返回开始页面。"<<endl<<endl<〈endl;
ﻩ}
else
{
ﻩ cout<<"************************”<〈"欢迎进入评委打分页面”〈<"************************”〈<endl<<endl;
ﻩ cout<<"请各位评委打分(共10位评委):"<〈endl;
ﻩﻩfor(int i = count; i 〈 (count+newcount); i++)
ﻩﻩ{
ﻩ ﻩdouble grade[10];
ﻩ cout〈〈"编号为”<<stu[i]、getID()<<"得选手得分数:”〈<endl;
ﻩ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〈<endl;
}
}
void menu::sort()
{
ﻩif(jud[0]、judgeN())
ﻩ{
cout〈<”无选手分数信息!操作错误!返回开始页面。”<<endl〈〈endl<〈endl;
ﻩ}
else
{
ﻩ cout〈<"************************"<<"欢迎进入排序页面!"<〈”************************”<〈endl〈〈endl;
ﻩcout<〈"各选手按照平均分从高到低得排序如下"〈〈endl;
//以下进行冒泡排序
Student temp;
ﻩﻩStudent *newStu = new Student[count];//排序用得新得数组
ﻩfor(int p = 0; p < count; p++)
ﻩ {
ﻩ newStu[p] = stu[p];
ﻩ }
ﻩfor(int i = 0; i 〈 count-1; i++)
ﻩﻩ{
ﻩ ﻩfor(int j = i+1; j <count; j++)
ﻩ {
double ave1 = newStu[i]、getAVE();
ﻩﻩ double ave2 = newStu[j]、getAVE();
ﻩﻩﻩif(ave1 < ave2)
ﻩ ﻩ{
ﻩ ﻩﻩﻩtemp = newStu[i];
ﻩ ﻩﻩnewStu[i] = newStu[j];
ﻩ 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〈<”************************"<<”欢迎进入查询页面"〈〈"************************"<<endl〈<endl;
ﻩﻩcout<〈”请输入想查询得选手得编号: "〈<endl;
ﻩstring ID;
ﻩﻩcin>>ID;
ﻩﻩint index;//标记查询到得该选手得下标
ﻩﻩcout<<endl;
ﻩfor(int i = 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)
ﻩ ﻩ cout〈<"不存在该选手,输入错误,返回开始页面!”;
ﻩﻩ}
cout<<endl<<endl〈<endl;
}
void menu::insert()
{
cout<<"************************"<〈”欢迎进入插入页面"〈<"************************"〈<endl<〈endl;
ﻩcout<〈"请输入选手得编号及姓名"〈<endl;
ﻩstring ID;
string name;
ﻩcin>>ID;
cin〉>name;
bool pank = 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++)
ﻩ{
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<<endl<〈endl<<endl;
}
}
void menu::input()
{
ﻩofstream f(”C:\\Users\\apple\\Desktop\\data、txt”);
if(!f)
{
cout<〈”open error!"<<endl;
exit(1);
}
f<<count<<endl;
for(int i = 0; i < count; i++)
{
f〈<stu[i]、getID()〈<" ”<〈stu[i]、getName()<〈" ";
ﻩfor(int j = 0; j < 10; j++)
{
ﻩﻩf<<jud[i]、getGrade()[j]<<" ";
ﻩ}
ﻩf<〈endl;
ﻩ}
ﻩf、close();
}
Test、cpp
#include "menu、h”
int _tmain(int argc, _TCHAR* argv[])
{
ﻩmenu m;
m、select();
ﻩreturn 0;
}
展开阅读全文