1运动会分数统计系统课程设计报告数据结构院系:专业:班级:学号:姓名:教师:时间:2一、问题描述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、数据建议输入学校的名称,运动项目的名称等,其余信息学生自行设计;输出形式:有合理的提示,各学校分数为整形;数据的存储结构自行设计。建议运动会的相关数据要存储在数据文件中。3、操作1)可以输入各个项目的前三名或前五名的成绩;2)能统计各学校总分,3)可以按学校编号或名称、学校总分、男女团体总分排序输出;4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。4、要求提供系统菜单,界面友好,提示信息完整。二、系统分析及设计1、需求分析根据运动会分数统计系统的问题分析及设计要求,可以将此系统分为四个模块:信息统计模块、信息输出模块、信息查询模块、信息调用模块。其系统功能结构图如图所示。(1)、信息统计模块实现信息的输入、统计、存档。(2)、信息输出模块实现信息的输出。(3)、信息查询模块实现信息的查询。(4)、信息调用模块实现信息的调用,即从文件中读出信息并输出。32、概要设计此系统采用顺序存储结构存储,定义了一个结构体数组存放参赛学校的信息。之所以采用顺序存储结构,是因为用它来实现信息的存储、查询比较方便,节省时间,效率高,而且也方便把信息写入文件以及读取文件。(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]。采用数组结构有利于随机存储和查询。信息统计模块信息输出模块信息查询模块信息调用模块分数统计信息存档运动会分数统计系统信息输入4(2)、信息统计模块的算法设计说明输入参赛学校比赛成绩的信息时,采用三重循环,第一重循环控制参赛学校的个数,第二重循环控制各参赛学校的参赛项目个数,第三重循环控制各参赛学校的各参赛项目所获得的名次个数,并依次输入相应信息,根据所输入的名次得出相对应的分数。然后分别统计出各学校的总分、男子团体总分和女子团体总分。调用文件数据块写函数fwrite将信息写入文件,方便以后调用。(3)、信息输出模块的算法设计说明根据设计要求,实现按学校名称、学校总分、男子团体总分、女子团体总分输出。因此选用switch语句实现此功能。case1按学校名称输出时,直接取出数据进行输出;case2按学校总分输出时,采用冒泡排序法进行排序然后按分数由高到低输出;case3和case4也均采用冒泡排序法进行排序最后按分数由高到低输出。其流程图如图所示:(4)、信息查询模块的算法设计说明根据设计要求,提供两种不同的查询方式:按学校编号查询和按项目编号查询。因此也采用switch语句实现此功能。case1按学校编号查询,提示输入要查询的学校编号以及要查询的项目编号,直接取出该学校该项目的信息进行输出。case2按项目编号查询,提示输入要查询的项目编号,输出该项目取得名次的学校的信息。开始总分显示菜单界面按学校名称输出按学校总分输出按男团总分输出按女团总分输出退出返回主菜单直接退出本系统主菜单结束输入功能序号5其流程图如图所示:(5)、信息调用模块的算法设计说明信息调用,即读取保存在文件里的信息并输出。由于采用的是数组存储,可以很方便的一下把文件里的信息全部读取出来,再利用三重循环依次把各学校各项目所取得的成绩输出。3、详细设计(1)、信息输入及分数统计功能voidInfoInput()是信息输入及分数统计的函数,在输入信息的同时进行分数统计,可以输入各学校各项目前3名或前5名的成绩。结果取前3名还是前5名由用户自己定。用switch语句将前3名的成绩赋值为5、3、2,前5名的成绩赋值为7、5、3、2、1,未取得的成绩则赋为0。并统计总分、男子团体总分和女子团体总分。其主要功能代码如下:for(m=0;mk;m++)//输入所获名次信息{cout名次:;cins[i].a[j].range[m];if(s[i].a[j].top==3)//匹配各名次对应的分数开始信息查询界面选择查询方式按学校编号查询按项目编号查询退出返回主菜单直接退出本系统主菜单结束6{switch(s[i].a[j].range[m]){case0:s[i].a[j].mark[m]=0;break;case1:s[i].a[j].mark[m]=5;break;case2:s[i].a[j].mark[m]=3;break;case3:s[i].a[j].mark[m]=2;break;}}else{switch(s[i].a[j].range[m]){case0:s[i].a[j].mark[m]=0;break;case1:s[i].a[j].mark[m]=7;break;case2:s[i].a[j].mark[m]=5;break;case3:s[i].a[j].mark[m]=3;break;case4:s[i].a[j].mark[m]=2;break;case5:s[i].a[j].mark[m]=1;break;}}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];//统计男团总分elses[i].Wscore=s[i].Wscore+s[i].a[j].mark[m];//统计女团总分}(2)、信息输出功能voidInfoOutput()是信息输出函数。输出一个总分显示菜单,利用switch语句实现按学校名称输出或按学校总分、男子团体总分、女子团体总分由高到低输出。采用冒泡排序的方法使之按总分由高到低输出。利用循环语句while(1)返回总分显示菜单,break语句终止循环。其主要功能代码如下:for(i=0;iN;i++)//冒泡排序,用辅助数组b[]记住学校结点的下标b[i]=i;for(i=0;iN;i++){for(j=i+1;jN;j++){if(s[b[i]].scores[j].score){k=b[i];b[i]=b[j];b[j]=k;7}}}for(i=0;iN;i++)//输出各学校运动会分数信息{cout学校名称:s[b[i]].schnameendl;cout学校编号:s[b[i]].schnumendl;cout学校总分:s[b[i]].scoreendl;cout男团总分:s[b[i]].Mscoreendl;cout女团总分:s[b[i]].Wscoreendl;coutendl;}(3)、信息查询功能voidInquiry()函数是信息查询函数,显示一个查询菜单,利用switch语句实现按学校编号查询和按项目编号查询,并输出该学校某个项目的情况或某个项目取得前3名或前5名的学校信息。利用循环语句while(1)返回查询菜单,break语句终止循环。其主要功能代码如下:按学校编号查询:cout要查询的学校编号:;cini;if(iN)//学校编号超出范围,输出提示信息cout这个学校没有参加此次运动会!endl;else{cout要查询的项目编号:;cinj;if(jM+W||j==0)//项目编号超出范围,输出提示信息cout此次运动会没有这个项目!endl;else//输出要查询学校项目的成绩{cout这个项目取前s[0].a[j-1].top名,该学校的成绩如下:endl;for(k=0;k5;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]!=0)cout分数:s[i-1].a[j-1].mark[k]endl;}}}按项目编号查询:cout要查询的项目编号:;ciny;8if(yM+W||y==0)//项目编号超出范围,输出提示信息cout此次运动会没有这个项目!endl;else//输出该项目取得名次的学校的成绩{cout该项目取前s[0].a[y-1].top名,取得该名次的学校:endl;for(i=0;jN;i++)for(j=0;j5;j++){if(s[i].a[y-1].range[j]!=0)cout学校名称:s[i].schname学校编号:s[i].schnum名次:s[i].a[y-1].range[j];if(s[i].a[y-1].mark[j]!=0)cout分数:s[i].a[y-1].mark[j]endl;}}三、系统实现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名。测试输出的结果:①按学校名称输出:学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分:10。学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分:17;女团总分:3。②按学校总分输出:学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分:17;女团总分:3。学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分:10。③按男团总分输出:学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分:17;女团总分:3。学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分:10。④按女团总分输出:学校名称:武汉理工大学;学校编号:1;学校总分:11;男团总分:1;女团总分:10。学校名称:湖北经济学院;学校编号:2;学校总分:20;男团总分:17;女团总分:3。9时间复杂度分析:用户输入信息时,采用三重循环进行输入,因此信息输入函数的时间复杂度为O(N*(M+W)*k)。利用冒泡排序法进行排序,采用二重循环,时间复杂度为O(N*N)。采用顺序存储结构,信息存放在数组的相应内存单元里,因此查询函数的时间复杂度为O(1)。写信息时可以一次全部写进去,读信息时也可以一次全