运动会分数统计程序数据结构与算法课程设计报告 i.docx

上传人:b****3 文档编号:4233692 上传时间:2022-11-28 格式:DOCX 页数:28 大小:415.39KB
下载 相关 举报
运动会分数统计程序数据结构与算法课程设计报告 i.docx_第1页
第1页 / 共28页
运动会分数统计程序数据结构与算法课程设计报告 i.docx_第2页
第2页 / 共28页
运动会分数统计程序数据结构与算法课程设计报告 i.docx_第3页
第3页 / 共28页
运动会分数统计程序数据结构与算法课程设计报告 i.docx_第4页
第4页 / 共28页
运动会分数统计程序数据结构与算法课程设计报告 i.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

运动会分数统计程序数据结构与算法课程设计报告 i.docx

《运动会分数统计程序数据结构与算法课程设计报告 i.docx》由会员分享,可在线阅读,更多相关《运动会分数统计程序数据结构与算法课程设计报告 i.docx(28页珍藏版)》请在冰豆网上搜索。

运动会分数统计程序数据结构与算法课程设计报告 i.docx

运动会分数统计程序数据结构与算法课程设计报告i

 

合肥学院

计算机科学与技术系

 

课程设计报告

2009~2010学年第2学期

 

课程

数据结构与算法

课程设计名称

运动会分数统计程序

学生姓名

朱小杰

学号

0804012037

专业班级

08计本

(2)班

指导教师

王昆仑张贯红

2010年06月5号

题目:

运动会分数统计程序。

参加运动会有n个学校,学校编号为1……n。

比赛分成m个男子项目,和w个女子项目。

项目编号为男子1……m,女子m+1……m+w。

有些项目取前五名,得分依次为6,4,3,2,1;有些项目取前三名,得分依次为4,2,1。

写一程序产生各学校的成绩单(包括各校所取得的每项成绩的项目号、成绩、姓名和得分)和团体总分报表(包括校号、男子团体总分、女子团体总分和团体总分)。

基本要求:

1).可以输入各个项目的前三名或前五名的成绩;

2).能统计各学校总分,

3).可以按学校编号、学校总分、男女团体总分排序输出;

4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。

5).数据存入文件并能随时查询。

一、问题分析和任务定义

此程序需要完成如下要求:

要解决的问题是采用什么样结构放学生的信息,不浪费空间也便于统计各个学校的总分,通过思考加深了对课程设计内容的理解和综合运用,提高了解决实际问题的能力,达到了理论联系实际相结合,以及学有所用的目的。

本程序要解决以下几个问题:

1)如何解决学校、项目以及分数的存放问题;

2)关于在学校总分。

男子以及女子项目总分的问题上,算法中应该包括排序功能,这样在主函数中输出的时候就会让使用者的眼前更加清晰;

3)

4)原始数据输入、输出格式:

原始数据要输入参赛者的学校数、男子项目数、女子项目数、参赛人数以及学生的信息。

输出时要求能统计各学校总分以及男女项目总分还可以查询,最后输出学生的所有信息。

测试用例:

学校数为5,男子项目数为3,女子项目数为3,参赛人数11

表一

学校代号

项目代号

姓名

成绩

1

1

Su

2

2

5

Dong

4

3

3

Fly

3

4

5

Han

1

5

3

Rain

6

1

3

Lucy

4

2

1

Yan

1

3

1

Wang

4

4

3

An

1

5

3

He

2

1

5

zhen

2

二、概要设计和数据结构的选择

运动会分数统计程序用到的是顺序表的数据类型,由于一开始参赛人数就是确定下来的,参赛人数即为顺序表表长,故顺序表的表长也就确定下来了,顺序表的主要内容有学校数、男子项目数、女子项目数、总的参赛人数。

节点主要内容包括:

学生的姓名、学校代号、项目代号以及学生的成绩。

顺序表类型如下:

typedefstruct{//节点

charname[100];//姓名

intxuexiao;//学校代号

intxiangmu;//项目代号

intscore;//成绩

}schooltype;

