题目:编制一个运动会分数统计的程序
一、需求分析
1、.参加运动会的n个学校编号为1~n。比赛分为m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w.由于各项目参加人数差别较大,有些项目取前5名,得分顺序为7,5,3,2,1;还有些项目只取前3名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。
2、产生各学校的成绩单,内容包括各校所得的每项成绩的项目号﹑名次(成绩)﹑姓名和得分;产生团体总分报表,内容包括校号﹑男子团体总分﹑女子团体总分和团体总分。
3、 测试数据
对于n=4,m=3,w=2,编号为奇数的项目取前5名,编号为偶数的项目取前3名,设计一组实例数据。
4、实现提示
可以假设n≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项目结束时,将其编号﹑类型符(区分取前5名还是前3名)输入,并按名次顺序输入运动员姓名﹑校名(和成绩)。
5、其他要求
允许用户指定某个项目采取其他名次取法。
二、概要设计
根据题目要求,该问题的实现可以分为五个模块。
1、 输入模块,输入相关的项目数,学校数。
2、 排序模块,对输入的数据进行相关计算,排序。
3、 输出模块,按要求输出信息。
4、 菜单模块,设计简易菜单选项,供用户循环使用。
5、 查询模块,查询相关项目,学校信息。
三、详细设计
1、定义项目和学校的结构体类型
struct Project
{
char name[20];//项目名称
int b_num[6];//前三名或者前五名学校编号
}p[21];
struct School
{
char name[10];//学校名称
int num;//学校编号
int TotalScore; //学校总分
int MaleTotal; //男子总分
int FemaleTotal; //女子总分
}Sch[21];
2、全局变量的定义
int n,m,w;
int qianwu[5]={7,5,3,2,1};//前五名得分
int qiansan[3]={5,3,2}; //前三名得分
3、编写查询函数
void FindSchool() //查询学校信息
{
int i,s;
printf("输入需要查询的学校编号:");
scanf("%d",&s);
printf("该学校相关信息:\n");
for(i=1;i<=n;i++)
{
if(Sch[i].num==s)//学校编号等于要查找的编号
{
print(i);
break;
}
}
printf("\n");
}
void FindProject() //查询项目信息
{
int i,s=0;
printf("输入需要查询的项目编号:");
scanf("%d",&s);
printf("%s前五名学校编号及名称为:\n",p[s].name);
for(i=1;i<=5;i++)//若项目个数不足,相应值为空
printf("名次%d 学校编号%d 学校名称%s\n",i,p[s].b_num[i],Sch[p[s].b_num[i]].name);
printf("\n");
}
4、按编号排序函数
void Number() //按编号排序
{
int i,j;
School t; //定义一个school对象t
for(i=1;iSch[j].num)
{
t=Sch[i];
Sch[i]=Sch[j];
Sch[j]=t;
}
}
printf("按编号排列:\n");
for(i=1;i<=n;i++)
print(i);
}
四、调试分析
1. 该问题跟我们平时做的那个关于用链表实现学生成绩管理系统的程序类似,我在这里用了两个结构体,将项目跟学校分开考虑,利用结构体的对象访问其成员,来达到预期的效果。
2. 在调试该程序时,在输入函数这个模块void input(),我开始计划将参数直接传进去,类似int input(int n int m int w),这样确实可以免去定义全局变量,但是在实现后面的查找等函数时候,发现仍然得使用这几个变量,由于只在输入函数中定义了,于是后面的函数无法使用,所以最后还是决定定义成全局变量。
3. 在菜单中开始没有考虑到程序结束,后来多次尝试后,增加了一个void end()函数,用来结束该程序的运行。
五、用户手册
1. 本程序运行环境为控制台(Console),执行文件为运动会分数统计.exe
2. 只需运行该程序便可看到演示结果。
六、测试结果
输入(n=4,m=3,w=2)
七、附录
#include
#include
#include
int n,m,w;
int qianwu[5]={7,5,3,2,1};//前五名得分
int qiansan[3]={5,3,2}; //前三名得分
struct Project
{
char name[20];//项目名称
int b_num[6];//前三名或者前五名学校编号
}p[21];
struct School
{
char name[10];//学校名称
int num;//学校编号
int TotalScore; //学校总分
int MaleTotal; //男子总分
int FemaleTotal; //女子总分
}Sch[21];
void input() //输入前三或前五成绩
{
int i,j,x;
printf("输入学校数目:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("输入第%d个学校的名称:",i);
//cin>>sch[i].name;
scanf("%s",&Sch[i].name);
Sch[i].TotalScore=0;
Sch[i].FemaleTotal=0;
Sch[i].MaleTotal=0;
Sch[i].num=i;//学校编号
}
printf("输入男子项目数m和女子项目数w:");
scanf("%d%d",&m,&w);
for(i=1;i<=m+w;i++)
{
printf("输入第%d个项目的名称:",i);
scanf("%s",&p[i].name);
if(i%2!=0)//项目编号为奇数,取前五名
{
printf("\n输入第%d个项目的前5名的学校编号:",i);
for(j=1;j<=5;j++)
{
scanf("%d",&x);
p[i].b_num[j]=x; //将学校编号x存在数组中
Sch[x].TotalScore+=qianwu[j-1];
if(i<=m)//前m个项目是男子项目
Sch[x].MaleTotal+=qianwu[j-1]; //男子团体总分累加
}
}
else//项目编号为偶数,取前三名
{
printf("输入第%d个项目的前3名的学校编号:",i);
for(j=1;j<=3;j++)
{
scanf("%d",&x);
p[i].b_num[j]=x;
Sch[x].TotalScore+=qiansan[j-1];
if(i>m)//m个项目后便是女生项目
Sch[x].FemaleTotal+=qiansan[j-1]; //女子团体总分累加
}
}
}
}
void print(int i)
{
printf("学校编号:%d 学校名称:%s 学校总分:%d 男子团体总分:%d 女子团体总分:%d\n",Sch[i].num,Sch[i].name,Sch[i].TotalScore,Sch[i].MaleTotal,Sch[i].FemaleTotal);
}
void Number() //按编号排序
{
int i,j;
School t; //定义一个school对象t
for(i=1;iSch[j].num)
{
t=Sch[i];
Sch[i]=Sch[j];
Sch[j]=t;
}
}
printf("按编号排列:\n");
for(i=1;i<=n;i++)
print(i);
}
void SchoolTotal() //按学校总分排序
{
int i,j;
School t;
for(i=1;i