数据结构课程设计运动会分数统计系统.docx
《数据结构课程设计运动会分数统计系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计运动会分数统计系统.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计运动会分数统计系统.docx](https://file1.bdocx.com/fileroot1/2023-1/30/3bb4551c-f000-4884-8406-d5f7ee2e4b0f/3bb4551c-f000-4884-8406-d5f7ee2e4b0f1.gif)
数据结构课程设计运动会分数统计系统
运动会分数统计系统
Ø设计内容
1.任务:
参加运动会有n个学校,学校编号为1~n。
比赛分成m个男子项目,和w个女子项目。
项目编号为1~m,女子为m+1~w。
不同的项目取前5名或前3明积分;取前5名的积分为:
7、5、3、2、1,前3名的积分分别为:
5、3、2;哪些项目取前5名或前3名由学生自己决定。
(m<=20,n<=20)。
2.功能要求:
1)可以输入各个项目的前3名或前5名的成绩;
2)能统计各个学校总分;
3)可以按学校编号、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;
5)可以按项目编号查询取得前3或前5名的学校。
Ø设计思路
1.系统结构设计图
2.思路分析
1)从上面的结构设计图来看,隐含地给出了第一个约束条件:
每个参赛学校均参加所有的比赛项目。
然而这种设计思路并不符合实际情况,因为每个学校有权利选择参加或不参加某个比赛项目。
2)首先,在上述结构图中,比赛项目Event是最小的数据存储基本单元。
比赛项目集合SportEvents可以理解为Event数组,包含了所有的比赛项目。
根据约束,只要有学校University参加运动会,此学校就包含了一个SportEvents集合,即为每个学校分配自己的项目成绩单。
有n个学校报名参加了运动会SportsMeeting,大会的工作人员根据比赛项目结果统计各个学校的成绩。
因此,这种设计结构有3层包含关系,但是每一部分相互独立,耦合性弱。
3)除了第1条所指出的设计缺陷,这种设计也面临着另一个问题。
项目的成绩如何输入?
常规思想是根据比赛结果,向系统输入比赛项目的前3或5名的学校编号或名称,系统后台自动累加积分。
但是,这里项目是最小的单元,学校又包含了项目,也就是说每个学校的项目成绩单之间是封闭的,学校和学校之间是无法看到的,只有运动会的工作人员才有权限按照逻辑关系查询某个学校的某项成绩,所以显然就不能按照常规思想进行项目成绩的输入。
那怎么办呢?
直接输入分数。
我再给出第二个约束:
对于一个项目来说,每个学校只派出一个代表参加。
通常对于一个比赛项目来说,学校可以派出不止一个代表参加,就像奥运会的男子百米飞人大赛,牙买加出3名,美国出3名等。
表1
项目1
表2
项目1
学校1
1
学校1
5
学校2
学校2
0
学校3
3
学校3
2
学校4
学校4
0
学校5
2
学校5
3
根据第二个约束条件,假设裁判给出比赛结果表1中的学校名次,工作人员根据名次,将表2的分数输入到系统即可。
4)从另一个方面来看,如果大会的积分规则改变了。
除非系统有对外修改积分规则的接口,否则工作人员就无能为力了。
因此以表2的形式更加有灵活性。
5)客观的说,此系统的设计上有很多缺陷,与实际的常规思想有所不同,所以才加入了两个约束条件。
Ø功能设计
1.功能模块设计图
2.实现思路
1)模块设计图中具体功能明了,这里就不再重复了。
2)一般情况下,学校信息,比赛项目信息和项目成绩都需要在cmd窗口中进行输入。
这也带来2个问题。
一是如果学校有n个,项目有m个,取前5名,那么你就要输入n*m*5个数据,工作量大。
二是一旦发现历史输入有误,那么就要全部重新输入数据。
为解决这个问题,本系统以文件流的形式导入数据,文件流最简单的方式就是读写txt。
我把每个项目的成绩放在对应的txt文件中,如男子100米——M100.txt,具体对应关系可以查看PointsRules.txt。
文件里的内容形式与表2相同,存放的是项目成绩。
在cmd窗口中,需要哪个项目的成绩,就导入对应的txt文件即可。
此外,如果项目成绩发生变化,只需修改txt文件,再重新导入即可。
3)采用OOP编程,将每一部分封装成一个类,每个类满足了强内聚、松耦合原则。
具体的类的定义和声明请查看代码。
4)在结构设计图中,学校和项目的数量是可以任意的,虽然需求规定m<=20,n<=20。
如果直接定义数组(对象数组或者结构数组)大小为20,可能存在资源浪费的情况。
为此,我采用了c++自带的通用模板(也即泛型)vector<>结构。
对于SportEvents类来说,它包含了vector类型的数据成员;在SportsMeeting类中,包含了vector类型的数据成员。
调用push_back()函数,就可以根据实际情况添加任意个学校或者项目。
5)此外,采用vector另一个好处,就在于排序,对应功能要求的第5条。
Vector背后运用的是迭代器,也就可以调用通用函数sort()对vector进行排序,只要设计相应的排序规则即可,简化了工作量。
Ø程序实现
1.运行环境
WinXP,VC++6.0。
2.工程项目
工程文件SportsMeeting,包括SportsMeeting.h,SportsMeeting.cpp,Client.cpp。
3.编译原理图
4.类声明
对应结构设计图中所设计的4个类,在SportsMeeting.h中声明
***************************Event类***************************
classEvent
{
public:
Event();
voidsetEventInfo(constint&index,conststringname);//设置项目编号和名称
intgetEventIndex()const;//返回项目编号
stringgetEventName()const;//返回项目名称
intgetEventScore()const;//返回项目成绩
voidsetEventScore(constint&score);//设置项目成绩
private:
inteventIndex;//项目编号
stringeventName;//项目名称
inteventScore;//项目成绩
};
***************************SportEvents类***************************
classSportEvents
{
public:
SportEvents();
voidsetSportEventsInfo();//设置运动会项目信息
voiddisplaySportEventsInfo()const;//返回所有比赛项目信息和目前成绩
voidinitializeSportEvents();//初始化比赛信息
vector&getMySportEvents();
private:
vectormySportEvents;
};
***************************University类***************************
classUniversity
{
public:
University();
voidinitializeUinversity();//初始化
voidsetUniversityInfo(constint&index,conststringname);//设置学校信息
voidgetUniversityInfo()const;//返回学校信息
intgetUniversityIndex()const;//返回学校编号
stringgetUniversityName()const;//返回学校名称
voidgetUniversitySportsInfo()const;//返回学校所有参赛项目信息
intgetTotalScore();//返回学校总成绩
intgetMTScore();//返回男团总分
intgetWTScore();//返回女团总分
SportEvents&getUniSportEvents();
private:
intuIndex;//学校编号
stringuName;//学校名称
inttotalScore;//学校总成绩
intmTeamScore;//男团总分
intwTeamScore;//女团总分
SportEventsuSportEvents;//Sports对象
};
***************************SportsMeeting类***************************
classSportsMeeting
{
public:
SportsMeeting();
voidinitializeSportsMeeting();//初始化运动会
voiddisplayUniversity()const;//显示所有参赛学校信息
voiddisplaySportEvents()const;//显示所有比赛项目信息
voiddisplaySingleUniversity();//显示指定学校所有成绩信息和总分
voiddisplayPointsRules()const;//显示积分排名规则
voidimportEventScore();//导入某个项目的成绩
voidcountTotalScore();//统计各学校总分
voidsortByTotalScore();//按学校总分排序
voidsortByMTScore();//按男团总分排序
voidsortByWTScore();//按女团总分排序
voidinquireByUIandEI();//按学校编号查询某个项目成绩
voidinquireByEIandTop();//按项目编号查询Top(n)学校
private:
vectormyUniversity;
boolflag;//标记是否导入过成绩
};
5.程序代码
请见附录
测试数据:
学校数据
校名
东华大学
上海交大
复旦大学
同济大学
华东师范
编号
1
2
3
4
5
项目数据
项目编号
1
2
3
4
5
项目名称
男子100
男子200
男子400
男子跳高
男子跳远
项目编号
6
7
8
9
10
项目名称
女子跳高
女子跳远
女子铅球
女子100
女子400
6.实验结果
1)程序界面
2)展示参赛学校信息(selection=1)
3)展示所有比赛项目信息(selection=2)
4)展示排名积分规则(selection=3)
调用系统API,打开一个txt文件。
5)输入比赛项目成绩(selection=4)
首先给出项目编号,然后给出对应的成绩表,即txt文件,系统导入成绩。
输入3组数据:
男子100(M100),女子100(W100),男子跳远(MLJ)。
6)统计每个学校的总分(selection=5)
此功能也对应按学校编号排序输出
7)查询学校的项目成绩单和总分(selection=6)
如果想具体了解某个学校的所有比赛成绩情况,可以选择此功能。
8)按照学校总分排序输出(selection=7)
9)按照男子团体总分排序(selection=8)
目前只输入2个男子项目:
男子100,男子跳远。
10)按照女子团体总分排序(selection=9)
只输入1个女子项目:
女子100。
11)查询某个学校的某项成绩(selection=10)
12)查询某个项目的前3或前5名成绩(selection=11)
Ø总结与展望
随着对OOP的深入理解,以及设计模式的学习,希望尽快写出Version2。
附录:
程序代码
请前往“新浪爱问·共享资料”网站
资料分类>IT资料>源代码>VC
搜索运动会分数统计C++源代码.rar
写于DHU