typedefstruct{

schooltypesc[size];//顺序表

intn;//学校数

intm;//男子项目数

intw;//女子项目数

intr;//总参赛人数

}seqlist;

图1

该程序要求统计各个学校的总分及男女项目总分,为便于排序,另用一顺序表将计算出来的总分放于其中,节点内容包括关键字key(即算出来的总分)xiaohao(用来放学校的代号)解决了排序后能输出确定的学校代号及总分。

顺序表类型如下:

typedefstruct{//节点

intkey;//存放分

intxiaohao;//存放学校代号

}recordtype;

typedefstruct{//顺序表为方便排序而建立的

recordtyper[size];//工作单元

}list;

数即为顺序表表长,在顺序表节点中有成绩,在建立学生信息时可直接输入成绩,输入学生信息时编码是自动加的,统计学校总分或男女项目总分时都用2个for循环来实现,统计出来的得分都可放入另一个顺序表中以便于排序,在查询时用户输入要查询的学校代号或项目代号即可查询,在建立信息时会调用保存在文件的函数来实现学生信息的保存。

结构图如图1:

成员函数名及功能介绍如表二:

表二

成员函数名

作用

set(seqlist*L)

建立参赛者信息

search1(seqlist*L)

按学校代号查某个项目的情况

search2(seqlist*L)

按项目代号查取得成绩的学校

school(seqlist*L,list*s)

统计各学校总分

boy(seqlist*L,list*s)

统计各学校男子项目总分

girl(seqlist*L,list*s)

统计各学校女子项目总分

output(seqlist*L)

输出

seqlist*loadfile()

提取到文件函数

savefile(seqlist*s)

保存到文件函数

paixu(seqlist*L,list*s)

直接插入排序

三、细设计和编码

主函数main()

(1)如果文件“运动员系统.txt”中无保存的记录则输入参赛的学校数,男子项目数,女子项目数,总的参赛人数。

然后提供可选择的项目,用户需先建立参赛者的信息,然后可按照菜单提示进行操作,用switch语句实现不同模块的调用。

流程图如图2:

图2

主界面如图3:

(2)如果“运动员系统.txt”中已保存信息是则主界面图4:

主函数中,先是要看看是不是有"运动员系统22.txt"这个文件,该文件应该与程序放在同一个文件夹中,或者是桌面或同一个盘中,即放在一起。

用fopen打开它,如果没有的话即执行第一种操作,申请空间来存储运动会的参赛学校,男女项目数以及总的参赛人数这些信息,然后再选择菜单中的第一个选择,重新建立一个文件"运动员系统22.txt",用来存储运动员的信

图3

图4

息,在运动会的项目中所取得的成绩;如果有该文件,则要进行第二步,即按照菜单进行其他功能的实现。

以下是成员函数介绍:

(a)voidset(seqlist*L)流程图如图5:

图5

函数代码如下:

