文章目录
一、问题描述和基本要求
【问题描述】
参加计算机设计大赛的n个学校编号为1n,赛事分成m个项目,项目的编号为1m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
【基本要求】
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
【设计要求】
1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。
【实现提示】
假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩.
二、问题分析和任务定义
1.数据结构的选取
本项目使用结构体作为数据结构,分别用学校(school)、团队(team)、项目(project)来表示比赛的相关信息。
2.问题分析
本题目中,并没有给我们相关的比赛信息,所以需要我们自己去输入或用随机数生成,但要能保存在数据里,留待下一次的取用,同时要注意题目对相关数量的要求。
项目project尽量在3-10个左右
学校school要能保证使每个项目至少10只队伍
团队team要保证每个学校不能超过六个
注意每个team只能选一个项目
3.功能分析
(1)能够随时添加相关信息;
(2)照学校编号或名称查询,学校的总分输出;
(3)按学校编号查询学校某个项目的获奖情况;
(4)可以按项目编号查询取得前三名的学校(注意并列的情况);
(5)可以查询任意项目的总分;
三、逻辑设计
1.变量的类型说明:
school类 | name(名字)、length(参赛队伍数量)、sum(学校总分) |
---|---|
team类 | score(团队得分)、jud(参加的项目) |
project类 | score(项目得分)、sum(项目总分) |
2.变量说明
sch[n] | 参加比赛的学校(School类型) |
---|---|
te[i] | 参加的队伍(Team类型) |
pro[m] | 赛事项目(project类型) |
3.函数说明
readdata() | 读取文件里的比赛信息 |
---|---|
input() | 添加新的参赛学校和队伍 |
readdata() | 读取文件里的比赛信息,通过fstream来完成 |
schoolsum() | 计算学校总分排名 |
evschoolsum() | 按照学校编码查询总分 |
prothree() | 按项目编号查询取得前三名的学校 |
evprosum() | 计算项目总分 |
schoolaw() | 按学校编号查询学校某个项目的获奖情况 |
4.抽象数据结构
ADT 计算机设计大赛赛事统计
Data
学校列表schools<School>
项目列表projects<Project>
队伍列表teams<Team>
Operation
界面设计
输入:无
功能:输出主菜单交互界面
输出:主菜单交互界面
读取数据
输入:无
功能:读取文件中的比赛信息
输出:无
添加学校/队伍
输入:学校/队伍信息
功能:将输入的信息存入对应的结构体数组中
输出:无
输出学校/项目总分
输入:无
功能:输出学校/项目总分
输出:学校/项目总分
输出任意学校的总分
输入:学校编号
功能:根据编号输出学校总分
输出:学校总分
输出所有学校总分,总分降序输出
输入:无
功能:降序输出所有学校总分
输出:所有学校总分
通过学校编号查询各项目总分降序输出
输入:学校编号
功能:查询该学校所有项目分数,并且降序输出
输出:学校所有项目分数
按学校编号查询学校某个项目的获奖情况
输入:学校编号和项目编号
功能:查询该学校对应项目的获奖情况
输出:该学校对应项目的获奖情况
按项目编号查询取得前三名的学校
输入:项目编号
功能:查询该项目取得前三名的学校
输出:该项目取得前三名的学校编号
退出程序
输入:N
功能:退出程序
输出:无
end ADT
四、物理结构
1.存储结构
1.定义结构体school类和team类,并在school类中存放team类数组
2.定义结构体project类表示项目
2.模块设计
1.主函数模块
2.读取数据和输入模块
3.计算总分降序输出模块
4.获得项目排名模块
3.函数设计
伪代码:
1.school类:name(名字)、length(参赛队伍数量)、sum(学校总分);
2.team类: score(团队得分)、jud(参加的项目);
3.project类:score(项目得分)、sum(项目总分);
4.sch[n];
5.te[i];
6.pro[m];
7.readdata(){读取文件里的比赛信息,通过fstream来完成}
8.input(){添加比赛信息}
9.evschoolsum(){查询各个学校的总分,并降序输出}
10.schoolsum(){按编号查询学校总分}
11.prothree(){按项目编号查询取得前三名的学校}
12.evprosum() {计算项目总分 }
13.schoolaw(){按学校编号查询学校某个项目的获奖情况}
4.算法流程图
五、测试数据
六、具体函数实现
1.schoolsum()
void schoolsum() //根据编号查询学校总分
{
int a;
cout << "目前共有" << n << "个学校参赛" << endl;
cout << "请输入需要查询总分的学校编号(1-" << n << ")" << endl;
while (true)
{
cin >> a;
if (!cin.good()||a<1 || a>n)
cout << "输入编号有误,请重新输入" << endl;
else break;
cin.clear();
cin.ignore(1024, '\n');
}
cout << "该学校的总分为" << sch[a - 1].sum << endl;
}
2.evschoolsum()
void evschoolsum() //各学校总分,降序输出
{
int a[100];
int b[100];
for (int i = 0; i < n; i++)
a[i] = sch[i].sum;
sort(a, a + n); //对数组排序
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (sch[j].sum == a[i])
b[i] = j;
}
}
cout << "学校编号" <<" " << "学校名称" << " " << "总分" << endl;
for (int i = 0; i < n; i++) //降序输出
{
cout << " " << b[n-i-1]+1 <<" " <<sch[b[n-i-1]].name<< " " << a[n - i - 1] << endl;
}
}
3.evprosum()
void evprosum() //项目总分
{
cout << "项目" << " " << "总分" << endl;
for (int i = 0; i < 6; i++)
{
cout << " " << i+1 << " " << pro[i].sum << endl;
}
}
4.scevprosum()
void scevprosum() //根据学校编号查询各个项目得分
{
int x;
cout << "请输入所需要查询的学校编号(1-" << n << ")" << endl;
while (true)
{
cin >> x;
if (!cin.good()||x<1 || x>n)
cout << "输入编号有误,请重新输入" << endl;
else break;
cin.clear();
cin.ignore(1024, '\n');
}
int a[20];
int b[20];
for (int i = 0; i < sch[x - 1].length; i++)
a[i] = sch[x - 1].te[i].sc;
sort(a, a + sch[x - 1].length); //对数组排序
for (int i = 0; i < sch[x - 1].length; i++)
{
for (int j = 0; j < sch[x - 1].length; j++)
{
if (sch[x-1].te[j].sc == a[i])
b[i] = sch[x - 1].te[j].jud;
}
}
cout << "项目编号" << " " << "总分" << endl;
for (int i = 0; i < sch[x - 1].length; i++) //降序输出
{
cout << " " << b[sch[x - 1].length - i - 1] <<" " << a[sch[x - 1].length - i - 1] << endl;
}
}
5.prothree()
void prothree() //根据编号查询项目的前三名
{
int x;
int y = 0;
int a[100];
int b[3];
cout << "请输入需要查询排名的项目编号(1-6)" << endl;
while (true)
{
cin >> x;
if (!cin.good()||x < 1 || x>6)
cout << "输入编号有误,请重新输入" << endl;
else break;
cin.clear();
cin.ignore(1024, '\n');
}
for (int i = 0; i < n; i++)
a[i] = pro[x-1].score[i];
sort(a, a + n);
for (int i = n-1; i > n-4; i--)
{
for (int j = 0; j < n; j++)
{
if (pro[x-1].score[j] == a[i])
b[y++] = j+1;
}
}
if (b[0] == b[1])
{
cout << "该项目的第一名为: 学校" << b[0] <<"和学校"<<b[1]<< endl;
cout << "该项目的第二名为: 学校" << b[1] << endl;
}
else if (b[1] == b[2])
{
cout << "该项目的第一名为: 学校" << b[0] << endl;
cout << "该项目的第二名为: 学校" << b[1] << "和学校" << b[2] << endl;
}
else if(b[0]==b[1]==b[2])
{
cout << "该项目的第一名为: 学校" << b[0] << "和学校" << b[1] <<"和学校"<<b[2]<< endl;
}
else
{
cout << "该项目的第一名为: 学校" << b[0] << endl;
cout << "该项目的第二名为: 学校" << b[1] << endl;
cout << "该项目的第三名为: 学校" << b[2] << endl;
}
}
6.schoolaw()
void schoolaw() //查询任意学校任意项目获奖情况
{
int a;
int b;
int jud = 0;
cout << "请输入所需要查询的学校编号(1-" <<n <<")" << endl;
while (true)
{
cin >> a;
if (!cin.good()||a<1 || a>n)
cout << "输入编号有误,请重新输入" << endl;
else break;
cin.clear();
cin.ignore(1024, '\n');
}
cout << "请输入需要查询的项目编号(1-6)" << endl;
while (true)
{
cin >> b;
if (!cin.good()||b < 1 || b>6)
cout << "暂无该编号项目,请重新输入" << endl;
else break;
cin.clear();
cin.ignore(1024, '\n');
}
int c[100];
for (int i = 0; i < n; i++)
c[i] = pro[b-1].score[i];
sort(c, c + n);
for (int i = n - 1; i > n - 4; i--)
{
if(pro[b-1].score[a-1]==c[i])
{
cout<<"该学校在该项目中获得第"<<abs(i-n)<<"名"<<endl;
jud = 1;
break;
}
}
if (jud == 0)
cout << "该学校在该项目中没有获奖" << endl;
}
以上代码均能ac。