运动会分数统计系统课程设计报告Word文件下载.docx
- 文档编号:21486647
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:28
- 大小:99.55KB
运动会分数统计系统课程设计报告Word文件下载.docx
《运动会分数统计系统课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《运动会分数统计系统课程设计报告Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
4)可以按学校编号查询学校某个项目的情况;
可以按项目编号查询取得前三或前五名的学校。
4、要求
提供系统菜单,界面友好,提示信息完整。
二、系统分析及设计
1、需求分析
根据运动会分数统计系统的问题分析及设计要求,可以将此系统分为四个模块:
信息统计模块、信息输出模块、信息查询模块、信息调用模块。
其系统功能结构图如图所示。
(1)、信息统计模块实现信息的输入、统计、存档。
(2)、信息输出模块实现信息的输出。
(3)、信息查询模块实现信息的查询。
(4)、信息调用模块实现信息的调用,即从文件中读出信息并输出。
2、概要设计
此系统采用顺序存储结构存储,定义了一个结构体数组存放参赛学校的信息。
之所以采用顺序存储结构,是因为用它来实现信息的存储、查询比较方便,节省时间,效率高,而且也方便把信息写入文件以及读取文件。
(1)、结构体定义如下:
①、定义运动项目数据类型,用于存放运动项目的信息,包括项目名称、项目编号、用户自己定义的取前3名还是前5名的积分、名次、分数。
typedefstruct
{
charproname[10];
//项目名称
intpronum;
//项目编号
inttop;
//取前3名或前5名积分,由用户自己定义
intrange[5];
//名次
intmark[5];
//分数
}Pronode;
//项目结点类型定义
②、定义学校数据类型,用于存放参赛学校的信息,包括学校名称、学校编号、学校总分、男子团体总分、女子团体总分以及项目数组。
typedefstruct
charschname[20];
//学校名称
intschnum;
//学校编号
intscore;
//总分
intMscore;
//男子团体总分
intWscore;
//女子团体总分
Pronodea[M+W];
//项目数组
}Schnode;
//学校结点类型定义
③、定义一个学校结点类型的结构体数组Schnodes[N]。
采用数组结构有利于随机存储和查询。
(2)、信息统计模块的算法设计说明
输入参赛学校比赛成绩的信息时,采用三重循环,第一重循环控制参赛学校的个数,第二重循环控制各参赛学校的参赛项目个数,第三重循环控制各参赛学校的各参赛项目所获得的名次个数,并依次输入相应信息,根据所输入的名次得出相对应的分数。
然后分别统计出各学校的总分、男子团体总分和女子团体总分。
调用文件数据块写函数fwrite将信息写入文件,方便以后调用。
(3)、信息输出模块的算法设计说明
根据设计要求,实现按学校名称、学校总分、男子团体总分、女子团体总分输出。
因此选用switch语句实现此功能。
case1按学校名称输出时,直接取出数据进行输出;
case2按学校总分输出时,采用冒泡排序法进行排序然后按分数由高到低输出;
case3和case4也均采用冒泡排序法进行排序最后按分数由高到低输出。
其流程图如图所示:
(4)、信息查询模块的算法设计说明
根据设计要求,提供两种不同的查询方式:
按学校编号查询和按项目编号查询。
因此也采用switch语句实现此功能。
case1按学校编号查询,提示输入要查询的学校编号以及要查询的项目编号,直接取出该学校该项目的信息进行输出。
case2按项目编号查询,提示输入要查询的项目编号,输出该项目取得名次的学校的信息。
(5)、信息调用模块的算法设计说明
信息调用,即读取保存在文件里的信息并输出。
由于采用的是数组存储,可以很方便的一下把文件里的信息全部读取出来,再利用三重循环依次把各学校各项目所取得的成绩输出。
3、详细设计
(1)、信息输入及分数统计功能
voidInfoInput()是信息输入及分数统计的函数,在输入信息的同时进行分数统计,可以输入各学校各项目前3名或前5名的成绩。
结果取前3名还是前5名由用户自己定。
用switch语句将前3名的成绩赋值为5、3、2,前5名的成绩赋值为7、5、3、2、1,未取得的成绩则赋为0。
并统计总分、男子团体总分和女子团体总分。
其主要功能代码如下:
for(m=0;
m<
k;
m++)//输入所获名次信息
cout<
<
"
名次:
;
cin>
>
s[i].a[j].range[m];
if(s[i].a[j].top==3)//匹配各名次对应的分数
switch(s[i].a[j].range[m])
{
case0:
s[i].a[j].mark[m]=0;
break;
case1:
s[i].a[j].mark[m]=5;
case2:
s[i].a[j].mark[m]=3;
case3:
s[i].a[j].mark[m]=2;
}
}
else
{
s[i].a[j].mark[m]=7;
case4:
case5:
s[i].a[j].mark[m]=1;
}
s[i].score=s[i].score+s[i].a[j].mark[m];
//统计学校总分
if(j<
=M-1)
s[i].Mscore=s[i].Mscore+s[i].a[j].mark[m];
//统计男团总分
s[i].Wscore=s[i].Wscore+s[i].a[j].mark[m];
//统计女团总分
(2)、信息输出功能
voidInfoOutput()是信息输出函数。
输出一个总分显示菜单,利用switch语句实现按学校名称输出或按学校总分、男子团体总分、女子团体总分由高到低输出。
采用冒泡排序的方法使之按总分由高到低输出。
利用循环语句while
(1)返回总分显示菜单,break语句终止循环。
for(i=0;
i<
N;
i++)//冒泡排序,用辅助数组b[]记住学校结点的下标
b[i]=i;
i++)
for(j=i+1;
j<
j++)
if(s[b[i]].score<
s[j].score)
k=b[i];
b[i]=b[j];
b[j]=k;
i++)//输出各学校运动会分数信息
cout<
学校名称:
s[b[i]].schname<
endl;
学校编号:
s[b[i]].schnum<
学校总分:
s[b[i]].score<
男团总分:
s[b[i]].Mscore<
女团总分:
s[b[i]].Wscore<
}
(3)、信息查询功能
voidInquiry()函数是信息查询函数,显示一个查询菜单,利用switch语句实现按学校编号查询和按项目编号查询,并输出该学校某个项目的情况或某个项目取得前3名或前5名的学校信息。
利用循环语句while
(1)返回查询菜单,break语句终止循环。
按学校编号查询:
要查询的学校编号:
cin>
i;
if(i>
N)//学校编号超出范围,输出提示信息
这个学校没有参加此次运动会!
else
要查询的项目编号:
j;
if(j>
M+W||j==0)//项目编号超出范围,输出提示信息
cout<
此次运动会没有这个项目!
else//输出要查询学校项目的成绩
这个项目取前"
s[0].a[j-1].top<
名,该学校的成绩如下:
for(k=0;
k<
5;
k++)
if(s[i-1].a[j-1].range[k]!
=0)
cout<
s[i-1].a[j-1].range[k];
if(s[i-1].a[j-1].mark[k]!
分数:
s[i-1].a[j-1].mark[k]<
按项目编号查询:
y;
if(y>
M+W||y==0)//项目编号超出范围,输出提示信息
else//输出该项目取得名次的学校的成绩
该项目取前"
s[0].a[y-1].top<
名,取得该名次的学校:
for(i=0;
for(j=0;
if(s[i].a[y-1].range[j]!
s[i].schname<
学校编号:
s[i].schnum<
名次:
s[i].a[y-1].range[j];
if(s[i].a[y-1].mark[j]!
分数:
s[i].a[y-1].mark[j]<
三、系统实现
1、完整源代码
见附录。
2、调试分析
运行程序,进入主菜单界面,用户可以选择输入信息、输出信息、查询信息、调用信息、关于或退出系统。
测试数据:
学校名称:
武汉理工大学;
学校编号:
1;
项目名称:
男子100米;
项目编号:
取前5名;
获得1个名次,第5名。
女子100米;
2;
取前3名,获得3个名次,分别是第1、2、3名。
湖北经济学院;
男子跳远;
取前5名,获得4个名次,分别是第1、2、3、4名。
女子跳高;
取前5名,获得一个名次,第3名。
测试输出的结果:
①按学校名称输出:
学校总分:
11;
男团总分:
女团总分:
10。
20;
17;
3。
②按学校总分输出:
③按男团总分输出:
④按女团总分输出:
时间复杂度分析:
用户输入信息时,采用三重循环进行输入,因此信息输入函数的时间复杂度为O(N*(M+W)*k)。
利用冒泡排序法进行排序,采用二重循环,时间复杂度为O(N*N)。
采用顺序存储结构,信息存放在数组的相应内存单元里,因此查询函数的时间复杂度为O
(1)。
写信息时可以一次全部写进去,读信息时也可以一次全部读出来,因此写文件函数和读文件函数的时间复杂度都为O
(1)。
存在问题的思考及算法的改进设想:
①刚开始运行程序时,就是一句一句的显示,界面很不好看,于是想把他弄成菜单的形式,但是两个子菜单要实现与主菜单之间的切换,能够自如返回主菜单。
开始时没有想到要去直接调用实现主菜单操作的函数Menu(),废了好大周折,后来问了同学,顿时茅塞顿开。
②显示的内容堆积在一个屏幕上,看着很混乱,用C语言里的clrscr()函数在VC++里似乎不能用,上网查了下资料,找到了一个头文件为stdlib.h的清屏函数system(”cls”)。
③调试程序时,遇到了屏幕一闪又回到原来界面的情况,没有输出想要得到的信息,原来是信息在屏幕上显示后,程序执行到了清屏函数,所以立马清屏了,为了看到输出信息,调用system(”pause”)函数,使程序暂停,以让用户看到输出地信息,然后再按任意键继续执行程序。
④对此程序结构体的定义比较难,要整体考虑全局设置出结构体,这次课设用到结构体的嵌套,由于对结构体的使用还不是很熟悉,所以做起来时花费了不少时间,但一个课设做下来,还算是得心应手。
⑤对于读写文件不是很熟悉,fread和fwrite函数不是很会用,在读出文件里的信息并输出时花了很长时间,不过,最后总算是会用了。
3、输出界面
注意:
第一次运行本程序时,请选择输入信息。
以后再运行时,为了避免再次输入大量信息,可以先选择调用信息,将以前输入的信息重新显示在屏幕上,再进行后续操作。
主菜单界面如图所示:
(1)、输入信息
选择1号功能进入输入信息模块,根据提示信息将以下信息输入系统中。
输入信息后,信息会自动存档,并自动返回到主菜单。
输入信息如图所示:
(2)、输出信息
输入2进入总分显示菜单界面。
用户可根据自己喜好选择按学校名称输出、按学校总分输出、按男团总分输出、按女团总分输出或者退出返回主菜单、直接退出系统。
总分显示菜单界面如图所示:
用户可根据自己喜好选择按哪种方式输出,信息输出后,按任意键返回总分显示菜单界面。
输入5则返回主菜单,输入6则退出系统。
以下是分别按照学校名称、学校总分、男团总分、女团总分输出的情况。
按学校名称输出:
按学校总分输出:
按男团总分输出:
按女团总分输出:
(3)、查询信息
输入3进入信息查询界面,用户可根据自己喜好选择按学校编号查询、按项目编号查询或者退出返回主菜单、直接退出系统。
信息查询界面如图所示:
用户可根据自己喜好选择按哪种方式查询,查询结束后,按任意键返回信息查询界面。
输入3则返回主菜单,输入4则退出系统。
以下是分别按照学校编号、项目编号查询的情况。
(4)、调用信息
为了避免每次运行程序时都要输入大量数据,在第一次运行程序后,就已经将信息自动存档,再次运行时,可以先直接调用信息,按任意键返回主菜单,再进行后续操作。
调用的信息如图所示:
(5)关于界面自行设计
(6)退出系统
输入6则退出系统,并有中文提示。
如图所示:
四、设计总结
在课程设计的过程中,虽然遇到了很多问题,但最终差不多也都一一解决了。
有的时候是一些很小的逻辑错误,需要的是细心。
同学之间互相帮助,多个人思考多个力量,遇到自己解决不了的问题,向同学求助,能更好的帮我们解决所面临的难题。
由于此次课程设计用到数据文件的知识,而这些知识老师都没讲,自学起来稍微有点困难,但也不是完全看不懂,只是对一些函数的应用不太熟悉,经过此次课程设计,对文件的读写有了更深的了解,也相应的培养了我的自学能力。
经过C语言和数据结构的学习,我发现数据结构与C语言有很大的不同,C语言不需要考虑存储结构之类的,只需要定义个变量或数组,集中精力于算法之上,而数据结构前期的整体规划和构思非常重要,先确立合理的存储结构,再来编写算法,实际上一旦存储结构确立了,算法的实现相对来说简单很多,难就难在如何确立合理的存储结构。
能够把此次课程设计做出来,是一个很大的挑战,但我经过自己的不懈努力,终于完成了,看着自己的作品,心里还是说不出的高兴,虽然做的过程很艰难。
人生就是要把困难踩在脚下。
附录:
源代码:
#include<
stdio.h>
stdlib.h>
iostream.h>
#defineM1//男子项目个数
#defineW1//女子项目个数
#defineN2//学校个数
#defineNULL0
voidMenu();
//函数声明
//取前3名或前5名积分,由用户自己定义
//男团体总分
//女团体总分
Schnodes[N];
//定义一个学校结点类型的结构体数组
voidHead()//头菜单界面
*************************************************"
*****欢迎使用*****"
*****运动会分数统计系统*****"
voidMainMenu()//主菜单界面
*****主菜单*****"
*****1.输入信息*****"
*****2.输出信息*****"
*****3.查询信息*****"
*****4.调用信息*****"
*****5.关于*****"
*****6.退出系统*****"
*****注:
第一次运行本程序时请选择1号功能*****"
voidSubMenu()//总分显示菜单界面
*****运动会总分显示菜单*****"
*****1.按学校名称输出*****"
*****2.按学校总分输出*****"
*****3.按男团总分输出*****"
*****4.按女团总分输出*****"
*****5.退出返回主菜单*****"
*****6.直接退出本系统*****"
voidInitSch()//初始化信息
inti;
s[i].score=0;
s[i].Mscore=0;
s[i].Wscore=0;
voidInfoInput()//信息输入模块
inti,j,k,m;
InitSch();
//初始化信息
i++)//输入学校信息
cin>
s[i].schname;
s[i].schnum;
M+W;
j++)//输入各学校内项目信息
{
cout<
项目名称:
cin>
s[i].a[j].proname;
cou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运动会 分数 统计 系统 课程设计 报告