资源描述
C语言专业课程设计之校运动会标准管理系统的设计与实现
一 题目要求
课题:校运动会管理系统的设计与实现
具体要求:
(1)信息初始化,依次输入:
N—参赛学校总数 M—男子竞赛项目数 W—女子竞赛项目总数
各项目名次取法有以下几种:
①取前五名:第一名得分7分,第二名得分5分,第三名得分3分,第四名2分,第五名得分1分。
②取前三名:第一名得分5分,第二名得分3分,第三名得分2分。
③用户自定义:各名次权值由用户定义。
(2)提醒用户填写比赛结果,输入各项目获奖运动员的信息。
(3)所有信息记录完毕后,用户可以查询各个学校的比赛成绩,生成团体总分报表,查看参赛学校信息和比赛项目信息等。
二 需求分析
根据题目要求,将学校的信息和比赛项目等信息存放到指定的文件中,并能实现相关信息的浏览功能,故在程序中应提供输入,输出,显示,查找,排序等操作。
三 总体设计
由需求分析可讲系统分为信息输入模块,比赛录入模块和查询模块三个模块,并追加一些辅助模块以增加程序的功能,方便使用。
四 详细设计
1 主函数
主要通过main()函数及choose()函数实现.
void main() /***************主函数**************/
{
int choos
printf("\n\n * * * 运动会分数统计 * * *\n\n\n");
printf("共有多少个学校参赛:");
scanf("%d",&a);
while(a<=0||a>20)
{
if(a<=0)
{
printf("\n 参赛学校个数不能是负数或零\n\n");
printf("共有多少个学校参赛:");
scanf("%d",&a);
}
图1 主函数流程图
if(a>20)
{
printf("\n 参赛学校个数不能大于20\n\n");
printf("共有多少个学校参赛:");
scanf("%d",&a);
}
}
printf("有几个男子组:");
scanf("%d",&c);
printf("有几个女子组:");
scanf("%d",&d);
for(i=0;i<=a;i++)
{
f[i]=(struct node *)malloc(sizeof(struct node)*(c+d+3));
for(j=0;j<=c+d+2;j++)
f[i][j].num=0;
}
choos=choose();
while(1)
{
while(choos<0||choos>8)
choos=choose();
(*g[choos])();
printf("\n");
choos=choose();
}
}
int choose()
{
int choo;
printf("\n\n 1*输入成绩\n");
printf(" 2*统计各学校的总分\n");
printf(" 3*按学校编号排序输出\n");
printf(" 4*按学校总分排序输出\n");
printf(" 5*按男团体总分排序输出\n");
printf(" 6*按女团体总分排序输出\n");
printf(" 7*按学校编号查询学校某个项目的成绩\n");
printf(" 8*按项目编号查询取得前三或前五名的学校\n");
printf(" 9*退出\n\n");
printf("请选择:");
scanf("%d",&choo);
}
2 成绩输入
结束
输入运动项目代号
输入评分制度
依次输入获奖学校
开始
是否在范围
是否为三或五
图2 运动会成绩输入流程图
当选择1 (),相关实现如下:
{ void input()
int ab,ac,ae,af,g=1,get[5]={0,0,0,0,0};
printf("\n请输入项目代号:");
ale:scanf("%d",&ab);
if(ab>c+d||ab<1)
{
printf("\n此项目代号不存在,重新输入\n");
goto ale;
}
ae=0;
for(i=0;i<=a;i++)
{
if(f[i][ab].num!=0)
{
ae=1;
break;
}
}
if(ae==1)
{
al2: printf("\n此项目成绩曾经已被录入过,是否要重新录入(您输入的项目代号可能有误,强烈建议您查证后再录入):\n");
printf(" 1++++重新录入(若重新录入,以前的该项目成绩将被删除)\n");
printf(" 2++++不要,待查证后再录入\n\n");
scanf("%d",&af);
if(af==2)
{
printf("您已取消录入!!!!!\n");
return;
}
else if(af==1)
{
for(i=1;i<=a;i++)
{
if(f[i][ab].num!=0)
{
f[i][0].num=f[i][0].num-f[i][ab].num;
if(ab<=c)
f[i][c+d+1].num=f[i][c+d+1].num-f[i][ab].num;
else
f[i][c+d+2].num=f[i][c+d+2].num-f[i][ab].num;
}
f[i][ab].num=0;
}
}
else
goto al2;
}
al: printf("\n此项目是以前几名为胜出者:\n\n");
printf(" 3-------以前三名\n");
printf(" 5-------以前五名\n\n");
scanf("%d",&ac);
if(ac==3)
{
printf("\n请依次输入获胜学校代号:");
af=5;
for(i=0;i<3;i++)
{
alq: scanf("%d",&ae);
if(ae>a||ae<1)
{
printf("%d学校代号不存在,重新输入第%d名的学校代号\n",ae,g);
goto alq;
}
for(b=0;b<5;b++)
{
if(ae==get[b])
{
printf("同一个学校不能在同一项目中有两个名次,请重新输入第%d名的学校代号!!!\n",g);
goto alq;
}
else
get[b]=ae;
}
f[ae][0].num=f[ae][0].num+af;
f[ae][ab].num=af;
if(ab<=c)
f[ae][c+d+1].num=f[ae][c+d+1].num+af;
else
f[ae][c+d+2].num=f[ae][c+d+2].num+af;
if(af>3)
af=af-2;
else
af--;
g++;
}
}
else if(ac==5)
{
printf("请依次输入获胜学校代号:");
af=7;
for(i=0;i<5;i++)
{
alw: scanf("%d",&ae);
if(ae>a||ae<1)
{
printf("%d学校代号不存在,重新输入第%d名的学校代号\n",ae,g);
goto alw;
}
for(b=0;b<5;b++)
{
if(ae==get[b])
{
printf("同一个学校不能在同一项目中有两个名次,请重新输入第%d名的学校代号!!!\n",g);
goto alw;
}
else
get[b]=ae;
}
f[ae][0].num=f[ae][0].num+af;
f[ae][ab].num=af;
if(ab<=c)
f[ae][c+d+1].num=f[ae][c+d+1].num+af;
else
f[ae][c+d+2].num=f[ae][c+d+2].num+af;
if(af>3)
af=af-2;
else
af--;
g++;
}
}
else
goto al;
printf("\n\n 输入完成 ! ! ! ! \n");
}
3 成绩统计
当选择2 (),相关实现如下:
void each()
{
printf("\n 对应的格式为:\n 学校代号:团体总成绩\n\n ");
for(i=1;i<=a;i++)
{
printf("%2d:%3d ",i,f[i][0].num);
if(i%3==0)
printf("\n ");
}
4 按照各种方式输出
主要有按学校编号输出,按学校总分输出,按男团输出,:
void biaohao()
{
printf("\n项目代号 ");
for(i=1;i<=c+d;i++)
{
if(i>9)
printf("%4d ",i);
else
printf("%5d ",i);
}
printf("\n");
printf("学校代号 \n");
for(i=1;i<=a;i++)
{
printf(" %d ",i);
for(b=1;b<=c+d;b++)
{
if(f[i][b].num>9)
printf("%4d",f[i][b].num);
else
printf("%5d",f[i][b].num);
}
printf("\n");
}
}
void zongfen()
{
struct nod
{
int ke;
int num;
};
int ha;
struct nod *de;
de=(struct nod *)malloc(sizeof(struct nod)*a+1);
printf("\n 按学校编号排序输出\n\n");
printf(" 学校代号 总分\n\n");
for(i=1;i<=a;i++)
{
de[i].ke=i;
de[i].num=f[i][0].num;
}
for(i=1;i<=a;i++)
{
for(b=i;b<=a;b++)
{
if(de[b].num>de[i].num)
{
ha=de[b].ke;
de[b].ke=de[i].ke;
de[i].ke=ha;
ha=de[b].num;
de[b].num=de[i].num;
de[i].num=ha;
}
}
}
for(i=1;i<=a;i++)
{
printf("%13d%8d\n",de[i].ke,de[i].num);
}
}
void nanzong()
{
struct nod
{
int ke;
int num;
};
int ha;
struct nod *de;
de=(struct nod *)malloc(sizeof(struct nod)*a+1);
printf("\n 按男子团体总分排序输出\n\n");
printf(" 学校代号 男子团体总分\n\n");
for(i=1;i<=a;i++)
{
de[i].ke=i;
de[i].num=f[i][c+d+1].num;
}
for(i=1;i<=a;i++)
{
for(b=i;b<=a;b++)
{
if(de[b].num>de[i].num)
{
ha=de[b].ke;
de[b].ke=de[i].ke;
de[i].ke=ha;
ha=de[b].num;
de[b].num=de[i].num;
de[i].num=ha;
}
}
}
for(i=1;i<=a;i++)
{
printf("%13d%12d\n",de[i].ke,de[i].num);
}
}
void nvzong()
{
struct nod
{
int ke;
int num;
};
int ha;
struct nod *de;
de=(struct nod *)malloc(sizeof(struct nod)*a+1);
printf(" 按女子团体总分排序输出\n\n");
printf(" 学校代号 女子团体总分\n\n");
for(i=1;i<=a;i++)
{
de[i].ke=i;
de[i].num=f[i][c+d+2].num;
}
for(i=1;i<=a;i++)
{
for(b=i;b<=a;b++)
{
if(de[b].num>de[i].num)
{
ha=de[b].ke;
de[b].ke=de[i].ke;
de[i].ke=ha;
ha=de[b].num;
de[b].num=de[i].num;
de[i].num=ha;
}
}
}
for(i=1;i<=a;i++)
{
printf("%15d%13d\n",de[i].ke,de[i].num);
}
}
void xuexiao()
{
int dr,dt;
printf("\n请输入您要查询的学校代号:");
aly:scanf("%d",&dr);
if(dr>a||dr<1)
{
printf("学校代号不存在,重新输入\n");
goto aly;
}
printf("请输入您要查询的项目代号:");
alo:scanf("%d",&dt);
if(dt>c+d||dt<1)
{
printf("项目代号不存在,重新输入\n");
goto alo;
}
printf("\n\n %3d 学校的%3d 项目成绩为%3d\n",dr,dt,f[dr][dt].num);
}
5查询功能
开始
输入学校编号查询
输入项目编号查询
是否符合要求
是否符合要求
输入要查询项目代号
输入要查询学校代号
是否符合要求
是否符合要求
继续查询或返回主菜单
继续查询或返回主菜单
结束
图3 查询流程图
按学校编号查询学校某个项目的成绩以xuexiao()及按项目编号查询取得前三或前五名的学校
void xuexiao()
{
int dr,dt;
printf("\n请输入您要查询的学校代号:");
aly:scanf("%d",&dr);
if(dr>a||dr<1)
{
printf("学校代号不存在,重新输入\n");
goto aly;
}
printf("请输入您要查询的项目代号:");
alo:scanf("%d",&dt);
if(dt>c+d||dt<1)
{
printf("项目代号不存在,重新输入\n");
goto alo;
}
printf("\n\n %3d 学校的%3d 项目成绩为%3d\n",dr,dt,f[dr][dt].num);
}
void xiangmu()
{
int ge,sedy=0;
printf("\n 请输入您要查询的项目代号:");
all:scanf("%d",&ge);
printf("\n");
if(ge>c+d||ge<1)
{
printf("没有此项目代号,重新输入\n");
goto all;
}
for(i=1;i<=a;i++)
{
if(f[b][ge].num==2)
sedy=1;
}
if(sedy==0)
{
printf("此项目没有录入成绩\n");
return;
}
for(i=1;i<=a;i++)
{
if(f[i][ge].num==7)
{
printf(" 此项目取前5名获奖者\n");
break;
}
}
if(i==a+1)
printf(" 此项目取前3名获奖者\n");
printf("\n 获胜名单由成绩高到低依次为:\n\n ");
for(i=7;i>0;i--)
{
for(b=1;b<=a;b++)
{
if(f[b][ge].num==i)
printf("%5d",b);
}
}
6 保存退出
void exit0()
{
FILE *fp;
int k;
alp:if((fp=fopen("","w"))==NULL)
{
printf("创建文件失败\n");
printf(" 1*****重试\n");
printf(" 2*****强制退出(数据将不会保存到文件)\n");
printf(" 3*****回到主菜单\n");
alj: scanf("%d",&k);
if(k==1)
goto alp;
else if(k==2)
exit(0);
else if(k==3)
return;
else
{
printf("输入错误,请重新输入:");
goto alj;
}
}
fprintf(fp,"\n\n");
fprintf(fp,"运动会分数统计表\n\n\n");
fprintf(fp,"项目代号");
for(i=1;i<=c+d;i++)
fprintf(fp,"%5d",i);
fprintf(fp," ");
fprintf(fp,"\n 学校代号\n");
for(i=1;i<=a;i++)
{
fprintf(fp,"%10d",i);
for(b=1;b<=c+d;b++)
{
fprintf(fp,"%5d",f[i][b].num);
}
fprintf(fp,"\n");
}
fprintf(fp,"\n\n");
fprintf(fp," 注:本次运动会有%d个学校参赛\n\n",a);
fprintf(fp," 其中1 ~ %d组是男子组,%d ~ %d组是女子组\n",c,c+1,c+d);
printf("\\n\n");
fclose(fp);
exit(1);
}
五 原程序代码
#include <>
#include <>
#include <>
#include<>
int a,b,c,d,i,j;
struct node
{
int num;
};
struct node *f[22];
void exit0() /*******************保存退出*******************/
{
FILE *fp;
int k;
alp:if((fp=fopen("","w"))==NULL)
{
printf("创建文件失败\n");
printf(" 1*****重试\n");
printf(" 2*****强制退出(数据将不会保存到文件)\n");
printf(" 3*****回到主菜单\n");
alj: scanf("%d",&k);
if(k==1)
goto alp;
else if(k==2)
exit(0);
else if(k==3)
return;
else
{
printf("输入错误,请重新输入:");
goto alj;
}
}
fprintf(fp,"\n\n");
fprintf(fp,"*************运动会分数统计表************\n\n");
fprintf(fp,"*************************统计者:可输入个人姓名");
fprintf(fp,"项目代号 ");
for(i=1;i<=c+d;i++)
fprintf(fp," %d",i);
fprintf(fp," ");
fprintf(fp,"\n学校代号\n");
for(i=1;i<=a;i++)
{
fprintf(fp,"%10d",i);
for(b=1;b<=c+d;b++)
{
fprintf(fp,"%5d",f[i][b].num);
}
fprintf(fp,"\n");
}
fprintf(fp,"\n\n");
fprintf(fp," 注:本次运动会有%d个学校参赛\n\n",a);
fprintf(fp," 其中1 ~ %d组是男子组,%d ~ %d组是女子组\n",c,c+1,c+d);
printf("\\n\n");
fclose(fp);
exit(1);
}
int choose() /**************进行项目选择***************/
{
int choo;
printf("\n\n 1*输入成绩\n");
printf(" 2*统计各学校的总分\n");
printf(" 3*按学校编号排序输出\n");
printf(" 4*按学校总分排序输出\n");
printf(" 5*按男团体总分排序输出\n");
printf(" 6*按女团体总分排序输出\n");
printf(" 7*按学校编号查询学校某个项目的成绩\n");
printf(" 8*按项目编号查询取得前三或前五名的学校\n");
printf(" 9*退出\n\n");
printf("请选择:");
scanf("%d",&choo);
return(choo-1);
}
void input() /****************输入成绩****************/
{
int ab,ac,ae,af,g=1,get[5]={0,0,0,0,0};
printf("\n请输入项目代号:");
ale:scanf("%d",&ab);
if(ab>c+d||ab<1)
{
printf("\n此项目代号不存在,重新输入\n");
goto ale;
}
ae=0;
for(i=0;i<=a;i++)
{
if(f[i][ab].num!=0)
{
ae=1;
break;
}
}
if(ae==1)
{
al2: printf("\n此项目成绩曾经已被录入过,是否要重新录入(您输入的项目代号可能有误,强烈建议您查证后再录入):\n");
printf(" 1++++重新录入(若重新录入,以前的该项目成绩将被删除)\n");
printf(" 2++++不要,待查证后再录入\n\n");
scanf("%d",&af);
if(af==2)
{
printf("您已取消录入!!!!!\n");
return;
}
else if(af==1)
{
for(i=1;i<=a;i++)
{
if(f[i][ab].num!=0)
{
f[i][0].num=f[i][0].num-f[i][ab].num;
if(ab<=c) f[i][c+d+1].num=f[i][c+d+1].num-f[i][ab].num;
else f[i][c+d+2].num=f[i][c+d+2].num-f[i][ab].num;
}
f[i][ab].num=0;
}
}
else
goto al2;
}
al: printf("\n此项目是以前几名为胜出者:\n\n");
printf(" 3-------以前三名\n");
printf(" 5-------以前五名\n\n");
scanf("%d",&ac);
if(ac==3)
{
printf("\n请依次输入获胜学校代号:");
af=5;
for(i=0;i<3;i++)
{
alq: scanf("%d",&ae);
if(ae>a||ae<1)
{
printf("%d学校代号不存在,重新输入第%d名的学校代号\n",ae,g);
goto alq;
}
for(b=0;b<5;b++)
{
if(ae==get[b])
{
printf("同一个学校不能在同一项目中有两个名次,请重新输入第%d名的学校代号!!!\n",g);
goto alq;
}
else
get[b]=ae;
}
f[ae][0].num=f[ae][0].num+af;
f[ae][ab].num=af;
if(ab<=c)
f[ae][c+d+1].num=f[ae][c+d+1].num+af;
else
f[ae][c+d+2].num=f[ae][c+d+2].num+af;
if(af>3)
af=af-2;
else
af--;
g++;
}
}
else if(ac==5)
{
printf("请依次输入获胜学校代号:");
af=7;
for(i=0;i<5;i++)
{
alw: scanf("%d",&ae);
if(ae>a||ae<1)
{
printf("%d学校代号不存在,重新输入第%d名的学校代号\n",ae,g);
goto alw;
}
for(b=0;b<5;b++)
{
if(ae==get[b])
展开阅读全文