voidset(seqlist*L){

inti,x;

for(i=1;i<=L->r;i++){

printf("依次输入校代号,项目号,姓名,成绩:

\n");scanf("%d%d%s%d",&L->sc[i].xuexiao,&L->sc[i].xiangmu,&L->sc[i].name,&L->sc[i].score);

savefile(L,i);

printf("恭喜您,建立成功!

\n");

printf("是否继续添加?

\n");

printf("1--------------是\n");

printf("0--------------否\n");

scanf("%d",&x);

if(x==0)return;

while((x!

=1)&&(x!

=0))

{printf("您的输入有误,请重新输入!

");

scanf("%d",&x);

}

}

}

(b)查询函数

voidsearch1(seqlist*L)这个是按照学校和项目代号进行查询的。

流程图如下:

函数代码如下:

voidsearch1(seqlist*L)//按学校代号查某个项目的情况

{inti,j,n;

intflag=1;

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)

{printf("该学校在该项目姓名为%s取得成绩:

%d\n",L->sc[j].name,L->sc[j].score);flag=0;}

}

if(flag==1)printf("查找不到您所要查找的学生和项目!

\n");

}

(c)按照项目代号进行查询:

voidsearch2(seqlist*L)

流程图如图6

按项目代号查取得成绩的学校是也是按编号查询,只要学校项目代号与输入要查的项目相同并且有成绩就输出。

函数代码如下:

voidsearch2(seqlist*L)//按项目代号查取得成绩的学校

{

intj,k;

intflag=1;

printf("输入所要查的项目代号:

\n");

scanf("%d",&k);

for(j=1;j<=L->r;j++)

{

if(L->sc[j].xiangmu==k&&L->sc[j].score!

=0)

{

printf("学校代号%d在项目上%d姓名为%8s取得成绩是%4d\n",L->sc[j].xuexiao,k,L->sc[j].name,L->sc[j].score);

flag=0;

}

}

if(flag==1)

printf("查找不到您所要查找的项目!

\n");

}

图6

(d)统计学校总分:

和各学校男女项目总分时思路大致相同,在统计男(女)项目总分时只需确定下是否是男(女)子项目,如果是就加,判断方法就是男子项目的项目代号小于等于男子项目数(即:

L->sc[j].xiangmu)<(L->m))而女子项目则大于男子项目数(即L->sc[j].xiangmu)>(L->m))统计各学校总分函数介绍如下:

流程图如图7:

图7

voidschool(seqlist*L,list*s)//统计各学校总分

{

inti,j,sum;

for(i=1;i<=L->n;i++)

{sum=0;

for(j=1;j<=L->r;j++)

{

if(L->sc[j].xuexiao==i){

sum=sum+L->sc[j].score;}

}

s->r[i].xiaohao=i;

s->r[i].key=sum;

printf("学校代号为%d的学校取得的总分为:

%d\n",i,sum);

}

}

三、上机调试

1、调试中遇到问题及解决方法

1)、程序调试过程中常会出现一些小错误,如i,j混淆少括号少分号等小问题都可以按照提示找到,然后改正。

2)、语句错误语句使用不当造成程序无法运行出正常的结果。

3)、在排序过程中输出的结果是按总分顺序排序的,但是却不能够正确的输出是哪个学校的总分,解决方法是在新申请的顺序表的节点中加入了一个纪录学校代号的内容,在输出的同时就可以把学校代号也正确的输出来了。

4)开始的时候想在结构体里假如SEX来记录男女性别,以用来区分男子和女子项目,但是这样的话相对比较麻烦了,在程序中就是在项目代号来解决的,算法中有实现。

5)为了方便使用者,对程序中的输出基本上都用了排序,使得程序更加完善,在美观上也有一定的提高。

2、设计体会

通过这次课程设计使我进一步达到理论与实际相结合,提高了自己组织数据及编写程序的能力,使我们能够根据问题要求和数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并用软件解决问题,培养良好的程序设计技能,掌握设计程序的思路,学会用计算机语言编写程序,以实现所需处理的任务,锻炼自己的动脑能力,学会用自己的思路解决现实中的实际问题,虽然一开始也走了一些弯路不过在同学和老师的点拨下完成了该程序,这次课程设计中遇到了很多问题,一开始准备用二维数组存放的可考虑到同一个学校同一个项目有好几个人参加,就不能用二维数组了,如果每个学校都申请一个二维数组也非常不方便,还是用顺序表方便也不浪费空间,在这次课程设计的过程中虽然很多次都参照了课本及资料,不过这使我更加熟悉了顺序表以及结构体的定义及实现,调试过程中也遇到了一些问题也都是自己独立思考完成的,还有一个体会是,遇到不会的地方可以参考课本也可以去图书馆或网上查资料,当然主要思路有了也就简单点了,一开始思路不是很清楚就开始在敲程序了,浪费了很多时间,在老师的指导下,把自己的思路理清楚了再来敲程序果真是事半功倍,这真是个很好的收获。

还有就是这个程序的男女问题上,开始准备在结构体中加一个sex的点,大使那样对与男女项目还是有点麻烦,后来在同学的提醒下,通过参赛项目号就可以解决了,比m大就是女子项目,比m小或者等于m就是男子项目。

这样就可以很完美地解决这个问题了。

其实,当你实验遇到问题时,自己会通过很多途径去解决它,没有解决时,心急如焚,解决之后的那种快感是前所未有的,这也许就是付出了行动之后的收获吧!

这也教会了我们以后在社会上,遇见了事情不可怕,只要不被困难击倒,解决了它,那样我们就是胜利的!

3、性能分析

在排序时用到了直接插入排序,从算法描述中可以看到,在搜索插入位置时,遇到关键字相等的元素就停止比较和移动元素,可以确定该算法是稳定的排序算法。

从空间角度上看,它只需要一个元素的辅助空间r[0]。

从时间角度上看,主要时间耗费在关键字的比较和移动元素上。

n为顺序表表长,平均时间复杂度为O(n2)最坏时间复杂度为O(n2)辅助存储空间r[0]。

四、用户使用说明

本程序主要用来实现运动会分数统计,用户在使用前需输入参赛人数,男子项目数、女子项目数以及参赛总人数,参赛编号是根据输入顺序编的,参赛人数既为顺序表表长,在完成这一步后,在提供的可选菜单中用户应先建立参赛者信息(即选1),参赛者信息一次性输入,如果文件中已保存输入的菜单,下次就不需要再重新建立参赛者信息了,可直接对已存的信息进行查询排序输出,可根据菜单选择。

而且,一定要是一次性输入完毕,否则下回再输入的时候就会将上次的输入记录覆盖掉,因此在使用的时候要多加注意。

另外,其他几个功能在菜单中都有,只要根据菜单进行操作,基本上都可以完成其功能的实现。

五、测试结果

下面是输入了学校和男子、女子项目数以及总参赛人数之后的截图(图8):

图8

功能2:

按照学校代号和项目代号查询运动会成绩,其功能实现的截图如图10:

图10

关于功能3:

按照运动会的项目代号进行学校成绩的查询,其功能实现的截图如图11:

图11

关于功能4:

统计出各参赛学校在运动会中取得的总分,其功能实现的截图如图12:

图12

关于功能5:

统计各学校在运动会男子项目上的总分,其功能实现的截图如图13:

图13

关于功能6:

统计各学校在运动会女子项目中的总分,其功能实现的截图如图14:

图14

关于功能7:

输出所有学校所有参赛者在运动会中的所有信息,其功能实现的截图如图15:

图15

关于功能8:

输出各学校所有信息(运动会中分数及参赛者所得分数),是按照每个学校的顺序输出的,其功能实现的截图如图16:

图16

关于功能0:

推出此系统的使用,使用之后会出现以下截面图17:

图17

关于功能1,即建立参赛者信息并记录成绩这个功能实现的截图如图9:

图9

七、参考文献

李红、王昆仑等编著《数据结构与算法》中国铁道出版社2007年6月第1版

八、源程序

#include

#include

#include

#include

#defineNULL0

#definesize100

staticintn=0;

//intcount;

typedefstruct{//节点

charname[100];//姓名

intxuexiao;//学校代号

intxiangmu;//项目代号

intscore;//成绩

}schooltype;

typedefstruct{//顺序表

schooltypesc[size];//工作单元

intn;//学校数

intm;//男子项目数

intw;//女子项目数

intr;//总参赛人数

}seqlist;

typedefstruct//节点

{

intkey;//放分

intxiaohao;//放校代号

}recordtype;

typedefstruct//顺序表为方便排序而建立的

{

recordtyper[size];//工作单元

}list;

voidsavefile(seqlist*,int);//函数的声明

voidset(seqlist*L){

inti,x;

for(i=1;i<=L->r;i++){

printf("依次输入校代号,项目号,姓名,成绩:

\n");

scanf("%d%d%s%d",&L->sc[i].xuexiao,&L->sc[i].xiangmu,&L->sc[i].name,&L->sc[i].score);

savefile(L,i);

printf("\n恭喜您,建立成功!

\n");

printf("是否继续添加?

\n");

printf("1-----------------是\n");

printf("0-----------------否\n");

scanf("%d",&x);

if(x==0)return;

while((x!

=1)&&(x!

=0))

{

printf("您的输入有误,请重新输入!

");

scanf("%d",&x);

}

}

}

voidsearch1(seqlist*L){//按学校代号查某个项目的情况

inti,j,n;

intflag=1;

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)

{printf("该学校在该项目姓名为%s取得成绩:

%d\n",L->sc[j].name,L->sc[j].score);flag=0;}

}

if(flag==1)printf("查找不到您所要超找的学生和项目!

\n");

}

voidsearch2(seqlist*L){//按项目代号查取得成绩的学校

intj,k;

intflag=1;

printf("输入所要查的项目代号:

\n");

scanf("%d",&k);

for(j=1;j<=L->r;j++){

if(L->sc[j].xiangmu==k&&L->sc[j].score!

=0)

{

printf("学校代号%d在项目上%d姓名为%8s取得成绩是%4d\n",L->sc[j].xuexiao,k,L->sc[j].name,L->sc[j].score);

flag=0;

}

}

if(flag==1)printf("查找不到您所要查找的项目!

\n");

}

voidschool(seqlist*L,list*s)//统计各学校总分

{

inti,j,sum;

for(i=1;i<=L->n;i++){

sum=0;

for(j=1;j<=L->r;j++){

if(L->sc[j].xuexiao==i){

sum=sum+L->sc[j].score;}

}

s->r[i].xiaohao=i;

s->r[i].key=sum;

printf("学校代号为%d的学校取得的总分为:

%d\n",i,sum);

}

}

voidboy(seqlist*L,list*s)//统计各学校男子项目总分

{

inti,j,sum;

for(i=1;i<=L->n;i++)

{

sum=0;

for(j=1;j<=L->r;j++)

{

if(L->sc[j].xuexiao==i)

{

if((L->sc[j].xiangmu)<(L->m)||(L->sc[j].xiangmu)==(L->m))

{

sum=sum+L->sc[j].score;

}

}

}

s->r[i].xiaohao=i;

s->r[i].key=sum;

printf("学校代号为%d在男子项目取得的总分为:

%d\n",i,sum);

}

}

voidgirl(seqlist*L,list*s){//统计各学校女子项目总分

inti,j,sum;

for(i=1;i<=L->n;i++){

sum=0;

for(j=1;j<=L->r;j++){

if(L->sc[j].xuexiao==i){

if((L->sc[j].xiangmu)>(L->m)){

sum=sum+L->sc[j].score;}

}

}

s->r[i].xiaohao=i;

s->r[i].key=sum;

printf("学校代号为%d在女子项目取得的总分为:

%d\n",i,sum);

}

}

voidpaixu(seqlist*L,list*s){//直接插入排序

inti,j,k;

for(i=1;i<=L->n;i++){

s->r[0]=s->r[i];j=i-1;

while(s->r[0].key>s->r[j].key){

s->r[j+1]=s->r[j];

j=j-1;

}

s->r[j+1]=s->r[0];

}

printf("\n按成绩由高到低进行排序,有:

\n\n");

for(k=1;k<=L->n;k++){

printf("学校代号为%d总分为:

%d\n",s->r[k].xiaohao,s->r[k].key);

}

printf("\n");

}

voidbaobiao(seqlist*L){

inti,j;

for(i=1;i<=L->n;i++){

printf("学校代号为%d的学生成绩报表:

\n\n",i);

printf("\t\t项目号姓名成绩:

\n");

for(j=1;j<=L->r;j++)

if(i==L->sc[j].xuexiao)

printf("\t\t%d\t%4s\t%d\n",L->sc[j].xiangmu,L->sc[j].name,L->sc[j].s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 艺术创意

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1