运动会分数统计课程设计.docx
《运动会分数统计课程设计.docx》由会员分享,可在线阅读,更多相关《运动会分数统计课程设计.docx(43页珍藏版)》请在冰豆网上搜索。
运动会分数统计课程设计
课程设计报告
课程名称数据结构
设计题目运动会分数统计
专业计算机科学与技术
班级
学号
姓名
完成日期_________2012年6月8日_____________
课程设计任务书
设计题目:
运动会分数统计系统
设计内容与要求:
【设计内容】
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定(m<=20,n<=20)。
【基本要求】
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:
输入数据形式和范围:
可以输入学校的名称,运动项目的名称
输出形式:
有中文提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
指导教师:
_____
2012年6月8日
课程设计评语
成绩:
指导教师:
__________
2012年6月8日
1、问题描述
任务:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20),按要求实现相应的数据输入、查询、计分等功能。
2、基本要求
(1)、数据要求
1)建议输入学校的名称,运动项目的名称等,其余信息学生自行设计;
2)输出形式:
有合理的提示,各学校分数为整形;
3)数据的存储结构自行设计。
4)建议运动会的相关数据要存储在数据文件中。
(2)、操作要求
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:
输入数据形式和范围:
可以输入学校的名称,运动项目的名称
输出形式:
有中文提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
(3)、测试数据要求
测试数据要求使用:
1、全部合法数据;
2、整体非法数据;
3、局部非法数据。
进行程序测试,以保证程序的稳定。
(4)、界面要求
有合理的提示,每个功能可以设立菜单,根据提示,能完成相关的功能操作并符合要求。
(5)、存储结构要求
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构。
3、数据结构
(1)、定义运动项目数据类型
定义运动项目数据类型邻接表,用于存放运动项目的信息,包括运动项目总数、运动项目名称、运动项目编号及在每个运动项目中取得名次的学校编号、学校名字、运动项目成绩。
typedefstructSchoolNode
{intschool;//学校编号
chars_name[MAX];//学校名字
intrecord;//项目成绩
structSchoolNode*next;//链域
}SchoolNode;
typedefstruct
{intitem;//项目编号
charitem_name[MAX];//项目名字
SchoolNode*firstschool;//链域指向链表中第一个结点
}Item;
typedefstruct
{intitem_num;//项目总数
Itemitem[MAX];
}AllItems;
(2)、定义学校数据类型
定义学校数据类型邻接表,用于存放参赛学校的信息,包括学校总数、学校名称、学校编号、学校总分、男子团体总分、女子团体总分以及每个学校获奖的运动项目编号、运动项目名称、取得的成绩。
typedefstructItemNode
{intitem;//该学校获奖的项目编号
chari_name[MAX];//项目名字
intrecord;//项目成绩
structItemNode*next;//链域
}ItemNode;
typedefstruct
{intschool;//学校编号
charschool_name[MAX];//学校名字
intshool_score;//学校总分
intboys_score;//男团体总分
intgirl_score;//女团体总分
ItemNode*firstitem;//链域指向链表中第一个获奖项目的结点
}SCHNode;
typedefstruct
{intschool_num;//学校总数
SCHNodeschool[MAX];
}AllSchool;
4、总体设计
根据运动会分数统计系统的问题分析及设计要求,可以将此系统分为四个模块:
信息统计模块、信息排序输出模块、信息查询模块、信息调用模块。
(1)、信息统计模块实现信息的输入、统计,涉及函数有:
voidInputInfo()、
(2)、信息输出模块实现信息的输出,涉及函数有:
intMenu_Select_Tow()、Sort_Schoolnum()、Sort_SchoolScore()、Sort_ManScore()、Sort_WomanScore()。
(3)、信息查询模块实现信息的查询,涉及函数有:
FindInfo_SchoolNum()、FindInfo_SchoolNum()、intMenu_Select_Three()。
(4)、信息调用模块实现信息的调用,即从文件中读出信息并输出、保存信息,涉及函数有:
voidsave()、voidReadInfo()。
主函数与各函数调用关系流程图、结构图:
信息排序输出模块流程图
信息查询模块流程图
5、详细设计
(1)、信息输入及分数统计功能
voidInputInfo()、voidItem_Score()、voidInitList()是信息输入、分数统计的函数、邻接表初始化,在输入信息的同时进行分数统计,可以输入各学校各项目前3名或前5名的成绩。
结果取前3名还是前5名由用户自己定。
用if(j==1)语句将前3名的成绩赋值为5、3、2,if(j==2)前5名的成绩赋值为7、5、3、2、1,未取得的成绩则赋为0。
并统计总分、男子团体总分和女子团体总分。
其主要功能流程图如下:
(2)、信息排序输出功能
intMenu_Select_Tow()、Sort_Schoolnum()、Sort_SchoolScore()、Sort_ManScore()、Sort_WomanScore()是排序输出菜单函数及四种排序输出函数。
输出一个总分显示菜单,利用switch语句实现按学校名称输出或按学校总分、男子团体总分、女子团体总分由低到高输出。
采用冒泡排序和直接插入排序的方法使之按总分由低到高输出。
其主要功能流程图如下:
(3)、信息查询功能
FindInfo_SchoolNum()、FindInfo_SchoolNum()、intMenu_Select_Three()函数是两个信息查询函数及查询菜单函数,显示一个查询菜单,利用switch语句实现按学校编号查询和按项目编号查询,并输出该学校某个项目的情况或某个项目取得前3名或前5名的学校信息。
利用循环语句do…while()返回查询菜单,break语句终止循环。
其主要功能代码如下:
(4)、信息保存及读取
voidsave()、voidReadInfo()这两个函数分别实现信息保存到文件以及从文件中读取信息的功能。
把信息保存到文件中以及读取保存在文件里的信息并输出。
由于采用的是链式存储,可以很方便的一下把文件里的信息全部读取出来,再依次创建生成邻接表,将信息全部读到两个邻接表中存储。
其主要功能流程图如下:
6、测试与调试
1、输出界面
运行程序,先输入密码,进入主菜单界面,用户可以选择输入各个项目成绩及信息、显示各学校总分、信息排序、信息查询、保存信息到文件、从文件中读入信息、退出系统等操作选项。
注意:
第一次运行本程序时,请选择输入各个项目成绩及信息。
以后再运行时,为了避免再次输入大量信息,可以先选择从文件中读入信息,将以前输入的信息重新显示在屏幕上,再进行后续操作。
主菜单界面如图所示:
(1)、输入信息
选择1号功能进入输入信息模块,根据提示信息将以下信息输入系统中。
请输入男子项目总数m:
3请输入女子项目总数w:
2
请输入参加运动会的学校总数n:
6
项目编号:
1项目名字:
basketball取前3名请输入第3名的学校编号:
4请输入第3名的学校名字:
heda请输入第2名的学校编号:
6请输入第2名的学校名字:
litcs请输入第1名的学校编号:
1请输入第1名的学校名字:
qinghua
项目编号:
2项目名字:
football取前5名请输入第5名的学校编号:
4请输入第5名的学校名字:
heda请输入第4名的学校编号:
3请输入第4名的学校名字:
zhengda请输入第3名的学校编号:
2请输入第3名的学校名字:
beida
请输入第2名的学校编号:
1请输入第2名的学校名字:
qinghua请输入第1名的学校编号:
6请输入第1名的学校名字:
litcs
项目编号:
3项目名字:
manyumaoqiu取前3名请输入第3名的学校编号:
5请输入第3名的学校名字:
hekeda请输入第2名的学校编号:
2请输入第2名的学校名字:
beida请输入第1名的学校编号:
1请输入第1名的学校名字:
qinghua
项目编号:
4项目名字:
pingpangqiu取前5名请输入第5名的学校编号:
4请输入第5名的学校名字:
heda请输入第4名的学校编号:
5请输入第4名的学校名字:
hekeda请输入第3名的学校编号:
2请输入第3名的学校名字:
beida
请输入第2名的学校编号:
1请输入第2名的学校名字:
qinghua请输入第1名的学校编号:
6请输入第1名的学校名字:
litcs
项目编号:
5项目名字:
womanyumaoqiu取前3名请输入第3名的学校编号:
5请输入第3名的学校名字:
hekeda请输入第2名的学校编号:
3请输入第2名的学校名字:
zhengda请输入第1名的学校编号:
6请输入第1名的学校名字:
litcs。
输入信息如图所示:
(2)、输出各个学校总分信息
输入2进入总分显示菜单界面。
各个学校总得分如下图显示所示:
(3)、信息排序
输入3进入信息排序菜单界面。
用户可根据自己喜好选择学校编号排序输出、按学校总分排序输出、按男团总分排序输出、女团总分排序输出、返回主菜单。
①信息排序菜单界面如图所示:
②按学校编号输出:
③按学校总分排序输出:
④按学校男团体总分排序输出:
④按学校女团体总分排序输出:
(4)、查询信息
输入4进入信息查询界面,用户可根据自己喜好选择按学校编号查询、按项目编号查询或者退出返回主菜单。
信息查询界面如图所示:
用户可根据自己喜好选择按哪种方式查询,查询结束后,按任意键返回信息查询界面。
输入0则返回主菜单。
以下是分别按照学校编号、项目编号查询的情况。
按学校编号查询学校某个项目情况:
按项目编号查询取得名次的学校:
(5)、调用信息
为了避免每次运行程序时都要输入大量数据,在第一次运行程序后,就已经将信息自动存档,再次运行时,可以先直接调用信息,按任意键返回主菜单,再进行后续操作。
调用的信息如图所示:
显示文件中读取的信息如图所示:
(6)退出系统
输入0则退出系统,并有中文提示。
如图所示:
3、调试分析
运行程序,进入主菜单界面,用户可以选择输入信息、输出信息、查询信息、调用信息、关于或退出系统。
测试数据:
选择1号功能进入输入信息模块,根据提示信息将以下信息输入系统中。
请输入男子项目总数m:
3请输入女子项目总数w:
2
请输入参加运动会的学校总数n:
6
项目编号:
1项目名字:
basketball取前3名请输入第3名的学校编号:
4请输入第3名的学校名字:
heda请输入第2名的学校编号:
6请输入第2名的学校名字:
litcs请输入第1名的学校编号:
1请输入第1名的学校名字:
qinghua
项目编号:
2项目名字:
football取前5名请输入第5名的学校编号:
4请输入第5名的学校名字:
heda请输入第4名的学校编号:
3请输入第4名的学校名字:
zhengda请输入第3名的学校编号:
2请输入第3名的学校名字:
beida
请输入第2名的学校编号:
1请输入第2名的学校名字:
qinghua请输入第1名的学校编号:
6请输入第1名的学校名字:
litcs
项目编号:
3项目名字:
manyumaoqiu取前3名请输入第3名的学校编号:
5请输入第3名的学校名字:
hekeda请输入第2名的学校编号:
2请输入第2名的学校名字:
beida请输入第1名的学校编号:
1请输入第1名的学校名字:
qinghua
项目编号:
4项目名字:
pingpangqiu取前5名请输入第5名的学校编号:
4请输入第5名的学校名字:
heda请输入第4名的学校编号:
5请输入第4名的学校名字:
hekeda请输入第3名的学校编号:
2请输入第3名的学校名字:
beida
请输入第2名的学校编号:
1请输入第2名的学校名字:
qinghua请输入第1名的学校编号:
6请输入第1名的学校名字:
litcs
项目编号:
5项目名字:
womanyumaoqiu取前3名请输入第3名的学校编号:
5请输入第3名的学校名字:
hekeda请输入第2名的学校编号:
3请输入第2名的学校名字:
zhengda请输入第1名的学校编号:
6请输入第1名的学校名字:
litcs。
时间复杂度分析:
用户输入信息时,采用三重循环进行输入,因此信息输入函数的时间复杂度为O(N*(M+W)*k)。
利用冒泡排序法进行排序,采用二重循环,时间复杂度为O(N*N)。
采用顺序存储结构,信息存放在数组的相应内存单元里,因此查询函数的时间复杂度为O
(1)。
写信息时可以一次全部写进去,读信息时也可以一次全部读出来,因此写文件函数和读文件函数的时间复杂度都为O
(1)。
存在问题的思考及算法的改进设想:
①刚开始运行程序时,就是一句一句的显示,界面很不好看,于是想把他弄成菜单的形式,但是两个子菜单要实现与主菜单之间的切换,能够自如返回主菜单。
开始时没有想到要去直接调用实现主菜单操作的函数Menu_Select_One(),废了好大周折,后来问了同学,顿时茅塞顿开。
②显示的内容堆积在一个屏幕上,看着很混乱,用C语言里的clrscr()函数在VC++里似乎不能用,上网查了下资料,找到了一个头文件为stdlib.h的清屏函数system(”cls”)。
③调试程序时,遇到了屏幕一闪又回到原来界面的情况,没有输出想要得到的信息,原来是信息在屏幕上显示后,程序执行到了清屏函数,所以立马清屏了,为了看到输出信息,调用system(”pause”)函数,使程序暂停,以让用户看到输出地信息,然后再按任意键继续执行程序。
④对此程序结构体的定义比较难,要整体考虑全局设置出结构体,这次课设用到结构体的嵌套,由于对结构体的使用还不是很熟悉,所以做起来时花费了不少时间,但一个课设做下来,还算是得心应手。
⑤对于读写文件不是很熟悉,fread和fwrite函数不是很会用,在读出文件里的信息并输出时花了很长时间,不过,最后总算是会用了。
4、设计总结
在课程设计的过程中,虽然遇到了很多问题,但最终差不多也都一一解决了。
有的时候是一些很小的逻辑错误,需要的是细心。
同学之间互相帮助,多个人思考多个力量,遇到自己解决不了的问题,向同学求助,能更好的帮我们解决所面临的难题。
由于此次课程设计用到数据文件的知识,而这些知识老师都没讲,自学起来稍微有点困难,但也不是完全看不懂,只是对一些函数的应用不太熟悉,经过此次课程设计,对文件的读写有了更深的了解,也相应的培养了我的自学能力。
经过C语言和数据结构的学习,我发现数据结构与C语言有很大的不同,C语言不需要考虑存储结构之类的,只需要定义个变量或数组,集中精力于算法之上,而数据结构前期的整体规划和构思非常重要,先确立合理的存储结构,再来编写算法,实际上一旦存储结构确立了,算法的实现相对来说简单很多,难就难在如何确立合理的存储结构。
能够把此次课程设计做出来,是一个很大的挑战,但我经过自己的不懈努力,终于完成了,看着自己的作品,心里还是说不出的高兴,虽然做的过程很艰难。
人生就是要把困难踩在脚下。
7、源程序清单
源代码:
#include
#include
#include
#include
#defineMAX50
#defineS_SIZEsizeof(SchoolNode)
#defineI_SIZEsizeof(ItemNode)
typedefstructSchoolNode
{intschool;//学校编号
chars_name[MAX];//学校名字
intrecord;//项目成绩
structSchoolNode*next;//链域
}SchoolNode;
typedefstruct
{intitem;//项目编号
charitem_name[MAX];//项目名字
SchoolNode*firstschool;//链域指向链表中第一个结点
}Item;
typedefstruct
{intitem_num;//项目总数
Itemitem[MAX];
}AllItems;
typedefstructItemNode
{intitem;//该学校获奖的项目编号
chari_name[MAX];//项目名字
intrecord;//项目成绩
structItemNode*next;//链域
}ItemNode;
typedefstruct
{intschool;//学校编号
charschool_name[MAX];//学校名字
intshool_score;//学校总分
intboys_score;//男团体总分
intgirl_score;//女团体总分
ItemNode*firstitem;//链域指向链表中第一个获奖项目的结点
}SCHNode;
typedefstruct
{intschool_num;//学校总数
SCHNodeschool[MAX];
}AllSchool;
intMenu_Select_One()//菜单界面1
{intselect;
do
{system("color0a");system("cls");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----以下是菜单选项,请选择!
-------(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----1.输入各个项目成绩及信息----(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----2.显示各学校总分----(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----3.信息排序----(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----4.信息查询----(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----5.保存信息到文件----(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----6.从文件中读入信息----(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t\t(^o^)----0.退出系统----(^o^)\n");
printf("\t\t(^o^)--------------------------------------(^o^)\n");
printf("\t请输入要选择的操作(0—):
");
scanf("%d",&select);
}while(select>6||select<0);
returnselect;
}
intMenu_Select_Tow()//菜单界面2
{intselect;
do
{system("colore0");system("cls");
printf("\t\t(^o^)------------------------------------(^o^)\n");
printf("\t\t(^o^)----以下是菜单选项,请选择!
----(^o^)\n");
printf("\t\t(^o^)------------------------------------(^o^)\n");
printf("\t\t(^o^)----1.按学校编号排序----(^o^)\n");
printf("\t\t(^o^)----------------