中国计算机设计大赛赛事统计预习报告

一、问题描述和基本要求

【问题描述】
参加计算机设计大赛的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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值