运动会分数统计 课程设计Word文件下载.docx
《运动会分数统计 课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《运动会分数统计 课程设计Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
学校代号
项目代号
姓名
成绩
1
Su
3
2
5
Dong
Fly
4
Han
Rain
7
Lucy
Yan
Wang
An
He
zhen
一、数据结构的选择和概要设计
1、数据结构
运动会分数统计程序用到的是顺序表的数据类型,由于一开始参赛人数就是确定下来的,参赛人数即为顺序表表长,故顺序表的表长也就确定下来了,顺序表的主要内容有学校数、男子项目数、女子项目数、总的参赛人数。
节点主要内容包括:
学生的姓名、学校代号、项目代号以及学生的成绩。
顺序表类型如下:
typedefstruct{//节点
charname[100];
//姓名
intxuexiao;
//学校代号
intxiangmu;
//项目代号
intscore;
//成绩
}schooltype;
typedefstruct{
schooltypesc[size];
//顺序表
intn;
//学校数
intm;
//男子项目数
intw;
//女子项目数
intr;
//总参赛人数
}seqlist;
该程序要求统计各个学校的总分及男女项目总分,为便于排序,另用一顺序表将计算出来的总分放于其中,节点内容包括关键字key(即算出来的总分)xiaohao(用来放学校的代号)解决了排序后能输出确定的学校代号及总分。
typedefstruct{//节点
intkey;
//放分
intxiaohao;
//放学校代号
}recordtype;
typedefstruct{//顺序表为方便排序而建立的
recordtyper[size];
//工作单元
}list;
2、概要设计
参赛人数即为顺序表表长,在顺序表节点中有成绩,在建立学生信息时可直接输入成绩,输入学生信息时编码是自动加的,统计学校总分或男女项目总分时都用2个for循环来实现,统计出来的得分都可放入另一个顺序表中以便于排序,在查询时用户输入要查询的学校代号或项目代号即可查询,在建立信息时会调用保存在文件的函数来实现学生信息的保存。
结构图如下:
成员函数名及功能介绍如下:
成员函数名
作用
set(seqlist*L)
建立参赛者信息
search1(seqlist*L)
按学校代号查某个项目的情况
search2(seqlist*L)
按项目代号查取得成绩的学校
tongfen(seqlist*L,list*s)
统计各学校总分
tongfenboy(seqlist*L,list*s)
统计各学校男子项目总分
tongfengirl(seqlist*L,list*s)
统计各学校女子项目总分
output(seqlist*L)
输出
seqlist*loadfile()
提取到文件函数
savefile(seqlist*s)
保存到文件函数
paixu(seqlist*L,list*s)
直接插入排序
三、详细设计和编码
主函数
用户需先建立参赛者的信息,然后可按照菜单提示进行操作,用switch语句实现不同模块的调用。
以下是成员函数介绍
voidset(seqlist*L)流程图如下:
查询函数如下:
voidsearch1(seqlist*L){//按学校代号查某个项目的情况
inti,j,n;
printf("
输入学号以及要查的项目代号:
\n"
);
scanf("
%d%d"
&
i,&
n);
for(j=1;
j<
=L->
r;
j++){//按编号循环
if(L->
sc[j].xuexiao==i&
&
L->
sc[j].xiangmu==n)//判断学校代号、项目代号和输入要查的学校代号项目代号是否相等
该学校在该项目姓名为%s取得成绩%d\n"
L->
sc[j].name,L->
sc[j].score);
}
}
流程图如下:
按项目代号查取得成绩的学校是也是按编号查询,只要学校项目代号与输入要查的项目相同并且有成绩就输出。
函数如下:
voidsearch2(seqlist*L){//按项目代号查取得成绩的学校
intj,k;
输入所要查的项目代号:
%d"
k);
j++){
if(L->
sc[j].xiangmu==k&
sc[j].score!
=0)
printf("
学校代号%d在该项目姓名%s取得成绩%d\n"
sc[j].xuexiao,L->
}
在统计学校总分和各学校男女项目总分时思路大致相同,在统计男(女)项目总分时只需确定下是否是男(女)子项目,如果是就加,判断方法就是男子项目的项目代号小于等于男子项目数(即:
sc[j].xiangmu)<
(L->
m))而女子项目则大于男子项目数(即L->
sc[j].xiangmu)>
m))
统计各学校总分函数介绍如下:
voidtongfen(seqlist*L,list*s){//统计各学校总分
inti,j,sum;
for(i=1;
i<
n;
i++){
sum=0;
for(j=1;
j++){//第一个for循环用来循环学校代号
sc[j].xuexiao==i){//顺序表中学校代号与i是否相等
sum=sum+L->
sc[j].score;
}//总分就与该学校顺序表中的成绩相加
s->
r[i].xiaohao=i;
//将学校代号放入新申请的用来排序的顺序表赋给xiaohao
s->
r[i].key=sum;
//将总分依次放入顺序表赋给关键字key
printf("
学校代号为%d的学校取得的总分为%d\n"
i,sum);
四、程序实例如下:
1主界面:
2建立参赛者信息
3查询
5排名
6输出
五、源程序
#include<
stdio.h>
string.h>
malloc.h>
#defineNULL0
#definesize100
typedefstruct{//节点
//姓名
//学校代号
//项目代号
//成绩
typedefstruct{//顺序表
schooltypesc[size];
//工作单元
intn;
//学校数
//男子项目数
//女子项目数
//总参赛人数
//intlength;
typedefstruct{//节点
//放分
//放校代号
typedefstruct{//顺序表为方便排序而建立的
voidsavefile(seqlist*);
voidset(seqlist*L){
inti;
依次输入校代号,项目号,姓名,成绩:
%d%d%s%d"
sc[i].xuexiao,&
sc[i].xiangmu,&
sc[i].name,&
sc[i].score);
savefile(L);
建立成功!
:
"
voidsearch1(seqlist*L){//按学校代号查某个项目的情况
j++){
sc[j].xiangmu==n)
voidsearch2(seqlist*L){//按项目代号查取得成绩的学校
voidtongfen(seqlist*L,list*s){//统计各学校总分
sc[j].xuexiao==i){
voidtongfenboy(seqlist*L,list*s){//统计各学校男子项目总分
if((L->
m)||(L->
sc[j].xiangmu)==(L->
m)){
}
学校代号为%d在男子项目取得的总分为%d\n"
voidtongfengirl(seqlist*L,list*s){//统计各学校女子项目总分
学校代号为%d在女子项目取得的总分为%d\n"
}
voidpaixu(seqlist*L,list*s){//直接插入排序(有监视哨)
inti,j,k;
r[0]=s->
r[i];
j=i-1;
//将待插元素存到监视哨r[0]中
while(s->
r[0].key<
s->
r[j].key){//寻找插入位置
s->
r[j+1]=s->
r[j];
j=j-1;
r[0];
//将待插入元素插入到已排序的序列中
排序后输出为:
for(k=1;
k<
k++){
学校代号为%d总分为%d:
s->
r[k].xiaohao,s->
r[k].key);
}
voidoutput(seqlist*L){
intj;
学校代号编号项目号姓名成绩:
printf("
%d\t%d\t%d\t%s\t%d\n"
sc[j].xuexiao,j,L->
sc[j].xiangmu,L->
};
seqlist*loadfile()//提取函数
{
FILE*fp;
charbuf[100];
fp=fopen("
运动员系统.txt"
"
r"
seqlist*s;
s=(seqlist*)malloc(sizeof(seqlist));
fscanf(fp,"
%d%d%d%d"
r,&
n,&
m,&
w);
for(inti=1;
=s->
i++)
{
fscanf(fp,"
%s"
buf);
strcpy(s->
sc[i].name,buf);
%d%d%d"
fclose(fp);
returns;
voidsavefile(seqlist*s)//保存函数
if((fp=fopen("
a+"
))==NULL)
Cannotopenthefile!
return;
fprintf(fp,"
%d\t"
r);
m);
%d\n"
fprintf(fp,"
%s\t"
sc[i].name);
sc[i].xuexiao);
sc[i].xiangmu);
intmenu_select(){
inti,sn;
------欢迎来到大学生运动会管理系统------\n"
请您先建立参赛者信息并记录成绩
(1)\n"
查询(按校查某个项目)
(2)\n"
查询(按项目查取得成绩的学校)(3)\n"
统计各学校总分并排序输出(4)\n"
统计各学校男子项目总分并排序输出(5)\n"
统计各学校女子项目总分并排序输出(6)\n"
输出(7)\n"
退出(0)\n"
----------------请选择------------------\n"
for(i=0;
100;
i++){
scanf("
&
sn);
if(sn<
0||sn>
7)
\n\t输入错误,重选0-7:
elsebreak;
returnsn;
voidmain(){
intm,n,w,r;
seqlistS,*L=&
S;
listp,*s=&
p;
L=(seqlist*)malloc(sizeof(seqlist));
输入参赛的学校数,男子项目数,女子项目数,总的参赛人数:
scanf("
w,&
L->
n=n;
m=m;
w=w;
r=r;
else
L=loadfile();
for(;
;
){
switch(menu_select()){
case1:
set(L);
break;
case2:
search1(L);
case3:
search2(L);
case4:
tongfen(L,s);
paixu(L,s);
case5:
tongfenboy(L,s);
case6:
tongfengirl(L,s);
case7:
output(L);
case0:
六、上机调试
1、调试中遇到问题及解决方法
1)、程序调试过程中常会出现一些小错误,如i,j混淆少括号少分号等小问题都可以按照提示找到,然后改正。
2)、语句错误语句使用不当造成程序无法运行出正常的结果。
3)、在排序过程中输出的结果是按总分顺序排序的,但是却不能够正确的输出是哪个学校的总分,解决方法是在新申请的顺序表的节点中加入了一个纪录学校代号的内容,在输出的同时就可以把学校代号也正确的输出来了。
2、设计体会
通过这次课程设计使我进一步达到理论与实际相结合,提高了自己组织数据及编写程序的能力,使我们能够根据问题要求和数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并用软件解决问题,培养良好的程序设计技能,掌握设计程序的思路,学会用计算机语言编写程序,以实现所需处理的任务,锻炼自己的动脑能力,学会用自己的思路解决现实中的实际问题,虽然一开始也走了一些弯路不过在同学和老师的点拨下完成了该程序,这次课程设计中遇到了很多问题,一开始准备用二维数组存放的可考虑到同一个学校同一个项目有好几个人参加,就不能用二维数组了,如果每个学校都申请一个二维数组也非常不方便,还是用顺序表方便也不浪费空间,在这次课程设计的过程中虽然很多次都参照了课本及资料,不过这使我更加熟悉了顺序表以及结构体的定义及实现,调试过程中也遇到了一些问题也都是自己独立思考完成的,还有一个体会是,遇到不会的地方可以参考课本也可以去图书馆或网上查资料,当然主要思路有了也就简单点了,一开始思路不是很清楚就开始在敲程序了,浪费了很多时间,在老师的指导下,把自己的思路理清楚了再来敲程序果真是事半功倍,这真是个很好的收获。
3、性能分析
在排序时用到了直接插入排序,从算法描述中可以看到,在搜索插入位置时,遇到关键字相等的元素就停止比较和移动元素,可以确定该算法是稳定的排序算法。
从空间角度上看,它只需要一个元素的辅助空间r[0]。
从时间角度上看,主要时间耗费在关键字的比较和移动元素上。
n为顺序表表长,平均时间复杂度为O(n2)最坏时间复杂度为O(n2)辅助存储空间r[0]。