一、题目1.运动会分数统计系统。为了简便地对运动会的报名、成绩的录入和统计,本组设计开发了本系统,以解决需求。当然,本系统只是一个较为简单的系统,仍然存在着一些操作上以及显示上的问题,本组将在以后的学习中进行完善。问题描述:参加运动会有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)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。输出形式:有中文提示,各学校分数为整形;界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。1.需求分析(1)功能需求本系统主要是运动会分数统计方案设计。运动会分数统计方案适合采用结构体数组,为了实现系统功能,主要应实现以下几部分:比赛成绩输入、比赛成绩输出、查询比赛成绩。(2)数据需求需要输入学校编号,项目编号,取得的名次,以及哪些名次。(3)性能需求本程序在运行期间,为了避免在运行大量数据时不会出错,并且能够在很短的时间内将运行结果稳定输出,就需要系统达到安全性能好,可靠性高,稳定性强,处理数据迅速等特点。2.总体设计(1)系统设计方案本课设要求输入信息,统计分数,执行排序与查找功能,在要求中没有在建立数据之后进行插入和删除操作,而在排序和查找过程中有许多的随机读取数据操作,因此使用顺序结构而不用链表。由于各个要求属性具有一定的联系,在定义数据时使用结构体和结构体数组来存储信息数据。考虑到程序的要求在设计函数时将学校个数和项目个数设计为可变的数据,为方便使用设计菜单函数(menu),而由于要求将信息存储在文件中故设计文件的存储(savetofile)与读取函数(readfromfile),信息输入函数(input)在输入基本信息后由系统统计总分的内容并全部存入文件file中,在接下来的函数中开始都需要读取文件中的信息,信息的输出(output)输出输入函数中统计后的各项信息,在排序输出(sortput)中使用冒泡排序法进行不同关键字的排序,查询函数(search)采用顺序表的查找来完成。(2)功能模块设计根据分析整个系统主要划分为5个功能模块,分别执行要求中的功能。该系统分为信息输入、统计输出、排序输出、信息查询和退出。排序输出模块有四个子模块,分别是:按学校编号输出模块、按学校总分输出模块、按男团总分输出模块和按女团总分输出模块;信息查询模块分为按学校编号查询和按项目编号查询两个子模块。功能模块图如图1所示。运动会分数统计系统信息输入统计输出排序输出信息查询退出按学校编号输出按学校总分输出按男团总分输出按女团总分输出统计输出统计输出图1功能模块图3、详细设计(1)项目数据表:运动会系统先制定本次运动会所需的参赛项目。本数据表根据要求设计存储每个项目的编号、要取的名次、各个名次名称及各名次对应的分数。用于对以后项目情况的统计已及查询。其中inum,top,range由输入信息输入,而mark有range和top决定。typedefstruct{intinum;/*项目编号*/inttop;/*取名次的数目*/intrange[5];/*名次*/intmark[5];/*分数*/}itemnode;/*存放项目信息*/(2)学校数据表:本数据表根据要求储存了各个参赛学校的总体情况,包括学校的编号、学校总分、男子团体总分、女子团体总分,并且包括项目数据数组t[n]。其中snum和t[n]中部分数据由输入信息输入,而其他三项内容score,mscore,wscore将由系统进行自动统计。typedefstruct{intsnum;/*学校编号*/intscore;/*学校总分*/intmscore;/*男团体总分*/intwscore;/*女团体总分*/itemnodet[M+W];/*项目数组*/}snode;/*存放学校信息*/snodea[N];/*定义一个学校数组*/这两个数据表相关联接,a[n]中包括t[n],形成一个整体。(3)模块划分1、Voidmenu(intn,intm,intw)功能是提供界面窗口2、Voidsavetofile()功能是保存输入的运动会信息到file文件3、Voidreadfromfile()功能是从file文件中读取运动会信息4、Voidinput(intn,intm,intw)功能是输入信息并统计5、Voidoutput(intn,intm,intw)功能是按学校、项目输出统计信息6、Voidsortput(intn,intm,intw)功能是按四种方法排序并输出结果7、Voidsearch(intn,intm,intw)功能是按两种方法查询并输出结果mainmenusortputoutputinputsearchreadfromfilereadfromfilereadfromfilesavetofile图2函数调用关系图(4)设计流程图此模块定义变量i,j,k,s;先初始化储存分数的数组各元素,for循环实现各学校信息的输入,包括学校编号、项目编号、取前3名or前5名、获得几个名次,使用switch语句实现对输入的各个名次赋予对应的分数。图3输入信息流程图开始Inti,j,s,k,q=0ini++输入学校编号jm+w输入项目编号、名次个数j++sk输入所获名次s++初始化分数a[i].t[j].top==3case1case2case3a[i].t[j].mark[s]=5a[i].t[j].mark[s]=3a[i].t[j].mark[s]=2case1case2case3case4case5a[i].t[j].mark[s]=7a[i].t[j].mark[s]=5a[i].t[j].mark[s]=3a[i].t[j].mark[s]=2a[i].t[j].mark[s]=1记学校、男团、女团总分返回主菜单结束用For循环重新选择YYYYNNNYYYYYNNNNN开始Inti,j,s,q=0in输入学校,编号,男团、女团总分Jm+wi++j++输入项目编号,所取名次数量S5输入名次,分数S++是否返回统计已结束结束YNYNYNYN图4统计输出流程图开始输入要实现功能的编号case1case2case3case4按学校编号输出按学校总分输出按男团总分输出按女团总分输出返回主菜单结束YNYNYNYN图5排序输出流程图开始输入要实现功能的编号case1case2查找学校编号查找项目编号YNY输出该学校成绩返回主菜单结束图6查找输出流程图开始输入学校、男子项目、女子项目个数调用menu(n,w,m)case1case2case3case4调用input调用output调用sortput调用searchcase0退出系统结束YNYNNNYYNY图7主函数调用流程图4、调试分析与测试结果1、由于刚开始程序比较简单,虽能运行,但处理错误的能力很低,后来经过反复的添加修改,使程序能处理了错误,提高了健壮性。2、开始编时由于不太规范,编译出错后由于程序长,很难找到错误,后来规范了格式,错误容易找到了,以后编程要规范。3、算法的时空分析:线性表使用的是顺序结构,各种算法的时间复杂度相对比较合理。4、本程序相对来说比较容易看明白,其中涉及到的一些函数相对来说比较容易。通过调试,运行,基本上达到了要求,但还存在一些缺点。如:不够人性化等。(1)测试数据测试取学校个数为2,男子项目个数2.女子项目个数1。项目学校项目1(男)项目2(男)项目1(女)取前3取前5取前31名次31、522名次12、433名次231(2)测试结果1.主菜单界面2.信息输入运行测试a)信息输入b)输入完成3.统计输出运行测试4.排序输出运行测试1—按学校编号输出,2—按学校总分输出,3—按男团总分输出,4—按女团总分输出。5.信息查询运行测试6.退出系统运行测试5、程序代码#includestdio.h#includemath.h#includeprocess.h#defineN20/*学校最大数目*/#defineM20/*男子项目最大数目*/#defineW20/*女子项目最大数目*/typedefstruct{intinum;/*项目编号*/inttop;/*取名次的数目*/intrange[5];/*名次*/intmark[5];/*分数*/}itemnode;/*存放项目信息*/typedefstruct{intsnum;/*学校编号*/intscore;/*学校总分*/intmscore;/*男团体总分*/intwscore;/*女团体总分*/itemnodet[M+W];/*项目数组*/}snode;/*存放学校信息*/snodea[N];/*定义一个学校数组*/voidmenu(intn,intm,intw)/*菜单函数*/{intc;voidinput(intn,intm,intw);voidoutput(intn,intm,intw);voidsortput(intn,intm,intw);voidsearch(intn,intm,intw);printf(\t\t\t欢迎使用\t\t\t\t\n\n);printf(\t***********运动会分数统计系统***********\n\n);printf(\t\t*******1.信息输入*******\n);printf(\t\t*******2.统计输出*******\n);printf(\t\t*******3.排序输出*******\n);printf(\t\t*******4.信息查询*******\n);printf(\t\t*******0.退出系统*******\n\n);printf(=======================================================\n\n);printf(请选择要实现步骤的编号(0--4):);scanf(%d,&c);switch(c){case1:input(n,m,w);break;case2:output(n,m,w);break;case3:sortput(n,m,w);break;case4:search(n,m,w);break;case0:printf(谢谢使用,再见!\n);exit(0);default:printf(输入错误,请重试!\n);menu(n,m,w);}}voidsavetofile()/*信息存入文件file*/{FILE*fp;inti;if((fp=fopen(G:\\file.txt,w))==NULL){printf(cannotopenthefile\n);return;}for(i=0;iN;i++){if(a[i].snum!='\0')if(fwrite(&a[i],sizeof(snode),1,fp)!=1){printf(filewriteerror\n);return;}}fclose(fp);}voidreadfromfile()/*信息从文件file中取出*/{inti;FILE*fp;if((fp=fopen(G:\\file1.txt,r))==NULL){printf(cannotopenthefile\n);exit(1);}for(i=0;iN;i++)fread(&a[i],sizeof(snode),1,fp);f