数据结构运动会分数统计系统Word文档格式.docx
《数据结构运动会分数统计系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构运动会分数统计系统Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
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
编号1
名次
3
1、4
3、4
编号2
2
2、5
1、5
编号3
1
将上述所有学校的信息输入,然后计算出所有学校的总分,男子项目的总分,女子项目的总分,然后再将自己计算出的数值与所做成的系统比较,观看是否存在误差和错误。
1.主菜单界面
2.信息输入测试:
预计输入三个学校的信息。
3.统计输出测试:
预计输出三个学校信息。
4.排序输出测试。
实现学校总分,男团总分,女团总分均可排序输出。
5.信息查询测试:
预计可以用学校编号和项目编号查询。
6.结束程序测试:
预计直接退出系统。
经过运算与测试结果比较,发现预期结果与运行结果一致。
所以运动会分数统计系统正确无误。
5.源程序:
#include<
stdio.h>
math.h>
#include<
stdlib.h>
#defineN20/*学校最大数目*/
#defineM20/*男子项目最大数目*/
#defineW20/*女子项目最大数目*/
/*定义一个学校数组*/
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"
);
\t***********运动会分数统计系统***********\n\n"
\t*1.信息输入*\t\n"
\t*2.统计输出*\t\n"
\t*3.排序输出*\t\n"
\t*4.信息查询*\t\n"
\t*0.退出系统*\t\n\n"
\t*老师你最好看*\t\n"
\t========================================\n\n"
请选择要实现步骤的编号(0--4):
"
scanf("
%d"
&
c);
switch(c)
{
case1:
input(n,m,w);
break;
case2:
output(n,m,w);
case3:
sortput(n,m,w);
case4:
search(n,m,w);
case0:
谢谢使用,再见!
\n"
exit(0);
default:
printf("
输入错误,请重试!
menu(n,m,w);
}
}
voidsavetofile()/*信息存入文件file*/
FILE*fp;
inti;
if((fp=fopen("
file.txt"
"
wb"
))==NULL)
{
cannotopenthefile\n"
return;
for(i=0;
i<
N;
i++)
if(a[i].snum!
='
\0'
)
if(fwrite(&
a[i],sizeof(snode),1,fp)!
=1)
{
printf("
filewriteerror\n"
return;
}
fclose(fp);
voidreadfromfile()/*信息从文件file中取出*/
rb"
fread(&
a[i],sizeof(snode),1,fp);
voidinput(intn,intm,intw)//输入函数
inti,j,s,k,q=0;
n;
学校编号:
a[i].snum);
/*输入学校信息*/
for(j=0;
j<
m+w;
j++)
{
printf("
项目编号:
a[i].t[j].inum);
项目取前3名或前5名(3或者5):
a[i].t[j].top);
if(a[i].t[j].top==3)
获得名次个数(1--3):
else
获得名次个数(1--5):
k);
/*输入项目信息*/
for(s=0;
s<
k;
s++)
{
if(a[i].t[j].top==3)
printf("
所获名次(1--3):
else
所获名次(1--5):
a[i].t[j].range[s]);
/*输入所获名次信息*/
}
a[i].score=0;
a[i].mscore=0;
a[i].wscore=0;
}/*初始化分数*/
for(j=0;
for(s=0;
5;
switch(a[i].t[j].range[s])
{
a[i].t[j].mark[s]=0;
break;
a[i].t[j].mark[s]=5;
a[i].t[j].mark[s]=3;
a[i].t[j].mark[s]=2;
}
elseif(a[i].t[j].top==5)
a[i].t[j].mark[s]=7;
case5:
a[i].t[j].mark[s]=1;
else
信息有误!
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];
/*记男子团体总分*/
a[i].wscore=a[i].wscore+a[i].t[j].mark[s];
/*记女子团体总分*/
}
输入完毕!
返回1是0否\n"
/*返回菜单*/
scanf("
q);
if(q!
不能再添加信息!
savetofile();
/*将信息存入文件file*/
getchar();
system("
cls"
menu(n,m,w);
voidoutput(intn,intm,intw)//输出函数
readfromfile();
inti,j,s,q=0;
i++)/*显示结果*/
%d学校总分:
%d男团总分:
%d女团总分:
%d\n"
a[i].snum,a[i].score,a[i].mscore,a[i].wscore);
{
%d所取名次数量:
a[i].t[j].inum,a[i].t[j].top);
if(a[i].t[j].range[s]!
=0)
名次:
%d分数:
a[i].t[j].range[s],a[i].t[j].mark[s]);
统计成功!
返回1是0否"
if(q!
统计已经结束!
system("
voidsortput(intn,intm,intw)//顺序输出
intc,i,j,k,q=0;
inttemp[N];
\t**************排序输出系统**************\n\n"
\t************1.按学校编号输出************\t\n"
\t************2.按学校总分输出************\t\n"
\t************3.按男团总分输出************\t\n"
\t************4.按女团总分输出************\t\n"
do
请选择要实现功能的编号(1--4):
switch(c)
case1:
for(i=0;
temp[i]=i;
for(j=i+1;
if(a[temp[i]].snum>
a[j].snum)
{
k=temp[i];
temp[i]=temp[j];
temp[j]=k;
}
}/*用冒泡排序方法排序*/
a[temp[i]].snum,a[temp[i]].score,a[temp[i]].mscore,a[temp[i]].wscore);
}/*按学校编号输出*/
case2:
if(a[temp[i]].score<
a[j].score)
temp[i]=temp[j];
temp[j]=k;
}/*用冒泡排序方法排序*/
}/*按学校总分输出*/
break;
case3:
if(a[temp[i]].mscore<
a[j].mscore)
}/*按男团总分输出*/
case4:
if(a[temp[i]].wscore<
a[j].wscore)
}/*按女团总分输出*/
default:
请选择1返回主菜单0继续"
/*返回菜单或继续排序*/
scanf("
while(q==0);
menu(n,m,w);
voidsearch(intn,intm,intw)//查询函数
intc,i,j,k,d,l,q=0;
\t****************查询系统****************\n\n"
\t*1.按学校编号查询*\t\n"
\t*2.按项目编号查询*\t\n"
k=-1;
d=-1;
l=-1;
请选择要实现功能的编号(1--2):
要查询的学校编号:
/*查找学校编号下标*/
if(a[i].snum==c)
k=i;
if(k==-1)
错误:
这个学校没有参加此次运动会!
要查询的项目编号:
/*查找项目编号下标*/
for(j=0;
if(a[k].t[j].inum==c)
d=j;
if(d==-1)
此次运动会没有这个项目\n"
else/*显示结果*/
{
这个项目取前%d名,该学校的成绩如下:
a[k].t[d].top);
for(i=0;
if(a[k].t[d].range[i]!
printf("
a[k].t[d].range[i]);
case