数据结构运动会分数统计系统.docx
《数据结构运动会分数统计系统.docx》由会员分享,可在线阅读,更多相关《数据结构运动会分数统计系统.docx(24页珍藏版)》请在冰豆网上搜索。
![数据结构运动会分数统计系统.docx](https://file1.bdocx.com/fileroot1/2022-11/28/2848ae17-eca3-494c-b7b1-7e3b7f749259/2848ae17-eca3-494c-b7b1-7e3b7f7492591.gif)
数据结构运动会分数统计系统
洛阳理工学院
课程设计报告
课程名称数据结构课程设计
设计题目运动会分数统计系统
专业计算机科学与技术
班级
学号
姓名
完成日期2016.12.30
课程设计任务书
设计题目:
运动会分数统计系统
设计内容与要求:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20) 可以输入各个项目的前三名或前五名的成绩;2) 能统计各学校总分,3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
输出形式:
有中文提示,各学校分数为整形界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
测试数据:
要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。
进行程序测试,以保证程序的稳定。
指导教师:
张新颜
2016年12月日
课程设计评语
成绩:
指导教师:
_______________
年月日
1.算法思想:
本课设要求输入信息,统计分数,执行排序与查找功能,在要求中没有在建立数据之后进行插入和删除操作,而在排序和查找过程中有许多的随机读取数据操作,因此使用顺序结构而不用链表。
由于各个要求属性具有一定的联系,在定义数据时使用结构体和结构体数组来存储信息数据。
考虑到程序的要求在设计函数时将学校个数和项目个数设计为可变的数据,为方便使用设计菜单函数(menu),而由于要求将信息存储在文件中故设计文件的存储(savetofile)与读取函数(readfromfile),信息输入函数(input)在输入基本信息后由系统统计总分的内容并全部存入文件file中,在接下来的函数中开始都需要读取文件中的信息,信息的输出(output)输出输入函数中统计后的各项信息,在排序输出(sortput)中使用冒泡排序法进行不同关键字的排序,查询函数(search)采用顺序表的查找来完成。
2.模块划分:
1、Voidmenu(intn,intm,intw)功能是提供界面窗口。
2、Voidsavetofile()功能是保存输入的运动会信息到file文件
3、Voidreadfromfile()功能是从file文件中读取运动会信息
4、Voidinput(intn,intm,intw)功能是输入信息并统计
5、Voidoutput(intn,intm,intw)功能是按学校、项目输出统计信息
6、Voidsortput(intn,intm,intw)功能是按四种方法排序并输出结果
7、Voidsearch(intn,intm,intw)功能是按两种方法查询并输出结果
8、voidmain()主函数
2.数据结构:
(1)项目数据表:
运动会系统先制定本次运动会所需的参赛项目。
本数据表根据要求设计存储每个项目的编号、要取的名次、各个名次名称及各名次对应的分数。
用于对以后项目情况的统计已及查询。
其中inum,top,range由输入信息输入,而mark有range和top决定。
typedefstruct
{
intinum;/*项目编号*/
inttop;/*取名次的数目*/
intrange[5];/*名次*/
intmark[5];/*分数*/
}itemnode;/*存放项目信息*/
(2)学校数据表:
本数据表根据要求储存了各个参赛学校的总体情况,包括学校的编号、学校总分、男子团体总分、女子团体总分,并且包括项目数据数组t[n]。
其中snum和t[n]中部分数据由输入信息输入,而其他三项内容score,mscore,wscore将由系统进行自动统计。
typedefstruct
{
intsnum;/*学校编号*/
intscore;/*学校总分*/
intmscore;/*男团体总分*/
intwscore;/*女团体总分*/
itemnodet[M+W];/*项目数组*/
}snode;/*存放学校信息*/
snodea[N];/*定义一个学校数组*/
这二个数据表相关联接,a[n]中包括t[n],形成一个整体。
3.测试:
测试取学校个数为3,男子项目个数2.女子项目个数1。
项目
学校
编号1(男)
编号2(男)
编号3(女)
取前3
取前5
取前5
编号1
名次
3
1、4
3、4
编号2
名次
2
2、5
1、5
编号3
名次
1
3
2
将上述所有学校的信息输入,然后计算出所有学校的总分,男子项目的总分,女子项目的总分,然后再将自己计算出的数值与所做成的系统比较,观看是否存在误差和错误。
1.主菜单界面
2.信息输入测试:
预计输入三个学校的信息。
3.统计输出测试:
预计输出三个学校信息。
4.排序输出测试。
实现学校总分,男团总分,女团总分均可排序输出。
5.信息查询测试:
预计可以用学校编号和项目编号查询。
6.结束程序测试:
预计直接退出系统。
经过运算与测试结果比较,发现预期结果与运行结果一致。
所以运动会分数统计系统正确无误。
5.源程序:
#include
#include
#include
#defineN20/*学校最大数目*/
#defineM20/*男子项目最大数目*/
#defineW20/*女子项目最大数目*/
typedefstruct
{
intinum;/*项目编号*/
inttop;/*取名次的数目*/
intrange[5];/*名次*/
intmark[5];/*分数*/
}itemnode;/*存放项目信息*/
typedefstruct
{
intsnum;/*学校编号*/
intscore;/*学校总分*/
intmscore;/*男团体总分*/
intwscore;/*女团体总分*/
itemnodet[M+W];/*项目数组*/
}snode;/*存放学校信息*/
snodea[N];/*定义一个学校数组*/
voidmenu(intn,intm,intw)/*菜单函数*/
{
intc;
voidinput(intn,intm,intw);
voidoutput(intn,intm,intw);
voidsortput(intn,intm,intw);
voidsearch(intn,intm,intw);
printf("\t\t\t欢迎使用\t\t\t\t\n\n");
printf("\t***********运动会分数统计系统***********\n\n");
printf("\t*1.信息输入*\t\n");
printf("\t*2.统计输出*\t\n");
printf("\t*3.排序输出*\t\n");
printf("\t*4.信息查询*\t\n");
printf("\t*0.退出系统*\t\n\n");
printf("\t*老师你最好看*\t\n");
printf("\t========================================\n\n");
printf("请选择要实现步骤的编号(0--4):
");
scanf("%d",&c);
switch(c)
{
case1:
input(n,m,w);break;
case2:
output(n,m,w);break;
case3:
sortput(n,m,w);break;
case4:
search(n,m,w);break;
case0:
printf("谢谢使用,再见!
\n");exit(0);
default:
printf("输入错误,请重试!
\n");menu(n,m,w);
}
}
voidsavetofile()/*信息存入文件file*/
{
FILE*fp;
inti;
if((fp=fopen("file.txt","wb"))==NULL)
{
printf("cannotopenthefile\n");
return;
}
for(i=0;i{
if(a[i].snum!
='\0')
if(fwrite(&a[i],sizeof(snode),1,fp)!
=1)
{
printf("filewriteerror\n");
return;
}
}
fclose(fp);
}
voidreadfromfile()/*信息从文件file中取出*/
{
inti;
FILE*fp;
if((fp=fopen("file.txt","rb"))==NULL)
{
printf("cannotopenthefile\n");
return;
}
for(i=0;ifread(&a[i],sizeof(snode),1,fp);
fclose(fp);
}
voidinput(intn,intm,intw)//输入函数
{
inti,j,s,k,q=0;
for(i=0;i{
printf("学校编号:
");
scanf("%d",&a[i].snum);/*输入学校信息*/
for(j=0;j{
printf("项目编号:
");
scanf("%d",&a[i].t[j].inum);
printf("项目取前3名或前5名(3或者5):
");
scanf("%d",&a[i].t[j].top);
if(a[i].t[j].top==3)
printf("获得名次个数(1--3):
");
else
printf("获得名次个数(1--5):
");
scanf("%d",&k);/*输入项目信息*/
for(s=0;s{
if(a[i].t[j].top==3)
printf("所获名次(1--3):
");
else
printf("所获名次(1--5):
");
scanf("%d",&a[i].t[j].range[s]);/*输入所获名次信息*/
}
printf("\n");
}
}
for(i=0;i{
a[i].score=0;
a[i].mscore=0;
a[i].wscore=0;
}/*初始化分数*/
for(i=0;ifor(j=0;jfor(s=0;s<5;s++)
{
if(a[i].t[j].top==3)
switch(a[i].t[j].range[s])
{
case0:
a[i].t[j].mark[s]=0;break;
case1:
a[i].t[j].mark[s]=5;break;
case2:
a[i].t[j].mark[s]=3;break;
case3:
a[i].t[j].mark[s]=2;break;
}
elseif(a[i].t[j].top==5)
switch(a[i].t[j].range[s])
{
case0:
a[i].t[j].mark[s]=0;break;
case1:
a[i].t[j].mark[s]=7;break;
case2:
a[i].t[j].mark[s]=5;break;
case3:
a[i].t[j].mark[s]=3;break;
case4:
a[i].t[j].mark[s]=2;break;
case5:
a[i].t[j].mark[s]=1;break;
}
else
{
printf("信息有误!
");
printf("\n");
exit(0);
}
a[i].score=a[i].score+a[i].t[j].mark[s];/*记学校总分*/
if(j<=m-1)
a[i].mscore=a[i].mscore+a[i].t[j].mark[s];/*记男子团体总分*/
else
a[i].wscore=a[i].wscore+a[i].t[j].mark[s];/*记女子团体总分*/
}
printf("输入完毕!
返回?
1是0否\n");/*返回菜单*/
scanf("%d",&q);
printf("\n");
if(q!
=1)
printf("不能再添加信息!
");
printf("\n");
savetofile();/*将信息存入文件file*/
getchar();
system("cls");
menu(n,m,w);
}
voidoutput(intn,intm,intw)//输出函数
{
readfromfile();
inti,j,s,q=0;
for(i=0;i{
printf("学校编号:
%d学校总分:
%d男团总分:
%d女团总分:
%d\n",a[i].snum,a[i].score,a[i].mscore,a[i].wscore);
for(j=0;j{
printf("项目编号:
%d所取名次数量:
%d\n",a[i].t[j].inum,a[i].t[j].top);
for(s=0;s<5;s++)
{
if(a[i].t[j].range[s]!
=0)
printf("名次:
%d分数:
%d\n",a[i].t[j].range[s],a[i].t[j].mark[s]);
}
}
printf("\n");
}
printf("\n");
printf("统计成功!
返回?
1是0否");/*返回菜单*/
scanf("%d",&q);
printf("\n");
if(q!
=1)
printf("统计已经结束!
");
printf("\n");
system("cls");
menu(n,m,w);
}
voidsortput(intn,intm,intw)//顺序输出
{
readfromfile();
intc,i,j,k,q=0;
inttemp[N];
printf("\t**************排序输出系统**************\n\n");
printf("\t************1.按学校编号输出************\t\n");
printf("\t************2.按学校总分输出************\t\n");
printf("\t************3.按男团总分输出************\t\n");
printf("\t************4.按女团总分输出************\t\n");
printf("\t========================================\n\n");
do
{
printf("请选择要实现功能的编号(1--4):
");
scanf("%d",&c);
switch(c)
{
case1:
for(i=0;itemp[i]=i;
for(i=0;i{
for(j=i+1;jif(a[temp[i]].snum>a[j].snum)
{
k=temp[i];
temp[i]=temp[j];
temp[j]=k;
}
}/*用冒泡排序方法排序*/
for(i=0;i{
printf("学校编号:
%d学校总分:
%d男团总分:
%d女团总分:
%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore);
}/*按学校编号输出*/
break;
case2:
for(i=0;itemp[i]=i;
for(i=0;i{
for(j=i+1;jif(a[temp[i]].score{
k=temp[i];
temp[i]=temp[j];
temp[j]=k;
}
}/*用冒泡排序方法排序*/
for(i=0;i{
printf("学校编号:
%d学校总分:
%d男团总分:
%d女团总分:
%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore);
}/*按学校总分输出*/
break;
case3:
for(i=0;itemp[i]=i;
for(i=0;i{
for(j=i+1;jif(a[temp[i]].mscore{
k=temp[i];
temp[i]=temp[j];
temp[j]=k;
}
}/*用冒泡排序方法排序*/
for(i=0;i{
printf("学校编号:
%d学校总分:
%d男团总分:
%d女团总分:
%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore);
}/*按男团总分输出*/
break;
case4:
for(i=0;itemp[i]=i;
for(i=0;i{
for(j=i+1;jif(a[temp[i]].wscore{
k=temp[i];
temp[i]=temp[j];
temp[j]=k;
}
}/*用冒泡排序方法排序*/
for(i=0;i{
printf("学校编号:
%d学校总分:
%d男团总分:
%d女团总分:
%d\n",a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore);
}/*按女团总分输出*/
break;
default:
printf("输入错误,请重试!
\n");
}
printf("请选择1返回主菜单0继续");/*返回菜单或继续排序*/
scanf("%d",&q);system("cls");
printf("\n");
}
while(q==0);
printf("\n");
if(q!
=0)
menu(n,m,w);
}
voidsearch(intn,intm,intw)//查询函数
{
readfromfile();
intc,i,j,k,d,l,q=0;
printf("\t****************查询系统****************\n\n");
printf("\t*1.按学校编号查询*\t\n");
printf("\t*2.按项目编号查询*\t\n");
printf("\t========================================\n\n");
do
{
k=-1;d=-1;l=-1;
printf("请选择要实现功能的编号(1--2):
");
scanf("%d",&c);
switch(c)
{
case1:
printf("要查询的学校编号:
");/*查找学校编号下标*/
scanf("%d",&c);
for(i=0;i{
if(a[i].snum==c)
k=i;
}
if(k==-1)
printf("错误:
这个学校没有参加此次运动会!
\n");
else
{
printf("要查询的项目编号:
");/*查找项目编号下标*/
scanf("%d",&c);
for(j=0;j{
if(a[k].t[j].inum==c)
d=j;
}
if(d==-1)
printf("此次运动会没有这个项目\n");
else/*显示结果*/
{
printf("这个项目取前%d名,该学校的成绩如下:
\n",a[k].t[d].top);
for(i=0;i<5;i++)
if(a[k].t[d].range[i]!
=0)
printf("名次