运动会分数统计.docx
- 文档编号:11260632
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:30
- 大小:374.69KB
运动会分数统计.docx
《运动会分数统计.docx》由会员分享,可在线阅读,更多相关《运动会分数统计.docx(30页珍藏版)》请在冰豆网上搜索。
运动会分数统计
运动会分数统计
目录
1.绪论1
2.系统分析1
2.1功能需求1
2.2数据需求2
2.3性能需求2
3.总体设计2
3.1功能模块设计2
3.2系统设计方案3
4.详细设计4
4.1比赛成绩输入模块4
4.2比赛成绩输出模块6
4.3查询比赛成绩模块7
4.4调用统计模块9
5.调试与测试10
5.1调试10
5.2测试10
6.结论11
结束语11
参考文献11
附录1-用户手册12
附录2-源程序19
摘要
为了发展体育事业,强健中华儿女,便于运动会分数统计,特开发此运动会分数统计程序。
本程序主要运用C语言作为程序开发语言,系统主要实现了比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果。
本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。
关键词:
学校编号;项目编号;男团总分;女团总分
1.绪论
随着社会的进步,体育事业的发展,为了提高运动会成绩统计准确,减少设计者们的工作量,开发了本系统。
根据课程设计任务书要求,本系统开发主要完成以下功能和性能。
内容:
参加运动会的的学院编号为1~n,比赛分成m个男子项目和w个女子项目,编号分别为1~m和m+1~m+w,有的项目取前五名,得分顺序为7,5,3,2,1。
有的取前三名,得分顺序为5,3,2,。
写一个统计程序产生各种成绩单和得分报表。
通过编程解决一些实际问题,并对程序进行测试,可设n=4,m=3,w=2进行测试,一般考虑n≤20,m≤30,w≤20,对于项目编号为奇数的取前五名,1;为偶数的取前三名。
姓名长度不超过20个字符,按名次顺序输入运动员姓名、学院名和成绩。
功能要求:
(1).可以输入各个项目的前三名或前五名的成绩;
(2).能统计各学校总分;
(3).可以按学校编号、学校总分、男女团体总分排序输出;
(4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
2.系统分析
2.1功能需求
本系统主要是运动会分数统计的系统。
本系统为了实现系统功能,主要应实现以下几部分:
比赛成绩输入、比赛成绩输出、查询比赛成绩和调用比赛结果。
2.2数据需求
需要向系统输入学校编号、项目编号、取得的名次、以及哪些名次。
2.3性能需求
在运行本程序时只要按照正确的操作方法不会出现无法运行的情况,系统稳定性好,安全,可靠。
3.总体设计
3.1功能模块设计
根据分析整个系统主要划分为4个功能模块,分别执行要求中的功能。
该系统分为比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果。
比赛成绩输出模块有四个子模块,分别是:
按学校编号输出模块、按学校总分输出模块、按男团总分输出模块和按女团总分输出模块;查询比赛成绩模块分为按学校编号查询模块和按项目编号查询两个子模块。
功能模块图如图1所示
图1功能模块图
(1)比赛成绩输入模块
比赛成绩输入模块分为:
创建信息部分,该部分需输入学校编号,项目编号,取得的名次,以及哪些名次;算法部分,得到排序结果。
(2)比赛成绩输出模块
将以输入的数据按照输出比赛菜单的选择输出相应的数据。
(3)查询比赛成绩模块
按照查询比赛结果菜单和其查询方式子菜单查询需要的数据。
(4)调用统计结果
将输入的各学校运动会成绩排序输出。
3.2系统设计方案
建立结构体如下:
typedefstruct
{
intitemnum;//项目编号
inttop;//取名次的数目
intrange[5];//名次
intmark[5];//分数
}itemnode;//定义项目结点的类型
typedefstruct
{
intschoolnum;//学校编号
intscore;//学校总分
intmscore;//男团体总分
intwscore;//女团体总分
itemnodec[m+w];//项目数组
}headnode;//定义头结点类型
4.详细设计
4.1比赛成绩输入模块
比赛成绩输入模块需要输入学校编号,项目编号,取得的名次,以及哪些名次。
算法模块流程图如图1所示.
图1比赛成绩输入模块流程图
此模块定义变量i,j,k,s;先初始化储存分数的数组各元素,for循环实现各学校信息的输入,包括学校编号、项目编号、取前3名or前5名、获得几个名次,使用switch语句实现对输入的各个名次赋予对应的分数。
4.2比赛成绩输出
比赛成绩输出模块实现按要求输出相应的数据。
有以下输出选项:
按学校编号输出、按学校总分输出、按男团总分输出、按女团总分输出。
图2比赛成绩输出模块流程图
模块定义了intchoice,i,j,k;intremember[n];intsign变量,do…while包括switch语句,选择输出按学校编号输出、按学校总分输出、按男团总分输出、按女团总分输出相应的数据。
for循环实现输出各个方式输出的每个数据。
4.3查询比赛成绩模块
查询比赛成绩模块包括:
按学校编号查询,按项目编号查询。
其算法原理相同,例举按学校项目编号查询模块。
如图3所示。
图3按项目编号查询模块流程图
此模块定义了intchoice;inti,j,k,s;switch(choice)实现查询的两种方式的选择,当i>n时输出错误:
这个学校没有参加此次运动会!
否则,输入项目编号,如果j>m+w||j==0,输出此次运动会没有这个项目。
否则,使用for循环输出相关数据,从而实现查询功能。
4.4调用统计结果模块
调用统计模块从文件中读取数据输出,流程图如图4所示。
图4调用统计结果模块流程图
此模块定义了FILE*report;inti,j,k,s;for循环中套用for循环,for循环分别对学校编号、学校总分、男团总分、女团总分进行输出,在使用for循环对各学校的项目编号、所取名次数量、各个名次输出,实现对文件中的数据的调用。
5.调试与测试
5.1调试
调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。
调试的任务是及时改正测试过程中发现的软件错误。
具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。
然后仔细研究推断代码以确定问题的原因,并设法改正。
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。
本系统调试过程中遇到问题、原因和解决方法如下面介绍。
(1)程序出现语法错误
发现是输入名次信息的地方忘带地址符&。
添加取地址符。
printf("*****名次:
");
scanf("%d",&h[i].c[j].range[s]);
(2)在输出模块不能将全部的学校信息输出,属于算法编写错误,正确的程序应该为:
if(h[remember[i]].mscore k=remember[i];remember[i]=remember[j];remember[j]=k; 5.2测试 软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。 或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。 过度测试则会浪费许多宝贵的资源。 到测试后期,即使找到了错误,然而付出了过高的代价。 6.结论 课程设计顺利完成,任务书中所提出的要求全部实现不过这个程序还有些不够完善,例如: 在不添加信息时,输出所有信息会乱码,而且操作页面也不是很好,在适当的地方也没有返回,提示语句也不够好。 有待提高。 结束语 因为在理论学习中没有好好的掌握,现在要独立完成一个较复杂的程序编写,确实有困难。 今后我必需扎实基础理论、认真思考,而且要践行我的承诺,一步一个脚印的走下去,才可以达到我们预期的彼岸! 仔细回顾数据结构的学习过程,发现其实他也并不是想象中的那么难。 只要肯去攀登! 参考文献 [1]谭浩强.C语言程序设计(第三版).北京: 清华大学出版社,2005 附录1-用户手册 (1)首先运行文件运动会统计分数7.exe: 如图5所示: 图5运行运动会分数统计界面 (2)输入信息: 程序首先赋初值,定义学校的个数为2,男生项目为1,女生项目为1。 输入1得到进入输入信息模块。 如图6所示: 图6输入学校运动会分数界面 按回车键可得到学校的得分信息和按编号获得的所以信息。 (3)输出信息 输入2进入输出信息模块,该模块分四项: 如图7所示: 图7输出运动会分数界面 1按学校编号输出: 如图8所示: 图8按学校编号输出分数界面 2按学校总分输出: 如图9所示: 图9按学校总分输出分数界面 3按男团总分输出: 如图10所示: 图10按学校编号男团总分输出分数界面 4按女团总分输出: 如图11所示: 图11按女团总分输出分数界面 5输入2返回输出信息模块,输入0返回主菜单。 (4)查询信息: 如图12所示: 输入3进入信息查询模块: 图12查询界面 1按学校编号查询: 如图13所示: 图13按学校编号查询界面 2按项目编号查询: 如图14所示: 图14按项目编号查询界面 3输入错误信息时给出提示: 如图15、16所示: 图15错误提示界面 图16错误提示界面 4输入2继续查询,输入0返回主菜单 (5)调用信息 输入4时显示出所有的信息: 如图17、18所示: 图17调用信息界面 图18调用信息界面 附录2-源程序 #include #include #include #include #definen2//学校数目 #definem1//男子项目数目 #definew1//女子项目数目 #definenull0 typedefstruct { 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;i { h[i].score=0; h[i].mscore=0; h[i].wscore=0; }//初始化头结点 for(i=0;i { printf("*****学校编号: "); scanf("%d",&h[i].schoolnum);//输入头结点信息 for(j=0;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;s<5;s++) h[i].c[j].range[s]=0,h[i].c[j].mark[s]=0;//初始化排名和分数 for(s=0;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; } else switch(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]; //是男子项目则记到男子分数里面去 else h[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;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;i remember[i]=i; for(i=0;i { for(j=i+1;j if(h[remember[i]].score k=remember[i]; remember[i]=remember[j],remember[j]=k; }//用冒泡排序方法,用辅助数组记住头结点下标 for(i=0;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;i remember[i]=i; for(i=0;i { for(j=i+1;j if(h[remember[i]].mscore k=remember[i];remember[i]=remember[j];remember[j]=k; } for(i=0;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;i remember[i]=i; for(i=0;i { for(j=i+1;j if(h[remember[i]].wscore k=remember[i]; remember[i]=remember[j];remember[j]=k; } for(i=0;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(i>n) printf("错误: 这个学校没有参加此次运动会! \n\n\n"); else { printf("要查询的项目编号: "); scanf("%d",&j); if(j>m+w||j==0) printf("此次运动会没有这个项目\n\n\n"); //学校编号超出范围,则输出警告 else { printf("这个项目取前%d名,该学校的成绩如下: \n",h[0].c[j-1].top); for(k=0;k<5;k++) if(h[i-1].c[j-1].range[k]! =0) printf("名次: %d\n",h[i-1].c[j-1].range[k]); //输出要查询学校项目的成绩 } } printf("请选择2继续,0跳出\n"); scanf("%d",&s); printf("\n\n\n"); }while(s==2);//循环执行输出语句 break; case2: do { printf("要查询的项目编号: "); scanf("%d",&s); if(s>m+w||s==0) printf("此次运动会不包括这个项目.\n\n\n"); //项目编号超出范围则输出警告 else { printf("该项目取前%d名,取得名次的学校\n",h[0].c[s-1].top); for(i=0;i for(j=0;j<5;j++) if(h[i].c[s-1].range[j]! =0) printf("学校编号: %d,名次: %d\n",h[i].schoolnum, h[i].c[s-1].range[j]); }//输出该项目取得名次学校的成绩 printf("\n\n\n继续2,跳出0\n"); scanf("%d",&i); printf("\n\n\n"); }while(i==2); break; } } voidwritedata()//把数据存储在文件中 { FILE*report; inti; if((report=fopen("sportsdata.txt","w"))==null) { printf("不能打开文件\n"); exit (1); } for(i=0;i fwrite(&h[i],sizeof(headnode),1,report); fclose(report); }//按头结点块写入 voidreaddata()//读出文件中数据的函数 { FILE*report; inti,j,k,s; if((report=fopen("sportsdata.txt","r"))==null) { print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运动会 分数 统计