2022/6/7
一、大型实验的内容
歌手比赛系统用于对歌手比赛的成绩进行管理,要求完成的主要的功能包括菜单实现功能选择、进行若干场次的唱歌比赛信息管理。可以完成输入、追加、修改和删除选手数据,进行评委打分,计算总成绩和平均成绩并能按照单个评委成绩、总成绩进行排序等工作。要求使用学习过的C/C++程序设计的知识完成歌手比赛系统的设计与实现。
二、运行环境
歌手比赛系统在Visual Studio 2019平台下开发。
操作系统:
Windows 10
硬件环境:
处理器:11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz 2.80 GHz
内存:16.0 GB
系统类型:64位操作系统
三、实验课题分析
3.1 歌手比赛系统的主要功能
歌手比赛系统主要功能为:菜单功能选择、选手数据管理、评委打分管理、唱歌比赛信息管理,可以计算出总成绩和平均成绩(去掉最高分,去掉最低分),并能按照单个评委成绩,总成绩进行排序等工作。详细的系统功能结构为图1所示。
系统各模块的功能具体描述为:
1、菜单功能选择
选择功能,输入需要的功能,成功后进行相应的功能模块。第一次登录要从文件读入所有的信息,包括选手评委信息和成绩信息。
退出登录的时候则要保存当前系统的所有状态,包括选手评委信息和成绩信息。
2、选手数据管理
可以查看每个选手的编号和姓名,以及评委成绩。
可以输入、追加、修改和删除选手数据。
3、评委打分管理
输入每个选手的数据包括编号、姓名、十个评委的成绩,进行打分。
能够计算出总成绩和平均成绩(去掉最高分,去掉最低分),并能按照单个评委成绩,总成绩进行排序。
4、唱歌比赛信息管理
可以进行若干场次的唱歌比赛信息管理。
进入选择状态,根据提示依次输入唱歌比赛的基本信息,进入选择的比赛。
3.2 系统分析及设计
系统涉及对象有三个基本类:菜单类、歌手类和比赛类。
可以采用面向对象的方式实现歌手比赛系统,根据不同的需求,使用对象分为菜单以及比赛和歌手。
分别设计菜单类、比赛类、歌手类实现功能。
用文本文件进行数据的保存,需要保存的数据主要包括歌手编号、歌手姓名、歌手总分和平均分和各评委打分。实现所有的文本操作相关的功能。
3.3系统的实现
(1)类的编写
系统工程名为:歌手比赛系统。包含了menu类和singer类。menu类实现主菜单转换,singer类储存歌手数据(编号、姓名、总分、平均分以及个评委打分)
具体类结构声明如下:
- menu类:
class menu {
public:
void inter();//总场次选择
void run();//运行
void compete(int x);//比赛功能实现
void write();//写入数据
competition com[5];//五场比赛
};
- singer类:
class singer {
public:
int num;//编号
string name;//姓名
double score[pw];//评委打分
double sum;//总成绩
double ave;//平均成绩
singer* next;
void mark();//计算总分和平均分
singer();//构造函数
};
(2)链表的使用
系统实现采用文件的输入输出流对文本数据进行读取与写入,但是由于歌手编号、歌手姓名、歌手总分和平均分和各评委打分都是一个数据的集合,于是对数据的存储组织使用了单向链表。
因为歌手比赛系统在输入、追加、修改、删除、查询、排序的时候都需要处理大量的数据,所以使用链表十分必要。在singer类的基础上定义一个对应的competition类来管理每场比赛歌手数据,具体的结构声明如下:
class competition {
public:
competition();//构造函数
~competition();//析构函数
void input();//输入
void add();//追加
void revise();//修改
void deletee();//删除
void search();//查询
void pwdf();//评委打分
void sortt();//排序
singer* sorttt(singer* head);//快速排序
singer* head;//链表
int num;//歌手人数
};
在运用时,令当前歌手的next结点指向新的歌手结点,即结点的指针next保存新的歌手结点的地址,以此类推,所有歌手数据就通过链表的形式串联起来了。
歌手比赛系统的信息的管理就具体表现为链表的操作。拿歌手数据来说,歌手数据的输入、追加、修改、删除、查询、排序与链表的输入、追加、修改、删除、查询、排序对应。
四、实验调试、测试、运行记录及分析
遇到的问题及解决方法如下:
问题1:
问题描述:开始修改评委打分后无法同步修改总成绩和平均成绩。
解决方法:没有重新计算导致的错误,在修改段添加分数计算函数mark()。
问题2:
问题描述:排序后编号姓名与成绩无法匹配。
解决方法:singer类中数据比较多,更改采用快速排序的快慢指针直接修改。
问题3:
问题描述:运行结束退出系统时,显示两次“已退出系统”。
解决方法:由于是再次在compete()函数里运行run()再执行退出,先退出run()函数会在compete()函数内再次判断,需在重新回到上一个界面代码段直接写入return结束程序。
五、实验总结
我设计的歌手比赛系统基本满足任务书的功能要求,类的结构和关系清晰,功能完善,而且在批量数据存储上采用了链表,在空间的利用率、集合数据操作(添加和删除)上具有优势。也能支持多种模式的数据处理。
存在的缺点主要是对于比赛场次管理方面,只能利用于已知固定场次的比赛数据管理。数据读写只能按比赛场次顺序写入.txt。
通过这次C++的大型实验,我深刻的明白到:课本知识与实践能力相结合的重要性。要深刻熟练掌握系统知识与具体实践之间的关系。实践是认识的来源。认识是主体对客体的能动的反映,这种反映只有在实践中、在主体和客体的相互作用中才能实现。实践是认识发展的动力。认识产生于实践的需要,推动人们不断进行新的探索和研究。实践是检验认识的真理性的唯一标准。只有把主观和客观联系起来加以比较和对照的东西,才能检验主观认识与客观事物是否相符合。唯一能够满足这一要求的,就是处在主观和客观交汇点上的实践。实践是认识的目的。认识从实践中来,最终还要回到实践中去。因此,我们需要坚持一切从实际出发,实事求是,充分发挥主观能动性,不断解放思想,与时俱进,以求真务实的精神探求事物的本质和规律,用科学的理论武装头脑、指导实践。