运动会成绩管理系统.docx
《运动会成绩管理系统.docx》由会员分享,可在线阅读,更多相关《运动会成绩管理系统.docx(19页珍藏版)》请在冰豆网上搜索。
![运动会成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2023-1/23/e460f97f-5a87-4eae-bbbd-1b9685271901/e460f97f-5a87-4eae-bbbd-1b96852719011.gif)
运动会成绩管理系统
沈阳航空工业学院
课程设计
学号200704021019
班级7402101
姓名李辰
指导教师吴杰宏
2008年9月8日
沈阳航空工业学院
课程设计任务书
院系:
电子信息工程专业:
电子信息工程班级:
7402101
学号:
200704021019题目:
运动会成绩管理系统
(1)
一、课程设计时间
2008~09第1学期第2周,共计1周,20学时。
二、课程设计内容
用C语言编写软件完成以下任务:
1录入运动员信息;
2按所参加的项目添加成绩;
3某一项目按成绩排名。
三、课程设计要求
1.程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“运动员信息录入”、“按项目添加成绩”、“按成绩排名(某一项目)”、“退出”4项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2.课程设计说明书:
课程结束后,上交课程设计说明书和源程序。
课程设计说明书的格式和内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
________
五、说明书成绩
六、教师评语
目录
一、需求分析1
二、程序流程图1
三、核心技术的实现说明及相应程序段2
四、个人总结5
五、参考文献12
六、源程序12
一、需求分析
经过对程序设计题目的分析可知,整个程序的实现大致分为三个模块,其中每一个模块对应一个或多个函数,他们的功能分别是:
添加运动员信息(add),排序函数(sort),添加运动员成绩(change)。
这三个功能分别对应题目的三个要求:
1、添加运动员信息函数主要实现程序最初运行时运动员信息的录入;
2、排序函数按照题目的具体要求实现的是单项成绩的排序以及名次显示,其中总成绩相同者名次相同;
3、添加运动员成绩函数可以实现对运动员按项目添加成绩
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个运动员的记录都包括序号、系别、姓名、年龄、性别以及短跑、跳高和游泳三项比赛成绩,在程序当中,将运动员记录类型定义为结构体类型,添加的运动员信息直接写入E盘的student.dat文件中,其他函数每次对运动员记录的访问,其数据来源都是student.dat文件,这样做不但可以保证运动员数据的一致性,而且可以对运动员数据进行永久保存,保证每次运行程序都可以采用原来的数据。
二、程序流程图
1、程序总体结构图
2、具体功能框图
(1)添加学生数据函数add()
图2添加学生数据函数
(2)读取学生数据reads
图3读取运动员数据
(4)按总分排序函数sort()
图5单项成绩排序函数
三、核心技术的实现说明及相应程序段
本程序主要由九个自定义函数和一个主函数组成,其中主函数以主菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,添加运动员信息函数、添加运动员成绩函数和排序函数是程序中的核心部分,下面分别进行说明。
1、添加信息数据函数add()
添加信息数据函数是按照运动员来添加信息,先将运动员编号,然后依次输入系别、姓名、年龄和性别,并且输入的信息将被储存在E盘的student.dat文件中,不会丢失。
具体的程序段如下:
voidadd()/*添加学生信息*/
{FILE*fp;
intn,i,j;
structstudentstu;
if((fp=fopen("e:
\\student.dat","rb+"))!
=NULL)/*读写方式打开文件*/
{j=getw(fp);
rewind(fp);
printf("请输入要添加的运动员数量,按回车键确认:
");
scanf("%d",&n);
putw(j+n,fp);
fseek(fp,0L,2);
for(i=1;i<=n;i++)
{printf("\n请输入第%d个运动员的序号、系别、姓名、性别、年龄,用空格分开,并按回车键确认:
\n",i);
scanf("%s%s%s%s%f",&stu.num,&stu.xibie,&stu.name,&stu.sex,&stu.age);
fwrite(&stu,sizeof(structstudent),1,fp);
}
}
else
{
if((fp=fopen("e:
\\student.dat","wb"))!
=NULL)
{printf("请输入要添加的运动员数量,按回车键确认:
");
scanf("%d",&n);
putw(n,fp);
for(i=1;i<=n;i++)
{printf("\n请输入第%d个运动员的序号、系别、姓名、性别、年龄,用空格分开,并按回车键确认:
\n",i);
scanf("%s%s%s%s%f",&stu.num,&stu.xibie,&stu.name,&stu.sex,&stu.age);
fwrite(&stu,sizeof(structstudent),1,fp);
}
}
}
fclose(fp);
}
2.添加运动员成绩函数change()
此函数的作用为添加短跑、跳高和游泳三项比赛成绩,数据同样会被存入student.dat文件中。
具体的程序段如下:
voidchange()
{structstudentstu[N],temp;
intn,i;
FILE*fp;
printf("\n请输入要输入信息的运动员的序号,按回车键确认:
");
scanf("%s",&temp.num);
reads(stu,&n);
for(i=0;iif(strcmp(temp.num,stu[i].num)==0)
break;
if(i>=n)
{printf("无此运动员信息!
\n");
return;
}
printf("\n请输入运动员的短跑、跳高和游泳三项成绩,按回车键确认:
\n");
scanf("%f%f%f",&temp.race,&temp.jump,&temp.swimming);
strcpy(stu[i].name,temp.name);
stu[i].race=temp.race;
stu[i].jump=temp.jump;
stu[i].swimming=temp.swimming;
if((fp=fopen("e:
\\student.dat","wb"))==NULL)
{printf("打开文件失败!
");
return;
}
putw(n,fp);
for(i=0;ifwrite(&stu[i],sizeof(structstudent),1,fp);
fclose(fp);
}
3.排序函数sort()
该函数实现的是三个项目的单项成绩排序。
程序首先由一个菜单进入,此时可以选择要排序的项目,按要求操作即可完成排序,排序后的结果将连同名次显示在屏幕上。
具体的程序段如下:
voidsort()/*排序*/
{
intk;
printf("**********请输入要排序的项目的序号**********\n");
printf("1.短跑\n");
printf("2.跳远\n");
printf("3.游泳\n");
scanf("%d",&k);
switch(k)
{
case1:
order1();break;
case2:
order2();break;
case3:
order3();break;
default:
printf("输入错误,请输入列表中存在的序号!
\n");
}
}
voidorder1()
{FILE*fp;
structstudentstu[N],temp;
inti,j,n;
reads(stu,&n);
for(i=0;ifor(j=0;j{if(stu[j].race{strcpy(temp.xibie,stu[j].xibie);
strcpy(temp.name,stu[j].name);
temp.race=stu[j].race;
strcpy(stu[j].xibie,stu[j+1].xibie);
strcpy(stu[j].name,stu[j+1].name);
stu[j].race=stu[j+1].race;
strcpy(stu[j+1].xibie,temp.xibie);
strcpy(stu[j+1].name,temp.name);
stu[j+1].race=temp.race;}
}
if((fp=fopen("e:
\\student.dat","wb"))==NULL)
{printf("打开文件失败!
");
return;}
putw(n,fp);
j=1;
for(i=0;i{fwrite(&stu[i],sizeof(structstudent),1,fp);
if(stu[i].race==stu[i+1].race)
printf("\n%3d%5s%5s%8.2f\n",j,stu[i].xibie,stu[i].name,stu[i].race);
else
printf("\n%3d%5s%5s%8.2f\n",j++,stu[i].xibie,stu[i].name,stu[i].race);
fclose(fp);}
}
voidorder2()
{FILE*fp;
structstudentstu[N],temp;
inti,j,n;
reads(stu,&n);
for(i=0;ifor(j=0;j{if(stu[j].jump{strcpy(temp.xibie,stu[j].xibie);
strcpy(temp.name,stu[j].name);
temp.jump=stu[j].jump;
strcpy(stu[j].xibie,stu[j+1].xibie);
strcpy(stu[j].name,stu[j+1].name);
stu[j].jump=stu[j+1].jump;
strcpy(stu[j+1].xibie,temp.xibie);
strcpy(stu[j+1].name,temp.name);
stu[j+1].jump=temp.jump;}
}
if((fp=fopen("e:
\\student.dat","wb"))==NULL)
{printf("打开文件失败!
");
return;}
putw(n,fp);
j=1;
for(i=0;i{fwrite(&stu[i],sizeof(structstudent),1,fp);
if(stu[i].jump==stu[i+1].jump)
printf("\n%3d%5s%5s%8.2f\n",j,stu[i].xibie,stu[i].name,stu[i].jump);
else
printf("\n%3d%5s%5s%8.2f\n",j++,stu[i].xibie,stu[i].name,stu[i].jump);
fclose(fp);}
}
voidorder3()
{FILE*fp;
structstudentstu[N],temp;
inti,j,n;
reads(stu,&n);
for(i=0;ifor(j=0;j{if(stu[j].swimming{strcpy(temp.xibie,stu[j].xibie);
strcpy(temp.name,stu[j].name);
temp.swimming=stu[j].swimming;
strcpy(stu[j].xibie,stu[j+1].xibie);
strcpy(stu[j].name,stu[j+1].name);
stu[j].swimming=stu[j+1].swimming;
strcpy(stu[j+1].xibie,temp.xibie);
strcpy(stu[j+1].name,temp.name);
stu[j+1].swimming=temp.swimming;}
}
if((fp=fopen("e:
\\student.dat","wb"))==NULL)
{printf("打开文件失败!
");
return;}
putw(n,fp);
j=1;
for(i=0;i{fwrite(&stu[i],sizeof(structstudent),1,fp);
if(stu[i].swimming==stu[i+1].swimming)
printf("\n%3d%5s%5s%8.2f\n",j,stu[i].xibie,stu[i].name,stu[i].swimming);
else
printf("\n%3d%5s%5s%8.2f\n",j++,stu[i].xibie,stu[i].name,stu[i].swimming);
fclose(fp);}
}}
四、个人总结
通过这次课程设计,让我复习了所学过的C语言知识,使知识得到实际应用,并发现了许多以前学习的不足。
这次课设让我深深体会到,制作程序态度一定要认真,要本着细致严谨的作风,因为一个微小的失误就可以导致整个程序的混乱。
这次课设不仅锻炼了我们的思维,还增强了我们的分析问题能力。
五、参考文献
1.谭浩强.C程序设计.北京:
清华大学出版社.2005年
2.黄明.C语言课程设计.北京:
电子工业出版社.2006年
3.郭翠英.C语言课程设计案例精编.北京:
中国水利水电出版社.2004年
六、源程序
#include
#include
#include
#defineN20
structstudent
{charnum[10];
charxibie[20];
charname[10];
charsex[10];
intage;
floatrace;
floatjump;
floatswimming;
};
voidmenu();
voidreads();
voidadd();
voidsort();/*排序*/
voidchange();
voidorder1();
voidorder2();
voidorder3();
voidmain()
{
intn;
while
(1)
{
menu();
printf("\n请输入您要选择的操作序号,按回车键确认:
");
scanf("%d",&n);
switch(n)
{case1:
add();break;
case2:
change();break;
case3:
sort();break;
case4:
exit(0);break;
default:
printf("输入错误,请输入列表中存在的序号!
\n");
}
}
}
voidmenu()
{printf("*************************运动会成绩管理系统************************");
printf("\n1添加运动员信息");
printf("\n2添加运动员成绩");
printf("\n3单项成绩排序");
printf("\n4退出");
}
voidadd()/*添加学生信息*/
{FILE*fp;
intn,i,j;
structstudentstu;
if((fp=fopen("e:
\\student.dat","rb+"))!
=NULL)
{j=getw(fp);
rewind(fp);
printf("请输入要添加的运动员数量,按回车键确认:
");
scanf("%d",&n);
putw(j+n,fp);
fseek(fp,0L,2);
for(i=1;i<=n;i++)
{printf("\n请输入第%d个运动员的序号、系别、姓名、性别、年龄,用空格分开,并按回车键确认:
\n",i);
scanf("%s%s%s%s%f",&stu.num,&stu.xibie,&stu.name,&stu.sex,&stu.age);
fwrite(&stu,sizeof(structstudent),1,fp);
}
}
else
{
if((fp=fopen("e:
\\student.dat","wb"))!
=NULL)
{
printf("请输入要添加的运动员数量,按回车键确认:
");
scanf("%d",&n);
putw(n,fp);
for(i=1;i<=n;i++)
{printf("\n请输入第%d个运动员的序号、系别、姓名、性别、年龄,用空格分开,并按回车键确认:
\n",i);
scanf("%s%s%s%s%f",&stu.num,&stu.xibie,&stu.name,&stu.sex,&stu.age);
fwrite(&stu,sizeof(structstudent),1,fp);
}
}
}
fclose(fp);
}
voidreads(structstudentstu[N],int*n)
{
FILE*fp;
inti=0;
if((fp=fopen("e:
\\student.dat","rb"))==NULL)
{printf("文件打开失败!
\n");
return;
}
else
{
*n=getw(fp);
for(i=0;i<*n;i++)
fread(&stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
}
voidchange()
{structstudentstu[N],temp;
intn,i;
FILE*fp;
printf("\n请输入要输入信息的运动员的序号,按回车键确认:
");
scanf("%s",&temp.num);
reads(stu,&n);
for(i=0;iif(strcmp(temp.num,stu[i].num)==0)
break;
if(i>=n)
{printf("无此运动员信息!
\n");
return;
}
printf("\n请输入运动员的短跑、跳高和游泳三项成绩,按回车键确认:
\n");
scanf("%f%f%f",&temp.race,&temp.jump,&temp.swimming);
strcpy(stu[i].name,temp.name);
stu[i].race=temp.race;
stu[i].jump=temp.jump;
stu[i].swimming=temp.swimming;
if((fp=fopen("e:
\\student.dat","wb"))==NULL)
{printf("打开文件失败!
");
return;
}
putw(n,fp);
for(i=0;ifwrite(&stu[i],sizeof(structstudent),1,fp);
fclose(fp);
}
voidsort()/*排序*/
{
intk;
printf("**********请输入要排序的项目的序号**********\n");
printf("1.短跑\n");
printf("2.跳远\n");
printf("3.游泳\n");
scanf("%d",&k);
switch(k)
{
case1:
order1();break;
case2:
order2();break;
case3:
order3();break;
default:
printf("输入错误,请输入列表中存在的序号!
\n");
}
}
voidorder1()
{FILE*fp;
structstudentstu[N],temp;
inti,j,n;
reads(stu,&n);
for(i=0;ifor(j=0;j{if(stu[j].race{strcpy(temp.xibie,stu[j].xibie);
strcpy(temp.name,stu[j].name);
temp.race=stu[j].race;
strcpy(stu[j].xibie,stu[j+1].xibie);
strcpy(stu[j].name,stu[j+1].name);
stu[j].race=stu[j+1].race;
strcpy(stu[j+1].xibie,temp.xibie);
strcpy(stu[j+1].name,temp.name);
stu[j+1].race=temp.race;}
}
if((fp=fopen("e:
\\student.dat","wb"))==NULL)
{printf("打开文件失败!
");
return;}
putw(n,fp);
j=1;
for(i=0;i{fwrite(&stu[i],sizeof(structstudent),1,fp);
if(stu[i].race==stu[i+1].race)
printf("\n%3d%5s%5s%8.2f\n",j,stu[i].xibie,stu[i].name,stu[i].race);
else
printf("\n%3d%5s%5s%8.2f\n",j++,stu[i].xibie,stu[i].name,stu[i].race);
fclose(fp);}
}
voidorder2()
{FILE*fp;
structstudentstu[N],temp;
inti,j,