




免费预览已结束,剩余31页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课 程 设 计 报 告课程名称 数据结构 课题名称 运动会分数统计 专 业 班 级 学 号 姓 名 指导老师 张鏖烽 田娟秀 李杰君 2013年 6 月 29 日湖南工程学院课 程 设 计 任 务 书课程名称 数据结构 课 题 运动会分数统计 专业班级 学生姓名 学 号 指导老师 张鏖烽 田娟秀 李杰君 审 批 任务书下达日期2013年6月23日任 务 完成日期2013年6 月29日课程设计内容1.课程设计目的:课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,实习题中的问题比平时的习题复杂得多,也更接近实际。实习着眼于原理与应用的结合点,使读者学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。平时的练习较偏重于如何编写功能单一的“小”算法,而实习题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。2. 课程设计题目1)运动会分数统计任务:参加运动会有n个学校,学校编号为1n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1m,女子m+1m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m=20,n=20)功能要求:l 可以输入各个项目的前三名或前五名的成绩;l 能统计各学校总分;l 可以按学校编号、学校总分、男女团体总分排序输出;l 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)输出形式:有中文提示,各学校分数为整形界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;目 录1需求分析12.概要设计13. 详细设计33.1 数据结构定义33.2统计输出模块33.3排序输出函数63.4查询函数114.调试分析155. 程序使用及说明156. 测试结果157. 总结188. 附录181需求分析本系统主要是运动会分数统计方案设计。根据具体情况选择输入参加项目的男女类别和取成绩名次类别;最后选择输入名次。运动会分数统计方案适合采用结构体数组,为了实现系统功能,主要应实现以下几部分:程序以用户和计算机对话方式进行,即在计算机终端上显示提示信息之后,由用户输入进行查询成绩的操作:产生各学校的成绩单,包括:各学校所取得的每项成绩的项目号、名次(成绩)、姓名和得。产生团体总分报表,内容包括校号、男子团体总分、女子团子总分和团体总分,然后进行数据保存操作。并且应该提供键盘式选择菜单实现功能选择。由于运动会分数统计需要处理大量的数据,所以在运行期间,为了避免在运行大量数据时出错,并且系统能够在很短的时间内将运行结果稳定准确输出,就需要系统达到安全性能好,可靠性高,稳定性强,处理数据迅速等特点。2.概要设计按照课题要求,在设计时将本系统分为比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果几个功能模块,并且将对录入的分数按照各项成绩得分以及团体总分排序。系统定义数据时使用结构体和结构体数组来存储信息数据,输入基本信息后由系统统计总分的内容并全部存入文件file中,在排序输出中使用冒泡排序法进行不同关键字的排序,查询函数采用顺序表的查找来完成。在设计中采用了按照模块功能来实现程序的功能,每个模块完成系统的部分功能。具体情况将详细设计中做具体介绍。 图1 系统功能模块(1) 比赛成绩输入模块比赛成绩输入模块分为:创建信息部分,该部分需输入学校编号,项目编号,取得的名次,以及哪些名次;算法部分,得到排序结果。 (2) 比赛成绩输出模块将以输入的数据按照输出比赛菜单的选择输出相应的数据。(3) 查询比赛成绩模块按照查询比赛结果菜单和其查询方式子菜单查询需要的数据。(4) 调用统计结果将输入的各学校运动会成绩排序输出。3. 详细设计3.1 数据结构定义: typedef struct int inum; /*项目编号*/ int top; /*取名次的数目*/ int range5; /*名次*/ int mark5; /*分数*/itemnode; /*存放项目信息*/typedef struct int snum; /*学校编号*/ int score; /*学校总分*/ int mscore; /*男团体总分*/ int wscore; /*女团体总分*/ itemnode tm0+w0; /*项目数组*/snode; /*存放学校信息*/snode an0; /* 定义一个学校数组*/3.2统计输出模块:比赛成绩输入模块需要输入学校编号,项目编号,取得的名次,以及哪些名次。算法模块流程图如图2所示.此模块定义变量i,j,k,s;先初始化储存分数的数组各元素,for循环实现各学校信息的输入,包括学校编号、项目编号、取前3名or前5名、获得几个名次,使用switch语句实现对输入的各个名次赋予对应的分数。void output(int n,int m,int w) /*统计输出*/ readfromfile();int i,j,s,q=0; for(i=0;in;i+) /*显示结果*/printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,ai.snum,ai.score,ai.mscore,ai.wscore); for(j=0;jm+w;j+) printf(项目编号:%d 所取名次数量:%dn,ai.tj.inum,ai.tj.top); for(s=0;s5;s+) if(ai.tj.ranges!=0) printf(名次:%d 分数:%dn,ai.tj.ranges,ai.tj.marks);printf(n);printf(n);while(q!=1)printf(统计完毕!返回? 1是 2否); /*返回菜单*/ scanf(%d,&q); printf(n);printf(n); menu(n,m,w);图2比赛成绩输入模块3.3排序输出函数:比赛成绩输出模块实现按要求输出相应的数据。有以下输出选项:按学校编号输出、按学校总分输出、按男团总分输出、按女团总分输出。for循环实现输出各个方式输出的每个数据。排序输出流程图如图3所示。 void sortput(int n,int m,int w) /*排序输出函数*/ readfromfile();int c,i,j,k,q=0;int tempn0; printf(t*排序输出系统*nn); printf(tt*1.按学校编号输出*n); printf(tt*2.按学校总分输出*n); printf(tt*3.按男团总分输出*n); printf(tt*4.按女团总分输出*n); do printf(请选择要实现功能的编号(14):); scanf(%d,&c);switch(c) case 1: for(i=0;in;i+) tempi=i; for(i=0;in;i+) for(j=i+1;jaj.snum) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in;i+) printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,atempi.snum,atempi.score,atempi.mscore,atempi.wscore); /*按学校编号输出*/ break; case 2: for(i=0;in;i+)tempi=i; for(i=0;in;i+) for(j=i+1;jn;j+)if(atempi.scoreaj.score) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in;i+) printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,atempi.snum,atempi.score,atempi.mscore,atempi.wscore); /*按学校总分输出*/ break; case 3: for(i=0;in;i+)tempi=i; for(i=0;in;i+) for(j=i+1;jn;j+) if(atempi.mscoreaj.mscore) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in;i+) printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,atempi.snum,atempi.score,atempi.mscore,atempi.wscore); /*按男团总分输出*/ break; case 4: for(i=0;in;i+) tempi=i; for(i=0;in;i+) for(j=i+1;jn;j+) if(atempi.wscoreaj.wscore) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in时输出错误:这个学校没有参加此次运动会! 否则,输入项目编号,如果jm+w|j=0,输出此次运动会没有这个项目。否则,使用for循环输出相关数据,从而实现查询功能。void search(int n,int m,int w) /*查询函数*/ readfromfile();int c,i,j,k,d,l,q=0; printf(t*查询系统*nn); printf(tt*1.按学校编号查询*n); printf(tt*2.按项目编号查询*n); do k=-1;d=-1;l=-1;printf(请选择要实现功能的编号(12):); scanf(%d,&c); switch(c) case 1: printf(要查询的学校编号:); /*查找学校编号下标*/scanf(%d,&c);for(i=0;in;i+)if(ai.snum=c) k=i;if(k=-1)printf(错误:这个学校没有参加此次运动会!n); elseprintf(要查询的项目编号:); /*查找项目编号下标*/ scanf(%d,&c);for(j=0;jm+w;j+)if(ak.tj.inum=c) d=j;if(d=-1) printf(此次运动会没有这个项目n); else /*显示结果*/ printf(这个项目取前 %d名,该学校的成绩如下:n, ak.td.top); for(i=0;i5;i+) if(ak.td.rangei!=0) printf(名次:%dn,ak.td.rangei); break; case 2: printf(要查询的项目编号:); /*查找项目编号下标*/ scanf(%d,&c); for(i=0;in;i+)for(j=0;jm+w;j+) if(ai.tj.inum=c)l=j; if(l=-1) printf(此次运动会没有这个项目n); else /*显示结果*/ printf(该项目取前 %d名,取得名次的学校n,a0.tl.top);for(i=0; in;i+) for(j=0;j5;j+) if(ai.tl.rangej!=0) printf(学校编号:%d,名次:%dn,ai.snum,ai.tl.rangej); break; default: printf(输入错误,请重试!n);printf(请选择 1 返回主菜单 0继续); /*返回菜单或继续查询*/ scanf(%d,&q); printf(n);while(q=0);printf(n); if(q!=0)menu(n,m,w);图4 查询函数流程图4.调试分析调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。本系统调试过程中遇到的主要问题、原因和解决方法如下面介绍。调试过程中出现的问题和处理方式:(1) 程序出现语法错误发现是输入名次信息的地方忘带地址符&。 添加取地址符。 printf(*名次:); scanf(%d,&hi.cj.ranges);(2)在输出模块不能将全部的学校信息输出,属于算法编写错误,正确的程序应该为:if(hrememberi.mscorehj.mscore)k=rememberi;rememberi=rememberj;rememberj=k;5. 程序使用及说明本程序的运行环境为Microsoft Visual C+6.0,在进入该程序软件打开文档,然后对本程序进行调试,调试完毕,用户可根据需求从主菜单选择相应的功能,用户根据窗口的提示进行操作,依自己的需求选择相应序号调用功能函数对用户需求进行单独运算。6. 测试结果软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。过度测试则会浪费许多宝贵的资源。到测试后期,即使找到了错误,然而付出了过高的代价。图5 信息的录入图6 参赛学校信息统计输出图7 学校成绩排序输出图8 查询输出7. 总结经过数据结构课程设计时间学习,我对数据结构有了更进一步的认识和了解,但在实践的过程中,也发现自己很多不足之处。但是在课程设计的过程中,虽然遇到了很多问题,但最终差不多也都解决了。我发现在实践过程中出现的错误有的时候只是一些很小的逻辑错误,表明在整个过程中不够细心。另外,这次的课程设计,我们是两个人合作完成的,多个人思考多个力量,在整个过程中,我们互相帮助,能更好更快地解决了我们面临的难题。另外,由于此次课程设计用到数据文件的知识,而这些知识课堂上学的很少,所以需要我们自学一些有关知识,所以对一些函数的应用不太熟悉,但是经过此次课程设计,我们队对文件的读写也有了更深的了解,也在一定程度上培养了我的自学能力。经过C语言和数据结构的学习比较,我发现数据结构与C语言有很大的不同,C语言不需要考虑存储结构之类的,只需要定义个变量或数组,集中精力于算法之上,而数据结构前期的整体规划和构思非常重要,先确立合理的存储结构,再来编写算法,实际上一旦存储结构确立了,算法的实现相对来说简单很多,难就难在如何确立合理的存储结构。8. 附录源程序代码:#include#include #define n0 20 /*学校最大数目*/ #define m0 20 /*男子项目最大数目*/ #define w0 20 /*女子项目最大数目*/typedef struct int inum; /*项目编号*/ int top; /*取名次的数目*/ int range5; /*名次*/ int mark5; /*分数*/itemnode; /*存放项目信息*/typedef struct int snum; /*学校编号*/ int score; /*学校总分*/ int mscore; /*男团体总分*/ int wscore; /*女团体总分*/ itemnode tm0+w0; /*项目数组*/snode; /*存放学校信息*/snode an0; /* 定义一个学校数组*/void menu(int n,int m,int w) /*菜单函数*/ int c; void input(int n,int m,int w);void output(int n,int m,int w);void sortput(int n,int m,int w);void search(int n,int m,int w);printf(ttt欢迎使用ttttnn); printf(tt*1.信息输入*n); printf(tt*2.统计输出*n); printf(tt*3.排序输出*n); printf(tt*4.信息查询*n); printf(tt*0.退出系统*nn); printf(nn);printf(请选择要实现步骤的编号(04):); scanf(%d,&c);switch(c) case 1: input(n,m,w);break; case 2: output(n,m,w);break; case 3: sortput(n,m,w);break; case 4: search(n,m,w);break; case 0:printf(谢谢使用,再见!n); exit(0); default: printf(输入错误,请重试!n);menu(n,m,w); void savetofile() /*信息存入文件file*/FILE *fp; int i; if(fp=fopen(file.txt,w)=NULL) printf(不能打开文件n); return; for(i=0;in0;i+) fwrite(&ai,sizeof(snode),1,fp);fclose(fp); fclose(fp);void readfromfile() /*信息从文件file中取出*/ int i;FILE *fp; if(fp=fopen(file.txt,rb)=NULL) printf(cannot open the filen); return; for(i=0;in0;i+) fread(&ai,sizeof(snode),1,fp); fclose(fp);void input(int n,int m,int w) /*信息输入*/int i,j,s,k,q=0; for(i=0;in;i+) printf(学校编号:); scanf(%d,&ai.snum); /*输入学校信息*/ for(j=0;jm+w;j+) printf(项目编号:); scanf(%d,&ai.tj.inum); printf(取名次个数(3或者5):); scanf(%d,&ai.tj.top); printf(获得名次个数(15):); scanf(%d,&k); /*输入项目信息*/ for(s=0;sk;s+) printf(所获名次(15):); scanf(%d,&ai.tj.ranges); /*输入所获名次信息*/ printf(n); for(i=0;in;i+) ai.score=0; ai.mscore=0; ai.wscore=0; /*初始化分数*/for(i=0;in;i+) for(j=0;jm+w;j+) for(s=0;s5;s+) if(ai.tj.top=3) switch(ai.tj.ranges) case 0: ai.tj.marks=0; break; case 1: ai.tj.marks=5; break; case 2: ai.tj.marks=3; break; case 3: ai.tj.marks=2; break; else if(ai.tj.top=5) switch(ai.tj.ranges) case 0: ai.tj.marks=0; break; case 1: ai.tj.marks=7; break; case 2: ai.tj.marks=5; break; case 3: ai.tj.marks=3; break; case 4: ai.tj.marks=2; break; case 5: ai.tj.marks=1; break; else printf(信息有误!);printf(n);exit(0); ai.score=ai.score+ai.tj.marks; /*记学校总分*/ if(j=m-1) ai.mscore=ai.mscore+ai.tj.marks; /*记男子团体总分*/ else ai.wscore=ai.wscore+ai.tj.marks; /*记女子团体总分*/while(q!=1)printf(输入完毕!返回? 1是 2否); /*返回菜单*/ scanf(%d,&q); printf(n);printf(n);savetofile(); menu(n,m,w);void output(int n,int m,int w) /*统计输出*/ readfromfile();int i,j,s,q=0; for(i=0;in;i+) /*显示结果*/printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,ai.snum,ai.score,ai.mscore,ai.wscore); for(j=0;jm+w;j+) printf(项目编号:%d 所取名次数量:%dn,ai.tj.inum,ai.tj.top); for(s=0;s5;s+) if(ai.tj.ranges!=0) printf(名次:%d 分数:%dn,ai.tj.ranges,ai.tj.marks);printf(n);printf(n);while(q!=1)printf(统计完毕!返回? 1是 2否); /*返回菜单*/ scanf(%d,&q); printf(n);printf(n); menu(n,m,w);void sortput(int n,int m,int w) /*排序输出函数*/ readfromfile();int c,i,j,k,q=0;int tempn0; printf(t*排序输出系统*nn); printf(tt*1.按学校编号输出*n); printf(tt*2.按学校总分输出*n); printf(tt*3.按男团总分输出*n); printf(tt*4.按女团总分输出*n);do printf(请选择要实现功能的编号(14):); scanf(%d,&c);switch(c) case 1: for(i=0;in;i+) tempi=i; for(i=0;in;i+) for(j=i+1;jaj.snum) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in;i+) printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,atempi.snum,atempi.score,atempi.mscore,atempi.wscore); /*按学校编号输出*/ break; case 2: for(i=0;in;i+)tempi=i; for(i=0;in;i+) for(j=i+1;jn;j+)if(atempi.scoreaj.score) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in;i+) printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,atempi.snum,atempi.score,atempi.mscore,atempi.wscore); /*按学校总分输出*/ break; case 3: for(i=0;in;i+)tempi=i; for(i=0;in;i+) for(j=i+1;jn;j+) if(atempi.mscoreaj.mscore) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in;i+) printf(学校编号:%d 学校总分:%d 男团总分:%d 女团总分:%dn,atempi.snum,atempi.score,atempi.mscore,atempi.wscore); /*按男团总分输出*/ break; case 4: for(i=0;in;i+) tempi=i; for(i=0;in;i+) for(j=i+1;jn;j+) if(atempi.wscoreaj.wscore) k=tempi; tempi=tempj; tempj=k; /* 用冒泡排序方法排序*/ for(i=0;in;i+) printf(学校编号:%d 学校总分:%d 男团总分:%d 总分:%dn,atempi.snum,atempi.score,atempi.mscore,atempi.wscore); /*按团总分输出*/ break; default: printf(输入错误,请重试!n);printf(请选择 1 返回主菜单 0继续); /*返回菜单或继续排序*/scanf(%d,&q);printf(n);while(q=0);printf(n);if(q!=0)menu(n,m,w);void search(int n,int m,int w) /*查询函数*/ readfromfile();int c,i,j,k,d,l,q=0; printf(t*查询系统*nn); printf(tt*1.按学校编号查询*n);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 入院流程护士课件
- 入职安全培训简讯课件
- 2025年数字货币在文化娱乐领域的应用与监管研究报告
- 健康行业知识培训课件
- 偏瘫病人护理
- 促进民族团结精美课件
- 广西钦州市第十三中学2025-2026学年高二上学期第一周考试地理试卷(含答案)
- 2026届广东省兴宁市水口中学物理高三上期末学业质量监测模拟试题
- 浙江省七彩阳光2025-2026学年物理高三第一学期期末考试模拟试题
- 银监会舆情管理办法
- 呼吸专科护士培训课件
- 2025年(数学学科)中考模拟测试卷(三模)附参考答案
- 2025年人教PEP版(2024)小学英语四年级上册(全册)教学设计(附目录)
- 转租养殖场地合同范本
- 传感器应用技术 课件全套 梁长垠 项目1-8 传感器认知与测量系统搭建- 无线传感器网络应用电路设计与调试
- 施工工艺标准化做法实施图集汇编
- 二年级上学期收心教育
- 矿山买卖居间协议书
- 2025年医师执业资格考试试题及答案
- 并购协议样本3篇
- 板房拆除协议书样本
评论
0/150
提交评论