运动会分数统计系统一、需求分析为了简便地对运动会的报名、成绩的录入和统计,本组设计开发了本系统,以解决需求。当然,本系统只是一个较为简单的系统,仍然存在着一些操作上以及显示上的问题,本组将在以后的学习中进行完善。问题描述:参加运动会有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.本系统的流程图如下:2.本系统采用的存储结构为结构化设计理念,这是数据库的最基本的设计要求,主要包括三个数据表:(1)项目数据表:运动会开始前必须详细制定本次运动会所需的参赛项目为接下来报名、场地的准备提供依据。本数据表根据要求设计存储每个项目的编号、名称、要取的名次以及各个名次对应的学校的编号,在初始输入时仅输入项目编号、名称及要取的名次,而各名次对应的学校编号将由系统自动统计。这也有利于以后项目情况的查询。typedefstruct{intitemnum;//项目编号inttop;//取名次的数目intrange[5];//名次intmark[5];//分数}itemnode;//定义项目结点的类型YNNNYCase1Case3NYYY开始---初始化输入输入某项目各名次成绩输入学校及男女项目范围继续输入查询各学校成绩Case2查询团体总分成绩查询输出查询学校成绩继续结束—退出继续(2)学校数据表:本数据表储存了各个参赛学校的总体情况,包括学校的编号、名称、男子团体总分、女子团体总分和学校总分。其中学校编号和名称是提前输入的,而其他三项内容将由系统进行自动统计。typedefstruct{intschoolnum;//学校编号intscore;//学校总分intmscore;//男团体总分intwscore;//女团体总分itemnodec[m+w];//项目数组}headnode;//定义头结点类型(3)单项数据表:本数据表是对各个学校的报名情况及成绩进行汇总,为了操作方便,本数据表只包含了学校的编号、项目的编号以及其在比赛中的成绩。typedefstruct/*单项成绩*/{intschoolnum;/*学校编号*/intitemnum;/*项目编号*/intxmch;/*项目成绩*/}danx;danxdx[Y];这三个数据表之间由项目编号和学校编号进行相关联接,形成一个整体。三、详细设计源代码:#includestdio.h#includemath.h#includeconio.h#includeprocess.h#definen2//学校数目#definem1//男子项目数目#definew1//女子项目数目#definenull0typedefstruct{intitemnum;//项目编号inttop;//取名次的数目intrange[5];//名次intmark[5];//分数}itemnode;//定义项目结点的类型typedefstruct{intschoolnum;//学校编号intscore;//学校总分intmscore;//男团体总分intwscore;//女团体总分itemnodec[m+w];//项目数组}headnode;//定义头结点类型headnodeh[n];//定义一个头结点数组voidinputinformation()//输入信息,建立系统{inti,j,k,s;for(i=0;in;i++){h[i].score=0;h[i].mscore=0;h[i].wscore=0;}//初始化头结点for(i=0;in;i++){printf(*****学校编号:);scanf(%d,&h[i].schoolnum);//输入头结点信息for(j=0;jm+w;j++){printf(*****项目编号:);scanf(%d,&h[i].c[j].itemnum);printf(*****取前3名or前5名:);scanf(%d,&h[i].c[j].top);printf(*****获得几个名次:);scanf(%d,&k);//输入项目信息for(s=0;s5;s++)h[i].c[j].range[s]=0,h[i].c[j].mark[s]=0;//初始化排名和分数for(s=0;sk;s++){printf(*****名次:);scanf(%d,&h[i].c[j].range[s]);//输入所获名次信息if(h[i].c[j].top==3)switch(h[i].c[j].range[s]){case0:h[i].c[j].mark[s]=0;break;case1:h[i].c[j].mark[s]=5;break;case2:h[i].c[j].mark[s]=3;break;case3:h[i].c[j].mark[s]=2;break;}elseswitch(h[i].c[j].range[s]){case0:h[i].c[j].mark[s]=0;break;case1:h[i].c[j].mark[s]=7;break;case2:h[i].c[j].mark[s]=5;break;case3:h[i].c[j].mark[s]=3;break;case4:h[i].c[j].mark[s]=2;break;case5:h[i].c[j].mark[s]=1;break;}h[i].score=h[i].score+h[i].c[j].mark[s];//按取前三名还是取前五名分别记分if(j=m-1)h[i].mscore=h[i].mscore+h[i].c[j].mark[s];//是男子项目则记到男子分数里面去elseh[i].wscore=h[i].wscore+h[i].c[j].mark[s];//是女子项目则记到女子项目里面去}printf(\n);}}}voidoutput()//输出函数{intchoice,i,j,k;intremember[n];intsign;do{printf(*******************1.按学校编号输出.*******************\n);printf(*******************2.按学校总分输出.*******************\n);printf(*******************3.按男团总分输出.*******************\n);printf(*******************4.按女团总分输出.*******************\n);printf(\n\n*******************请选择编号*************************\n\n:);scanf(%d,&choice);switch(choice){case1:for(i=0;in;i++){printf(\n\n*****学校编号:%d\n,h[i].schoolnum);printf(*****学校总分:%d\n,h[i].score);printf(*****男团总分:%d\n,h[i].mscore);printf(*****女团总分:%d\n\n\n,h[i].wscore);}//按编号顺序输出break;case2:for(i=0;in;i++)remember[i]=i;for(i=0;in;i++){for(j=i+1;jn;j++)if(h[remember[i]].scoreh[j].score)k=remember[i];remember[i]=remember[j],remember[j]=k;}//用冒泡排序方法,用辅助数组记住头结点下标for(i=0;in;i++){printf(\n\n*****学校编号:%d\n,h[remember[i]].schoolnum);printf(*****学校总分:%d\n,h[remember[i]].score);printf(*****男团总分:%d\n,h[remember[i]].mscore);printf(*****女团总分:%d\n\n\n,h[remember[i]].wscore);//按所记下标顺序输出}//按学校总分输出break;case3:for(i=0;in;i++)remember[i]=i;for(i=0;in;i++){for(j=i+1;jn;j++)if(h[remember[i]].mscoreh[j].mscore)k=remember[i];remember[i]=remember[j];remember[j]=k;}for(i=0;in;i++){printf(\n\n*****学校编号:%d\n,h[remember[i]].schoolnum);printf(*****学校总分:%d\n,h[remember[i]].score);printf(*****男团总分:%d\n,h[remember[i]].mscore);printf(*****女团总分:%d\n\n\n,h[remember[i]].wscore);}//按男团总分输出break;case4:for(i=0;in;i++)remember[i]=i;for(i=0;in;i++){for(j=i+1;jn;j++)if(h[remember[i]].wscoreh[j].wscore)k=remember[i];remember[i]=remember[j];remember[j]=k;}for(i=0;in;i++){printf(\n\n*****学校编号:%d\n,h[remember[i]].schoolnum);printf(*****学校总分:%d\n,h[remember[i]].score);printf(*****男团总分:%d\n,h[remember[i]].mscore);printf(*****女团总分:%d\n\n\n,h[remember[i]].wscore);}break;//按女团总分输出}printf(请选择2继续,0跳出\n);scanf(%d,&sign);}while(sign==2);//循环执行输出语句}voidinquiry()//查询函数{intchoice;inti,j,k,s;printf(\n*****1:按学校编号查询\n);printf(\n*****2:按项目编号查询\n);printf(\n\n*****请选择查询方式:);//提供两种查询方式scanf(%d,&choice);switch(choice){case1:do{printf(要查询的学校编号:);scanf(%d,&i);if(in)printf(错误:这个学校没有参加此次运动会!\n\n\n);else{printf(要查询的项目编号:);scanf(%d,&j);if(jm+w||j==0)printf(此次运动会没有这个项目\n\n\n);//学校编号超出范围,则输出警告else{printf(这个项目取前%d名,该