运动会计分系统课程设计报告书.docx
《运动会计分系统课程设计报告书.docx》由会员分享,可在线阅读,更多相关《运动会计分系统课程设计报告书.docx(34页珍藏版)》请在冰豆网上搜索。
运动会计分系统课程设计报告书
编号:
B04931082
学号:
201240450137
课程设计
教学院
计算机学院
课程名称
高级语言程序设计Ⅱ
题目
运动会比赛计分系统
专业
软件工程
班级
(一)班
姓名
包先跃
同组人员
石奇、吕鹏飞、立阳
指导教师
祁文青
2013
年
06
月
29
日
课程设计任务书
2012~2013学年第2学期
学生:
包先跃专业班级:
12软件工程
指导教师:
祁文青工作部门:
计算机学院
一、课程设计题目:
运动会比赛计分系统
二、课程设计容:
初始化输入:
N-参赛学校总数,M-男子竞赛项目数,W-女子竞赛项目数各项目名次取法有如下几种:
取前5名:
第一名得分7分,第二名得分5,第三名得分3,第四名得分2,第五名得分1;取前3名:
第一名得分5,第二名得分3,第三名得分2;
功能要求:
(1)系统以菜单方式工作
(2)由程序提醒用户填写比赛结果,输入各项目获奖运动员信息。
(3)所有信息记录完毕后,用户可以查询各个学校的比赛成绩
(4)查看参赛学校信息和比赛项目信息等。
三、进度安排
1.分析问题,给出数学模型,选择数据结构。
2.设计算法,给出算法描述。
3.给出源程序清单。
4.编辑、编译、调试源程序。
5.撰写课程设计报告。
四、基本要求
1.界面友好,函数功能要划分好。
2.总体设计应画一流程图。
3.程序要加必要的注释。
4.要提供程序测试方案。
5.程序一定要经得起测试,要能运行起来,不能运行的程序是没有价值的。
一概述
1.课程设计的目的
1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养综合运用所学知识独立完成课题的能力。
3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
2.课程设计的要求
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:
输入数据形式和围:
可以输入学校的名称,运动项目的名称
输出形式:
有合理的提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:
要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。
进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明;
二总体方案设计
(1)运动项目定义:
typedefstructSport//运动项目结构{
charname[20];//运动项目名称
intisboy;//0为女项目,1为男项目
intis3;//0为取前五名,1为取前五名
intnumber;//项目编号
(2)主要算法的设计思想:
本程序主要是使用链表来实现操作。
一个运动会包括运动项目和参加运动会的成员。
因此构造两个链表Department,Sport。
根据输入的不同选择不同的功能,有输入运动项目,按总分排序,按男团体总分排序,按女团体总分排序,按项目标号查询,退出。
为了操作的方便,并且能够保存输入数据,所以通过文件操作来实现数据的写和读。
每次添加新的数据后都要输入0退出,数据才能保存。
对于总分的排序使用了冒泡排序。
为了使整个程序看起来更加友好,又添加了程序启动画面。
在此次课程设计小组中我所承当的工作是:
对总程序的结构体的定义,界面菜单的建立以及voidfunct6(ALLNode*g2)和按学校编号查询学校某个项目情况的子函数程序编写。
voidfunct7(ALLNode*g2)是按学校编号查询学校某个项目情况;voidfunct6(ALLNode*g2):
按女团体总分排序输出。
(各部分解决问题详见详细设计中遇到的较重要问题的回顾)
三详细设计
3、1程序流程图
1)设计运动会的学校编号或名称、项目成绩、男女团体总分的数据存储系统设计图
图
(1)
(2)查询团体总分程序设计图
图2
(3)总流程图:
(4)算法分析:
其中
school类为:
classschool:
publicathlete/*学校*/
{
……
public:
intcount;/*学校获奖数*/
intserial;/*学校编号*/
intmenscore;/*男选手总分*/
intwomenscore;/*女选手总分*/
inttotalscore;/*总分*/
athleteath[MaxSize];/*获奖运动员信息数组,包括分数,名次,项目*/
school*prev;//前指针
school*next;//后指针
};
其中部分主要的函数:
添加操作add(school*&head)
查询操作checkFunc(school*head,int&n)
文件保存save(school*head)
总分快速排序tquicksort(vector&v,intfirst,intlast)
总分基数排序tbaseSort(vector&v,intd)
2.关键算法
{……
添加项目号
for(i=1;i<=n;i++)
{输入第i名运动员的学校编号temp
……
while(first!
=head)//遍历链表,直到找到编号为serial的学校所在结点,或first指向表头head
{if(first->serial==要添加的编号)
{
(first->ath[first->count]).item=要添加的项目号;
(first->ath[first->count]).range=i(名次)
First指向的学校的项目加一;
更新总分
break;}
first=first->next;
(5)遇到的较重要问题的回顾
5.1.1提出问题
所有输入输出容只能在一屏显示,学过c语言,很知道”\n”是换行,”\f”是换屏的,可是在这里就是无法实现。
5.1.2解决问题
输入clrscr();
5.1.3提出问题
设置选项,供用户输入选择时,当按任意键时都会跳入下一步操作,或者直接退出系统。
5.1.4分析问题
在供用户选择时,提供了几个选项,就写几个case语句,但是当用户输入的并不是这几个数字时,系统就不能做出正确判断。
5.1.5解决问题
修改case语句,添加default语句提示出错,要求重新输入;
default:
{
clrscr();/*清屏*/
printf("输入错误,请重新选择");
}
5.1.6提出问题
当同一项目中有同一学校的两个人时,便不能正确输出或者输出相同人名。
5.1.7分析问题
由于同时有两个相同学校编号的人存在,系统在输出时,不能确定那个是正确的,或者用后来的覆盖以前的。
5.1.8解决问题
用for函数实现从开始到结尾的遍历。
5.2算法的效率及改进设想
算法的效率:
总的来讲,严重引响执行速度的便是查找,查找任意一个数据,便要将其所在的结构从头至尾遍历一次,耗费大量的时间。
改进设想:
因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关学校的各种信息为集合的结构。
在这次上机过程中遇到过一些问题,但经过我们不懈努力,解决了部分,还有的现在不能解决,留着我们日后思考和解决。
比如说在运用数据结构排序的时候,方法的选择上,总是想用时间复杂度小的算法,但结果出了问题,最后还是用了我们熟悉的选择法排序。
结构体的运用上感觉不是很熟悉,遇到结构体的时候很陌生,这是以后必须要加强的。
在我们的这个程序中用了两个结构体:
structnode
{
intnum;
};
structnode*f[22];
我们同样遇到了一些还不能很好解决的问题,在输出的时候不能得到我们想要的效果,在按学校编号排序查询输出的时候,发生了重叠在做了几次修改之后都能使之满意,这有待学习和修改。
在编写之前,做整体的规划很重要,这才能让我们的效率更高和合作得更好。
四程序的调试与运行结果分析
(一)用户手册
1本程序可以在vc++5.0和vc++6.0的环境下运行。
2在vc中创建一个工程,将源程序复制到.cpp中,编译就可以。
如下:
运动会计分系统
1.主菜单窗口
2.输入各个项目成绩并存储文件
3.统计各学校总分
4.按学校编号排序输出
5.按学校总分排序输出
6.按男团体总分排序输出
7.按女团体总分排序输出
8.按学校编号查询学校某个项目情况
9.按项目编号查询取得名次的学校
(二)调试过程中出现的问题和处理方式
为了使系统具有一点的容错性,当输入错误信息时应给出相应提示以正确输入数据,如:
printf("要查询的项目编号:
");
scanf("%d",&s);
if(s>m+w||s==0)
printf("此次运动会不包括这个项目.\n\n\n");
想在每次查询结束想返回主菜单进行其它项时,应在main()函数中调用其它函数时再调用main()函数,如:
switch(choice)
{
case1:
inputinformation();writedata();readdata();main();
case2:
output();main();
case3:
inquiry();main();
case4:
readdata();main();
程序出现语法错误,发现是输入名次信息的地方忘带地址符&,或是程序不完整,只写了一个大括号。
如:
printf("*****名次:
");
scanf("%d",&h[i].c[j].range[s])
五课程设计总结
经过几个星期的奋战,终于完成了课程设计,感觉又进一步了解了这门课程,各个知识点都加强了我似乎突然找到了方向,认真的学习这门课。
回顾这次课程设计,使我感慨颇多。
的确,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,同时不仅可以巩固学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,从而提高自己的实际动手编程能力和独立思考的能力。
运动会计分系统,比较复杂,经过很长时间的书写,总算尝到了胜利的“滋味”
在细节的认识上,我们在开发程序的时候,在之前就要知道自己想要的效果,然后把需要实现的功能在纸上列出来,然后比如要用几个函数来实现几个功能,整体需要几个模块来搭建,这些工作都是要在未动工之前就得做好的准备工作,编程要的是有整体的思想加细心。
这次的课程设计收获颇多,最大的认识到了要想高效设计出想要的东西不仅要熟悉的掌握所学知识,还要学会充分利用现有资源。
在这之前,总以为自己编程方面还很差,现在才觉得,只要努力了,就会有收获,就会得到回报。
附录:
(源程序)
(一)。
运动会计分系统
#include
#include
#include
#include
//#include/*屏幕操作函数*/
#defineMAX50
//#defineNULL0
typedefstructnode1{
intschool;/*学校编号*/
intrecord;/*项目成绩*/
structnode1*next;/*链域*/
}Schools;
typedefstruct{
intitem;/*项目编号*/
Schools*firstschool;/*链域指向链表中第一个结点*/
}ITEM;
typedefstruct{
intz;/*项目总数*/
ITEMa[MAX];
}ALLitems;
typedefstructnode2{
intitem;/*该学校获奖的项目*/
intrecord;/*项目成绩*/
structnode2*next;/*链域*/
}Items;
typedefstruct{
intschool;/*学校编号*/
intscore;/*学校总分*/
intboys;/*男团体总分*/
intgirls;/*女团体总分*/
Items*firstitem;/*链域指向链表中第一个获奖项目的结点*/
}SCHNode;
typedefstruct{
intn;/*学校总数*/
SCHNodeb[MAX];
}ALLNode;
ALLitems*g1;
ALLNode*g2;
voidfunct1(ALLitems*g1,ALLNode*g2)
{Schools*p1;
Items*p2;
inti,j,k,m,w,h,x;
p1=(Schools*)malloc(sizeof(Schools));
p2=(Items*)malloc(sizeof(Items));
if(!
p1||!
p2)
exit
(1);
printf("\n******输入各个项目信息******\n\n");
printf("输入男子项目总数m:
");
scanf("%d",&m);
if(m<0||m>20)
{printf("输入有误,m是20以的整数,请重新输入:
");
scanf("%d",&m);
}
printf("输入女子项目总数w:
");
scanf("%d",&w);
if(w<0||w>20)
{printf("输入有误,w是20以的整数,请重新输入:
");
scanf("%d",&w);
}
printf("输入参加运动会的学校总数n:
");
scanf("%d",&g2->n);
if(g2->n<0||g2->n>20)
{printf("输入有误,n是20以的整数,请重新输入:
");
scanf("%d",&g2->n);
}
g1->z=m+w;
printf("则项目编号为男子1-%d,女子%d-%d",m,m+1,g1->z);
printf("\n\n****记录运动会成绩****");
printf("\n\n(输入0标志结束)\n");
for(k=1;k<=g1->z;k++)
{g1->a[k].item=k;
g1->a[k].firstschool=NULL;
}
for(k=1;k<=g2->n;k++)
{g2->b[k].school=k;
g2->b[k].firstitem=0;
g2->b[k].score=0;
g2->b[k].boys=0;
g2->b[k].girls=0;
}
g2->b[0].score=0;
g2->b[0].boys=0;
g2->b[0].girls=0;
while(i!
=0)
{printf("\n项目:
");
scanf("%d",&i);
if(i!
=0)
{printf("1.前三名2.前五名\n");
printf("请选择:
");
scanf("%d",&j);
if(j!
=1&&j!
=2)
{printf("输入有误,请重新选择:
");
scanf("%d",&j);
}
if(j==1)
{h=3;
do{printf("第%d名:
学校(学校编号为数字)",h);
scanf("%d",&x);
p1=(Schools*)malloc(sizeof(Schools));
p1->school=x;
p2=(Items*)malloc(sizeof(Items));
p2->item=i;
if(h==3)p2->record=p1->record=2;
if(h==2)p2->record=p1->record=3;
if(h==1)p2->record=p1->record=5;
p1->next=g1->a[i].firstschool;
g1->a[i].firstschool=p1;
p2->next=g2->b[x].firstitem;
g2->b[x].firstitem=p2;
g2->b[x].score=g2->b[x].score+p2->record;/*累计总分*/
if(i<=m)g2->b[x].boys=g2->b[x].boys+p2->record;/*累计男团体总分*/
elseg2->b[x].girls=g2->b[x].girls+p2->record;/*累计女团体总分*/
h--;
}while(x!
=0&&h!
=0);
}
if(j==2)
{h=5;
do{printf("第%d名:
学校(学校编号为数字)",h);
scanf("%d",&x);
p1=(Schools*)malloc(sizeof(Schools));
p1->school=x;
p2=(Items*)malloc(sizeof(Items));
p2->item=i;
if(h==5)p2->record=p1->record=1;
if(h==4)p2->record=p1->record=2;
if(h==3)p2->record=p1->record=3;
if(h==2)p2->record=p1->record=5;
if(h==1)p2->record=p1->record=7;
p1->next=g1->a[i].firstschool;
g1->a[i].firstschool=p1;
p2->next=g2->b[x].firstitem;
g2->b[x].firstitem=p2;
g2->b[x].score=g2->b[x].score+p2->record;/*累计总分*/
if(i<=m)g2->b[x].boys=g2->b[x].boys+p2->record;/*累计男团体总分*/
elseg2->b[x].girls=g2->b[x].girls+p2->record;/*累计女团体总分*/
h--;
}while(x!
=0&&h!
=0);
}
}
}
}
voidsave()
{FILE*fp1,*fp2;
fp1=(FILE*)malloc(sizeof(FILE));
fp2=(FILE*)malloc(sizeof(FILE));
if((fp1=fopen("sports1","wb"))==NULL)
{printf("cannotopenfile.\n");
return;
}
if(fwrite(g1,sizeof(ALLitems),1,fp1)!
=1)
printf("filewriteerror.\n");
fclose(fp1);
if((fp2=fopen("sports2","wb"))==NULL)
{printf("cannotopenfile.\n");
return;
}
if(fwrite(g2,sizeof(ALLNode),1,fp2)!
=1)
printf("filewriteerror.\n");
fclose(fp2);
}
voidfunct2(ALLNode*g2)/*输出各学校总分*/
{intk;
printf("\n\n******输出各学校总分******\n");
printf("学校编号\t总分\n");
for(k=1;k<=g2->n;k++)
printf("%d\t\t\t%d\n",k,g2->b[k].score);
printf("\n");
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
voidfunct3(ALLNode*g2)/*按学校编号排序输出*/
{
intk;
Items*p2;
p2=(Items*)malloc(sizeof(Items));
printf("\n\n******按学校编号排序输出******\n");
printf("学校编号\t\t\t获奖情况\n");
scanf("%d",&k);
for(k=1;k<=g2->n;k++)
{printf("\t\t\t\t\t\t%d\t",k);
p2=g2->b[k].firstitem;
while(p2!
=NULL)
{printf("项目%d:
得%d分",p2->item,p2->record);
p2=p2->next;
}
printf("\n");
}
printf("\n");
system("pause");
printf("按任意键返回主菜单......");
getchar();
}
voidfunct4(ALLNode*g2)/*按学校总分排序输出*/
{inti,j,k;
Items*p2;
printf("\n\n******按学校总分排序输出*****