运动会比赛计分系统1.docx
《运动会比赛计分系统1.docx》由会员分享,可在线阅读,更多相关《运动会比赛计分系统1.docx(28页珍藏版)》请在冰点文库上搜索。
![运动会比赛计分系统1.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/60073ffb-13f7-4f6f-b03f-1a3d5980de4b/60073ffb-13f7-4f6f-b03f-1a3d5980de4b1.gif)
运动会比赛计分系统1
运动会比赛计分系统
一、设计目的和任务
要求:
初始化输入:
N-参赛学校总数,M-男子竞赛项目数,W-女子竞赛项目数
各项目名次取法有如下几种:
取前5名:
第一名得分7分,第二名得分5,第三名得分3,第四名得分2,第五名得分1;取前3名:
第一名得分5,第二名得分3,第三名得分2;
功能要求:
(1)系统以菜单方式工作
(2)由程序提醒用户填写比赛结果,输入各项目获奖运动员信息。
(3)所有信息记录完毕后,用户可以查询各个学校的比赛成绩
(4)查看参赛学校信息和比赛项目信息等。
二、总体设计
编写目的:
根据要求分析文档,初步提出问题的解决方案,以及软件系统的体系结构和数据结构的设计方案并写出书面文档总体设计说明书,为下一步进行详细设计做准备。
2.1总体设计
该系统可以按功能进行模块划分,其模块图如下:
系统模块图
其中:
****菜单选择模块完成用户命令的接收,此模块是运动会比赛计分系统的入口,用户所要进行的各种操作均需在此模块中进行选择而调用其他模块实现相应的功能;
****信息输入模块完成学校、比赛项目(以及运动员的信息)输入功能,输入信息包括各参赛学校的编号、名称和每个学校在各比赛项目的编号、类型、名称、获奖次数、排名,以及(运动员姓名)等必要信息;
****计分模块是对输入信息的处理,是一种必要的辅助模块;
****输出模块包括:
1不输出信息,读入文件中;2输出信息,不读入文件。
其中输出的信息有:
学校编号、名称以及其所获奖项的项目编号、类型、名称、排名、男子总分、女子总分还有学校的总分等;
****文件读入模块是为了满足客户需要,为了储存信息,方便使用;
****信息查询模块完成对各信息的查询,查询时对应有两种选择以确定用户进行哪种查询。
2.2数据结构
本系统中主要的数据结构就是以学校为结点建立一个链式存储结构,结点中包括学校编号、学校名称、男子项目总分、女子项目总分、学校总分;再定义一个新的结构体是以项目信息为基础,通过指针实现学校来对项目信息的调用,无论是计分,输出还是查找均以链式存储结构来实现。
数据结构:
学校信息:
typedefstructschool
{
intsclnum;//学校编号
charsclname[20];//学校名称
sca[m+w];
intmscore;//男子团体总分
intwscore;//女子团体总分
intsum;//学校项目总分
structschool*next;
}scl;
scl*p,*q,*head,*g,*s,*u;//全局指针变量
项目信息(及运动员信息):
typedefstructsco
{
intmark[5];//分数
intitmnum;//项目编号
intitmkind;//项目类型
charitmname[20];//项目名称
charname[10];//运动员姓名
intl;//获奖名次数
intrange[5];//排名
}sc;
2.3程序流程
系统的执行应从输入信息功能开始,再执行菜单功能,依据用户的选择来进行后续的处理,直到用户选择退出系统为止,其间应对用户的选择做出判断及异常处理。
系统的流程图如下:
编写目的:
根据项目概要设计说明书,在项目概要设计的基础之上,对系统进行详细设计,以便下一步进行程序编码工作。
三、详细设计:
对于总设计时的系统模块功能图,各个功能模块的处理逻辑如下:
1)菜单选择模块:
调用voidmenu()//菜单函数
给出信息提示;
绘制菜单(包含查询、退出);
提示菜单选择并输入变量;
根据输入变量的值调用不同的模块函数;
以下是截取的菜单函数:
voidmenu()
{
system("cls");
printf("★================运动会比赛计分系统=================★\n");
printf("***********************welcome*********************\n");
printf("************************编制********************\n");
printf("**1------------------->>键盘输入**\n");
printf("**2------------------->>文件读入**\n");
printf("**3--------------------->>输出**\n");
printf("**4--------------------->>查询**\n");
printf("**5--------------------->>退出**\n");
printf("**男子前五名依次得分:
7分5分3分2分1分 **\n");
printf("**女子前三名依次得分:
5分3分2分**\n");
printf("*******************************************************\n");
printf("=======================================================\n");
}
2)信息输入模块:
调用scl*input()//信息输入函数
在输入信息时要求按照文字提示进行输入,要输入的信息包括:
参赛学校编号,名称以及比赛项目的编号,名称,获奖名次,排名,(运动员姓名)。
建立单链表,以链式存储结构来存放学校,项目等数据;
以下是输入的内容与形式:
scanf("%d",&p->sclnum);//输入学校编号
scanf("%s",p->sclname);//输入学校名称
for(x=0;x{
scanf("%d",&p->a[x].itmnum);//输入项目编号
scanf("%d",&p->a[x].itmkind);//输入项目类型
scanf("%s",p->a[x].itmname);//输入项目名称
scanf("%d",&p->a[x].l);//输入获奖名次数
for(i=0;ia[x].l;i++)
{
scanf("%d",&p->a[x].range[i]);//输入运动员的名次
scanf("%s",p->a[x].name);//运动员姓名
}
输入结束;在输入结束结束后要调用计分模块。
3)计分模块:
计分模块主要是依据输入信息的不同予以判断,并以不同的计分方式来计数将节点中的数据改变,并保存。
if(k==3)//女子项目取前三名
else//男子项目取前五名
4)信息输出模块:
根据用户的需要与选择,给出两种方式:
1、存入文件,不输出;2、输出,不存入文件。
printf("****1---------不输出,存入文件\n");
printf("****2---------输出,不存入文件\n");
scanf("%d",&co);
switch(co)
{
Case1:
运用文件存储内容;break;
Case2:
输出相应信息;break;
}
5)文件读入模块:
!
此模块只是用来读入文件中的信息,无实际意义,只是满足题目要求,需谨慎使用。
6)信息查询模块:
和输出模块相似,同样有两种选择:
1、按学校编号查询;2、按项目编号查询。
printf("按学校查找请输入1,按项目查找请输入2\n");
scanf("%d",&cha);
if(cha==1)
{
printf("请输入你要查询的学校编号:
");
scanf("%d",&num);
while(q!
=NULL)
{按学校输出相应信息;}
}
if(cha==2)
{
printf("请输入你要查询的项目编号:
");
scanf("%d",&xiang);
while(q!
=NULL)
{按项目输出相应信息;}
}
四、调试与测试
1.调试方法;
上机运行各个模块,分别调试,最后综合运行;
2.测试结果的讨论与分析;
首先必须要对程序进行数据信息输入,对于所需不同的信息程序会自动提示用户进行相关操作,再输出相关信息,对于一些错误的操作可能会造成程序运行错误的后果,因此在输入信息的时候用户请务必细心操作。
其数据与运行结果如下图:
运行结果:
输入1
输入:
1
huada
1111taiqiu31zhao2qian3sun
2222ticao12li
2
dongda
1111taiqiu24zhou5wu
2222ticao21feng3chen
输出:
输入:
3
输出:
输入:
2
输出:
输入:
4
输出:
输入:
1
输出:
输入;1
输出:
输入:
4
输出:
输入:
2
输出:
输入:
2
输出;
(因为只定义了两个学校,所以结果只有两个学校的名称)
输入:
3
输出:
输出:
输入:
2
输出:
结束程序运行!
五、源程序清单
#include
#include
#definen2//参赛学校数
#definem1//男子竞赛项目数
#definew1//女子竞赛项目数
typedefstructsco
{
intmark[5];//分数
intitmnum;//项目编号
intitmkind;//项目类型
charitmname[20];//项目名称
charname[10];//运动员姓名
intl;//获奖名次数
intrange[5];//排名
}sc;
typedefstructschool
{
intsclnum;//学校编号
charsclname[20];//学校名称
sca[m+w];
intmscore;//男子团体总分
intwscore;//女子团体总分
intsum;//学校项目总分
structschool*next;
}scl;
scl*p,*q,*head,*g,*s,*u;//全局指针变量
/****************************************************************************/
/******************************菜单函数*********************************/
voidmenu()
{
system("cls");
printf("★================运动会比赛计分系统=================★\n");
printf("***********************welcome*********************\n");
printf("************************编制********************\n");
printf("**1------------------->>键盘输入**\n");
printf("**2------------------->>文件读入**\n");
printf("**3--------------------->>输出**\n");
printf("**4--------------------->>查询**\n");
printf("**5--------------------->>退出**\n");
printf("**男子前五名依次得分:
7分5分3分2分1分 **\n");
printf("**女子前三名依次得分:
5分3分2分**\n");
printf("*******************************************************\n");
printf("=======================================================\n");
}
/******************************************************************************/
/*******************************计分函数*******************************/
voidcompute(inti,intx,intk)
{
if(k==3)//女子项目取前三名
{
switch(p->a[x].range[i])
{
case0:
p->a[x].mark[p->a[x].range[i]]=0;break;
case1:
p->a[x].mark[p->a[x].range[i]]=5;break;
case2:
p->a[x].mark[p->a[x].range[i]]=3;break;
case3:
p->a[x].mark[p->a[x].range[i]]=2;break;
default:
puts("输入有误!
");exit(0);
}
}
else
{
switch(p->a[x].range[i])//男子项目取前五名
{
case0:
p->a[x].mark[p->a[x].range[i]]=0;break;
case1:
p->a[x].mark[p->a[x].range[i]]=7;break;
case2:
p->a[x].mark[p->a[x].range[i]]=5;break;
case3:
p->a[x].mark[p->a[x].range[i]]=3;break;
case4:
p->a[x].mark[p->a[x].range[i]]=2;break;
case5:
p->a[x].mark[p->a[x].range[i]]=1;break;
default:
puts("输入有误!
");break;
}
}
}
/***********************输入函数***********************/
scl*input()//创建链表输入函数
{
inti,x,y=1,k;
p=(scl*)malloc(sizeof(scl));//头结点的初始化
printf("\n**按如下格式输入(相同学校编号不重复输入)**\n");
printf("**项目类型有:
111---男子222---女子**\n");
printf("**学校编号>>\n**学校名称>>\n**项目编号>>项目类型>>项目名称>>获得名次数>>名次>>姓名>>\n");
p->mscore=0;p->wscore=0;
scanf("%d",&p->sclnum);//输入学校编号
scanf("%s",p->sclname);//输入学校名称
for(x=0;x{
scanf("%d",&p->a[x].itmnum);//输入项目编号
scanf("%d",&p->a[x].itmkind);//输入项目类型
scanf("%s",p->a[x].itmname);//输入项目名称
scanf("%d",&p->a[x].l);//输入获奖名次数
for(i=0;ia[x].l;i++)
{
scanf("%d",&p->a[x].range[i]);//输入运动员的名次
scanf("%s",p->a[x].name);//运动员姓名
}
if(p->a[x].itmkind==222)//计分方式判断
k=3;
else
k=5;
for(i=0;ia[x].l;i++)
{
compute(i,x,k);
if(p->a[x].itmkind==222)//共两种项目:
111(男子项目)222(女子项目)
p->wscore+=p->a[x].mark[p->a[x].range[i]];
else
p->mscore+=p->a[x].mark[p->a[x].range[i]];
}
}
p->sum=p->mscore+p->wscore;//求学校总成绩
head=p;
q=p;
/********************************************************************/
while(y{
y++;//计数:
控制输入学校的个数
p=(scl*)malloc(sizeof(scl));
p->mscore=0;p->wscore=0;
scanf("%d",&p->sclnum);
scanf("%s",p->sclname);
for(x=0;x{
scanf("%d",&p->a[x].itmnum);
scanf("%d",&p->a[x].itmkind);
scanf("%s",p->a[x].itmname);
scanf("%d",&p->a[x].l);
for(i=0;ia[x].l;i++)
{
scanf("%d",&p->a[x].range[i]);
scanf("%s",p->a[x].name);
}
if(p->a[x].itmkind==222)
k=3;
else
k=5;
for(i=0;ia[x].l;i++)
{
compute(i,x,k);
if(p->a[x].itmkind==222)
p->wscore+=p->a[x].mark[p->a[x].range[i]];
else
p->mscore+=p->a[x].mark[p->a[x].range[i]];
}
}
p->sum=p->mscore+p->wscore;
q->next=p;
q=p;
}
p->next=NULL;
menu();
returnhead;
}
/********************输出函数********************/
voidoutput(scl*head)//输出成绩
{
scl*q=head;
inti,x,y=1;
FILE*fp;
intco;
printf("****1---------不输出,存入文件\n");
printf("****2---------输出,不存入文件\n");
scanf("%d",&co);
switch(co)
{
case1:
{
fp=fopen("d:
\\abc.txt","w+");
if(fp==NULL)
{printf("无法打开文件!
");exit(0);}
while(q!
=NULL)
{
fprintf(fp,"%d\n",q->sclnum);
for(x=0;x{
fprintf(fp,"%d\t\n",q->a[x].itmkind);
fprintf(fp,"%d\t\n",q->a[x].l);
for(i=0;ia[x].l;i++)
fprintf(fp,"%d\t",q->a[x].range[i]);
fprintf(fp,"\n");
}
q=q->next;
}
fclose(fp);
}break;
case2:
while(q!
=NULL)
{
printf("===================================\n");
printf("学校编号:
\t");
printf("%d\n",q->sclnum);
printf("学校名称:
\t");
printf("%s\n",q->sclname);
for(x=0;x{
printf("项目编号:
\t");
printf("%d\n",q->a[x].itmnum);
printf("项目类型:
\t");
printf("%d\n",q->a[x].itmkind);
printf("项目名称:
\t");
printf("%s\n",q->a[x].itmname);
printf("有%d个获奖名次:
\t",q->a[x].l);
for(i=0;ia[x].l;i++)
{
printf("第%d名\t",q->a[x].range[i]);
}
printf("\n\n");
}printf("男子团体项目总分:
\t%d\n",q->mscore);
printf("女子团体项目总分:
\t%d\n",q->wscore);
printf("学校项目总得分:
\t%d\n\n",q->sum);
printf("\n");
q=q->next;
}break;
default:
puts("输入有误!
");exit(0);
}
}
/********************文件读入函数********************/
scl*read()
{
FILE*fpa=NULL;
inti,x,y=1,k;
p=(scl*)malloc(sizeof(scl));
p->mscore=0;p->wscore=0;
fpa=fopen("d:
\\abc.txt","r+");//打开文件
if(fpa==NULL)
{puts("对不起,无法打开文件!
");exit(0);}
fscanf(fpa,"%d",&p->sclnum);
for(x=0;x