版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、运动会分数统计系统课程设计报告数据结构院系:专业:班级:学号:姓名:教师:时间:1一、问题描述1、功能任务:参加运动会有n 个学校,学校编号为1n。比赛分成m 个男子项目,和w 个女子项目。项目编号为男子1m ,女子 m+1 m+w 。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为: 5、 3、2;哪些取前五名或前三名由学生自己设定。( m=20,n=20 ),按要求实现相应的数据输入、查询、计分等功能。2、数据建议输入学校的名称,运动项目的名称等,其余信息学生自行设计;输出形式:有合理的提示,各学校分数为整形;数据的存储结构自行设计。建议运动会的
2、相关数据要存储在数据文件中。3、操作1)可以输入各个项目的前三名或前五名的成绩;2)能统计各学校总分,3)可以按学校编号或名称、学校总分、男女团体总分排序输出;4)可以按学校编号查询学校某个项目的情况; 可以按项目编号查询取得前三或前五名的学校。4、要求提供系统菜单,界面友好,提示信息完整。二、系统分析及设计1、需求分析根据运动会分数统计系统的问题分析及设计要求, 可以将此系统分为四个模块: 信息统计模块、信息输出模块、信息查询模块、信息调用模块。其系统功能结构图如图所示。( 1)、信息统计模块实现信息的输入、统计、存档。( 2)、信息输出模块实现信息的输出。( 3)、信息查询模块实现信息的查
3、询。( 4)、信息调用模块实现信息的调用,即从文件中读出信息并输出。2运动会分数统计系统信息统计模块信息输出模块信息查询模块信息调用模块信分信息数息输统存入计档2、概要设计此系统采用顺序存储结构存储, 定义了一个结构体数组存放参赛学校的信息。 之所以采用顺序存储结构,是因为用它来实现信息的存储、查询比较方便,节省时间,效率高,而且也方便把信息写入文件以及读取文件。( 1)、结构体定义如下:、定义运动项目数据类型,用于存放运动项目的信息,包括项目名称、项目编号、用户自己定义的取前3 名还是前5 名的积分、名次、分数。typedef structchar proname10;/项目名称int pr
4、onum;/ 项目编号int top;/取前 3 名或前 5 名积分,由用户自己定义int range5;/ 名次int mark5;/ 分数Pronode;/项目结点类型定义、定义学校数据类型,用于存放参赛学校的信息,包括学校名称、学校编号、学校总分、男子团体总分、女子团体总分以及项目数组。typedef structchar schname20;/学校名称int schnum;/ 学校编号int score;/ 总分int Mscore;/男子团体总分int Wscore;/ 女子团体总分Pronode aM+W;/项目数组Schnode;/ 学校结点类型定义、定义一个学校结点类型的结构体
5、数组Schnode sN 。采用数组结构有利于随机存储和查询。3(2 )、信息统计模块的算法设计说明输入参赛学校比赛成绩的信息时,采用三重循环, 第一重循环控制参赛学校的个数,第二重循环控制各参赛学校的参赛项目个数,第三重循环控制各参赛学校的各参赛项目所获得的名次个数, 并依次输入相应信息,根据所输入的名次得出相对应的分数。然后分别统计出各学校的总分、 男子团体总分和女子团体总分。 调用文件数据块写函数 fwrite 将信息写入文件,方便以后调用。( 3 )、信息输出模块的算法设计说明根据设计要求,实现按学校名称、学校总分、男子团体总分、女子团体总分输出。因此选用 switch 语句实现此功能
6、。case 1 按学校名称输出时,直接取出数据进行输出;case 2 按学校总分输出时,采用冒泡排序法进行排序然后按分数由高到低输出;case 3 和 case 4 也均采用冒泡排序法进行排序最后按分数由高到低输出。其流程图如图所示:开始总分显示菜单界面输入功能序号按按按按退直学学男女出接校校团团返退名总总总回出称分分分主本输输输输菜系出出出出单统主菜单结束(4 )、信息查询模块的算法设计说明根据设计要求, 提供两种不同的查询方式:按学校编号查询和按项目编号查询。因此也采用 switch 语句实现此功能。case 1 按学校编号查询,提示输入要查询的学校编号以及要查询的项目编号,直接取出该学校
7、该项目的信息进行输出。case 2 按项目编号查询,提示输入要查询的项目编号,输出该项目取得名次的学校的信息。4其流程图如图所示:开始信息查询界面选择查询方式按按退直学项出接校目返退编编回出号号主本查查菜系询询单统主菜单结束(5 )、信息调用模块的算法设计说明信息调用, 即读取保存在文件里的信息并输出。 由于采用的是数组存储, 可以很方便的一下把文件里的信息全部读取出来,再利用三重循环依次把各学校各项目所取得的成绩输出。3、详细设计(1)、信息输入及分数统计功能void InfoInput() 是信息输入及分数统计的函数,在输入信息的同时进行分数统计,可以输入各学校各项目前 3 名或前 5 名
8、的成绩。结果取前 3 名还是前 5 名由用户自己定。 用 switch 语句将前 3 名的成绩赋值为 5、 3、2,前 5 名的成绩赋值为 7、 5、3、 2、 1,未取得的成绩则赋为 0。并统计总分、男子团体总分和女子团体总分。其主要功能代码如下:for(m=0;mk;m+)/ 输入所获名次信息coutsi.aj.rangem;if(si.aj.top=3)/匹配各名次对应的分数5switch(si.aj.rangem)case 0: si.aj.markm=0; break;case 1: si.aj.markm=5; break;case 2: si.aj.markm=3; break;
9、case 3: si.aj.markm=2; break;elseswitch(si.aj.rangem)case 0: si.aj.markm=0; break;case 1: si.aj.markm=7; break;case 2: si.aj.markm=5; break;case 3: si.aj.markm=3; break;case 4: si.aj.markm=2; break;case 5: si.aj.markm=1; break;si.score=si.score+si.aj.markm; / 统计学校总分 if(j=M-1)si.Mscore=si.Mscore+si.a
10、j.markm;/ 统计男团总分elsesi.Wscore=si.Wscore+si.aj.markm;/ 统计女团总分(2 )、信息输出功能void InfoOutput() 是信息输出函数。输出一个总分显示菜单,利用switch 语句实现按学校名称输出或按学校总分、男子团体总分、 女子团体总分由高到低输出。采用冒泡排序的方法使之按总分由高到低输出。利用循环语句while(1) 返回总分显示菜单,break 语句终止循环。其主要功能代码如下:for(i=0;iN;i+)/冒泡排序,用辅助数组b 记住学校结点的下标bi=i;for(i=0;iN;i+)for(j=i+1;jN;j+)if(sb
11、i.score sj.score)k=bi;bi=bj;bj=k;6couty;按项目编号查询:elseelsecouti;if(iN)coutfor(i=0;iN;i+)/ 输出各学校运动会分数信息cout学校名称: sbi.schnameendl;cout学校编号: sbi.schnumendl;cout学校总分: sbi.scoreendl;cout男团总分: sbi.Mscoreendl;cout女团总分: sbi.Wscoreendl;coutendl;(3 )、信息查询功能void Inquiry() 函数是信息查询函数,显示一个查询菜单,利用switch 语句实现按学校编号查询和
12、按项目编号查询,并输出该学校某个项目的情况或某个项目取得前3 名或前 5 名的学校信息。利用循环语句while(1) 返回查询菜单,break 语句终止循环。其主要功能代码如下:按学校编号查询:要查询的学校编号:;/学校编号超出范围,输出提示信息这个学校没有参加此次运动会 !endl;coutj;if(jM+W | j=0)/项目编号超出范围,输出提示信息cout此次运动会没有这个项目!endl;/ 输出要查询学校项目的成绩cout这个项目取前s0.aj-1.top名,该学校的成绩如下:endl;for(k=0;k5;k+)if(si-1.aj-1.rangek!=0)cout名次: si-1
13、.aj-1.rangek;if(si-1.aj-1.markk!=0)cout分数: si-1.aj-1.markkM+W | y=0)/项目编号超出范围,输出提示信息cout此次运动会没有这个项目!endl;else/输出该项目取得名次的学校的成绩cout该项目取前 s0.ay-1.top名,取得该名次的学校:endl;for(i=0;jN;i+)for(j=0;j5;j+)if(si.ay-1.rangej!=0)cout学校名称: si.schname学校编号:si.schnum名次: si.ay-1.rangej;if(si.ay-1.markj!=0)cout分数: si.ay-1.
14、markjendl;三、系统实现1、完整源代码见附录。2、调试分析运行程序, 进入主菜单界面,用户可以选择输入信息、输出信息、 查询信息、 调用信息、关于或退出系统。测试数据:学校名称:武汉理工大学;学校编号:1;项目名称:男子 100 米;项目编号: 1;取前5 名;获得 1 个名次,第 5 名。项目名称:女子100 米;项目编号:2;取前3 名,获得 3个名次,分别是第 1、 2、 3 名。学校名称:湖北经济学院;学校编号:2;项目名称:男子跳远;项目编号:1;取前 5名,获得 4 个名次,分别是第 1、2、3、 4 名。项目名称:女子跳高;项目编号:2;取前 5名,获得一个名次,第3 名
15、。测试输出的结果:按学校名称输出:学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分: 10。学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分: 17;女团总分: 3。按学校总分输出:学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分: 17;女团总分: 3。学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分: 10。按男团总分输出:学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分: 17;女团总分: 3。学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分: 10。按女团总分输
16、出:学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分: 10。学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分: 17;女团总分: 3。8时间复杂度分析:用户输入信息时,采用三重循环进行输入,因此信息输入函数的时间复杂度为O(N*(M+W ) *k) 。利用冒泡排序法进行排序,采用二重循环,时间复杂度为O( N*N )。采用顺序存储结构,信息存放在数组的相应内存单元里,因此查询函数的时间复杂度为O( 1)。写信息时可以一次全部写进去,读信息时也可以一次全部读出来,因此写文件函数和读文件函数的时间复杂度都为O( 1)。存在问题的思考及算法的改进设想:刚开
17、始运行程序时,就是一句一句的显示,界面很不好看, 于是想把他弄成菜单的形式,但是两个子菜单要实现与主菜单之间的切换,能够自如返回主菜单。开始时没有想到要去直接调用实现主菜单操作的函数 Menu (),废了好大周折,后来问了同学,顿时茅塞顿开。显示的内容堆积在一个屏幕上,看着很混乱,用C 语言里的clrscr() 函数在VC+ 里似乎不能用,上网查了下资料,找到了一个头文件为stdlib.h 的清屏函数system( ”cls”)。调试程序时, 遇到了屏幕一闪又回到原来界面的情况,没有输出想要得到的信息,原来是信息在屏幕上显示后,程序执行到了清屏函数,所以立马清屏了,为了看到输出信息,调用 sy
18、stem( ”pause”)函数,使程序暂停,以让用户看到输出地信息,然后再按任意键继续执行程序。对此程序结构体的定义比较难,要整体考虑全局设置出结构体,这次课设用到结构体的嵌套, 由于对结构体的使用还不是很熟悉,所以做起来时花费了不少时间,但一个课设做下来,还算是得心应手。对于读写文件不是很熟悉, fread 和 fwrite 函数不是很会用,在读出文件里的信息并输出时花了很长时间,不过,最后总算是会用了。3、输出界面运行程序, 进入主菜单界面, 用户可以选择输入信息、 输出信息、 查询信息、 调用信息、关于或退出系统。注意:第一次运行本程序时,请选择输入信息。以后再运行时,为了避免再次输入
19、大量信息, 可以先选择调用信息, 将以前输入的信息重新显示在屏幕上, 再进行后续操作。9主菜单界面如图所示:(1)、输入信息选择 1 号功能进入输入信息模块,根据提示信息将以下信息输入系统中。学校名称:武汉理工大学;学校编号:1;项目名称:男子100 米;项目编号:1;取前5 名;获得 1 个名次,第 5 名。项目名称:女子 100 米;项目编号: 2;取前 3 名,获得 3 个名次,分别是第 1、 2、 3 名。学校名称:湖北经济学院;学校编号:2;项目名称:男子跳远;项目编号:1;取前 5名,获得 4 个名次,分别是第1、2、3、 4 名。项目名称:女子跳高;项目编号:2;取前 5名,获得
20、一个名次,第3 名。输入信息后,信息会自动存档,并自动返回到主菜单。10输入信息如图所示:( 2)、输出信息输入 2 进入总分显示菜单界面。 用户可根据自己喜好选择按学校名称输出、 按学校总分输出、按男团总分输出、按女团总分输出或者退出返回主菜单、直接退出系统。11总分显示菜单界面如图所示:用户可根据自己喜好选择按哪种方式输出, 信息输出后, 按任意键返回总分显示菜单界面。输入 5 则返回主菜单,输入 6 则退出系统。以下是分别按照学校名称、学校总分、男团总分、女团总分输出的情况。按学校名称输出:12按学校总分输出:按男团总分输出:13按女团总分输出:(3 )、查询信息输入 3 进入信息查询界
21、面, 用户可根据自己喜好选择按学校编号查询、 按项目编号查询或者退出返回主菜单、直接退出系统。信息查询界面如图所示:用户可根据自己喜好选择按哪种方式查询,查询结束后,按任意键返回信息查询界面。输入 3 则返回主菜单, 输入 4 则退出系统。 以下是分别按照学校编号、项目编号查询的情况。14按学校编号查询:按项目编号查询:(4 )、调用信息为了避免每次运行程序时都要输入大量数据, 在第一次运行程序后, 就已经将信息自动存档,再次运行时,可以先直接调用信息,按任意键返回主菜单,再进行后续操作。15调用的信息如图所示:( 5 )关于界面自行设计( 6 )退出系统输入 6 则退出系统,并有中文提示。如
22、图所示:16四、设计总结在课程设计的过程中,虽然遇到了很多问题, 但最终差不多也都一一解决了。有的时候是一些很小的逻辑错误,需要的是细心。 同学之间互相帮助, 多个人思考多个力量,遇到自己解决不了的问题, 向同学求助, 能更好的帮我们解决所面临的难题。由于此次课程设计用到数据文件的知识, 而这些知识老师都没讲, 自学起来稍微有点困难,但也不是完全看不懂,只是对一些函数的应用不太熟悉,经过此次课程设计, 对文件的读写有了更深的了解,也相应的培养了我的自学能力。经过 C 语言和数据结构的学习,我发现数据结构与C 语言有很大的不同,C 语言不需要考虑存储结构之类的,只需要定义个变量或数组,集中精力于
23、算法之上, 而数据结构前期的整体规划和构思非常重要, 先确立合理的存储结构,再来编写算法, 实际上一旦存储结构确立了,算法的实现相对来说简单很多,难就难在如何确立合理的存储结构。能够把此次课程设计做出来,是一个很大的挑战, 但我经过自己的不懈努力,终于完成了,看着自己的作品,心里还是说不出的高兴,虽然做的过程很艰难。人生就是要把困难踩在脚下。附录:源代码:# include # include # include # define M 1/ 男子项目个数# define W 1/ 女子项目个数# define N 2/ 学校个数# define NULL 0void Menu();/ 函数声明
24、typedef structchar proname10;/项目名称int pronum;/项目编号int top;/取前 3 名或前 5 名积分,由用户自己定义int range5;/名次int mark5;/ 分数Pronode;/ 项目结点类型定义typedef structchar schname20;/ 学校名称int schnum;/学校编号17int score;/ 总分int Mscore;/ 男团体总分int Wscore;/ 女团体总分Pronode aM+W;/项目数组Schnode;/学校结点类型定义Schnode sN;/ 定义一个学校结点类型的结构体数组void H
25、ead()/ 头菜单界面cout*endl;cout*欢迎使用*endl;cout*运动会分数统计系统*endl;cout*endl;coutendl;void MainMenu()/ 主菜单界面cout*endl;cout*主菜单*endl;cout*endl;cout*1.输入信息*endl;cout*2.输出信息*endl;cout*3.查询信息*endl;cout*4.调用信息*endl;cout*5.关于*endl;cout*6.退出系统*endl;cout*endl;cout*注:第一次运行本程序时请选择1 号功能 *endl;cout*endl;void SubMenu()/ 总
26、分显示菜单界面cout*endl;cout*运动会总分显示菜单*endl;cout*endl;cout*1.按学校名称输出*endl;cout*2.按学校总分输出*endl;cout*3.按男团总分输出*endl;cout*4.按女团总分输出*endl;cout*5.退出返回主菜单*endl;cout*6.直接退出本系统*endl;18cout*endl;void InitSch()/ 初始化信息int i;for(i=0;iN;i+)si.score=0;si.Mscore=0;si.Wscore=0;void InfoInput()/信息输入模块int i,j,k,m;InitSch();
27、/ 初始化信息for(i=0;iN;i+)/ 输入学校信息coutsi.schname;coutsi.schnum;for(j=0;jM+W;j+)/输入各学校内项目信息name;num;coutsi.aj.top;coutk;for(m=0;m5;m+)/初始化排名和分数si.aj.rangem=0;si.aj.markm=0;for(m=0;mk;m+)/ 输入所获名次信息coutsi.aj.rangem;if(si.aj.top=3)/ 匹配各名次对应的分数19switch(si.aj.rangem)case 0: si.aj.mark
28、m=0; break;case 1: si.aj.markm=5; break;case 2: si.aj.markm=3; break;case 3: si.aj.markm=2; break;elseswitch(si.aj.rangem)case 0: si.aj.markm=0; break;case 1: si.aj.markm=7; break;case 2: si.aj.markm=5; break;case 3: si.aj.markm=3; break;case 4: si.aj.markm=2; break;case 5: si.aj.markm=1; break;si.s
29、core=si.score+si.aj.markm; / 统计学校总分 if(j=M-1)si.Mscore=si.Mscore+si.aj.markm;/ 统计男团总分elsesi.Wscore=si.Wscore+si.aj.markm;/ 统计女团总分coutendl;void Output(int b)/ 输出各学校运动会分数信息int i;for(i=0;iN;i+)cout学校名称: sbi.schnameendl;cout学校编号: sbi.schnumendl;cout学校总分: sbi.scoreendl;cout男团总分: sbi.Mscoreendl;cout女团总分:
30、sbi.Wscoreendl;coutendl;20system(pause);/ 程序暂停,以显示结果system(cls);/清屏void InfoOutput()/信息输出模块FILE *fp;int number,i,j,k,bN;if(fp=fopen(sport.txt,r)=NULL)/以读方式打开文本文件/ 并判定能否正常打开cout文件打不开 !endl;/ 不能正常打开文件的处理exit(0);/调用函数exit 终止程序运行while(1)Head();/头菜单界面SubMenu();/总分显示菜单界面coutnumber;switch(number)case 1:/按学
31、校名称输出system(cls);Head();/ 头菜单界面cout运动会各学校信息按学校名称输出如下:endl;for(i=0;iN;i+)/输出各学校运动会分数信息cout学校名称: si.schnameendl;cout学校编号: si.schnumendl;cout学校总分: si.scoreendl;cout男团总分: si.Mscoreendl;cout女团总分: si.Wscoreendl;coutendl;system(pause);/ 程序暂停,以显示结果system(cls);/ 清屏break;case 2:/ 按学校总分输出system(cls);Head();/头菜
32、单界面cout运动会各学校信息按学校总分输出如下:endl;for(i=0;iN;i+)/冒泡排序,用辅助数组记住学校结点的下标bi=i;21for(i=0;iN;i+)for(j=i+1;jN;j+)if(sbi.score sj.score)k=bi;bi=bj;bj=k;Output(b);/按所记下标的顺序输出各学校运动会分数信息break;case 3:/ 按男团总分输出system(cls);Head();cout运动会各学校信息按男团总分输出如下:endl;for(i=0;iN;i+)/冒泡排序, 用辅助数组记住学校结点的下标bi=i;for(i=0;iN;i+)for(j=i+
33、1;jN;j+)if(sbi.Mscore sj.Mscore)k=bi;bi=bj;bj=k;Output(b);/按所记下标的顺序输出各学校运动会分数信息break;case 4:/ 按女团总分输出system(cls);Head();cout运动会各学校信息按女团总分输出如下:endl;for(i=0;iN;i+)/冒泡排序,用辅助数组记住学校结点的下标bi=i;for(i=0;iN;i+)for(j=i+1;jN;j+)22if(sbi.Wscore sj.Wscore)k=bi;bi=bj;bj=k;Output(b);/ 按所记下标的顺序输出各学校运动会分数信息break;case
34、 5:/退出返回主菜单system(cls);Menu();break;case 6:/退出系统exit(0);default:cout 对不起,无此功能,请输入正确的功能序号 !endl; system(pause);system(cls);InfoOutput();break;fclose(fp);/ 关闭文件void BMenu()/信息查询界面cout*endl;cout*1.按学校编号查询*endl;cout*2.按项目编号查询*endl;cout*3.退出返回主菜单*endl;cout*4.直接退出本系统*endl;cout*endl;void Inquiry()/信息查询模块int number,i,j,k,y;while(1)Head();BMenu();23coutnumber;switch(number)case 1:/按学校编号查询system(cls);Head();couti;if(iN)/学校编号超出范围,输出提示信息cout这个学校没有参加此次运动会!endl;elsecoutj;if(jM+W | j=0)/项目编号超出范围,输出提示信息cout此次运动会没有这个项目!endl;else/输出要查询学校项目的成绩cout这个项目取前s0.aj-1.top名,该学校的成绩如下: endl;for(k=0;k5;k+)if
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年重庆城市职业学院单招(计算机)考试参考题库附答案
- 2026年郑州智能科技职业学院单招(计算机)测试备考题库附答案
- 2026年新疆哈密地区单招职业适应性考试题库及完整答案详解1套
- 2026年陕西国防工业职业技术学院单招(计算机)测试备考题库附答案
- 2026年贵阳职业技术学院单招职业倾向性测试题库及参考答案详解1套
- 2026年安顺职业技术学院单招职业倾向性考试题库及答案详解一套
- 2026年开封大学单招职业适应性测试题库及参考答案详解
- 2026年辽阳职业技术学院单招职业倾向性考试题库及参考答案详解
- 2026年福州英华职业学院单招职业适应性测试模拟测试卷附答案
- 2026年山东服装职业学院单招职业技能考试题库参考答案详解
- 2025年教师职称考试(学前教育)(幼儿园)综合能力测试题及答案
- 模具配件专业知识培训课件
- 山东省青岛市市南区2023-2024学年八上期末数学试题(解析版)
- 2025年政府采购评审专家考试题库含答案
- 2023年天津市和平区中考二模语文试题(含答案解析)
- 2025年高考化学真题分类汇编专题13 工艺流程综合题(原卷版)
- 瓦斯抽放课件
- 2025年经济学专业题库- 政府管制与市场自由竞争
- 沉井作业安全培训课件
- 肉毒素考试题及答案解析
- GJB939A-2022外购器材的质量管理
评论
0/150
提交评论