第1页共10页鲁东大学数学与信息学院2010-2011学年第1学期《数据结构专题设计》课程论文课程号:2102791任课教师陈军成绩论文题目:(可指定题目,也可说明题目范围。)从给出的参考选题中选(或自选)一个能体现数据结构课程特点的课题,用C语言(TC或VC++)编程实现所述功能,用论文形式描述整个工作。详见《数据结构专题设计课程任务和要求》文档。论文要求:(对论文题目、内容、行文、字数等作出判分规定。)按右边给定的模板要求写作,字数4000字以上(不含附录)。评分采用五级制:优秀、良好、中等、及格、不及格。评分依据包括题目难易程度、程序运行情况、数据结构和算法设计合理与否、算法注释的清晰程度;论文的规范程度、撰写质量(条理清晰,内容充实,文字通顺,图表恰当);总结的深刻程度、工作量和创新性;交作业的及时程度、独立完成情况,以及其它参考因素。不同同学可以选择同类题目,但在具体功能、程序代码、论文写作上都要有所不同,若发现雷同,均判为不及格。教师评语:教师签字:2010年11月2日运动会分数统计系统的简单实现1、引言每个学校都有运动会的举办,而运动会最重要的就是对于分数的统计,对于运动会来说,不同名次的不同积分,每个项目的分数累计,每个学校(或班级)获奖的情况,每个学校(或班级)总分的状况,数据的整理非常麻烦和琐碎,如果是场大型的运动会,数据的处理量是很大的,仅靠人工处理时往往不够的。所以一个可以简单统计分析运动会分数的分数管理系统是很重要的,它可以为用户提供的服务有:(1)数据的输入。(2)数据的统计,包括分类,统计各项积分,总分等。(3)数据的排序。(4)有关数据的输出,查询。简单的分数统计系统可以简化人工操作,使数据处理的更为简便和快捷,省去大量冗余时间和人工劳力。运动会分数统计系统处理的数据相对简单,数据量相对较小,操作简单,但所用结构丰富,可以用来作为练习C语言的编程。利用C语言实现对数据的整理,包括输入、储存、编辑、简单的运算和数据的查找。2、需求分析本次设计任务是统计运动会分数,即总分、女子总分、男子总分。输入各个学校的名称,各个项目的名称,获得每个项目前三名的学校编号,分数按第一名3分、第二名2分、第三名1分的积分计算成绩。最后输出各学校的总分、女子总分、男子总分,及总分排名、女子总分排名、男子总分排名,和所要查找的学校总分、女子总分、男子总分。◆任务:一共有n个学校参加运动会(n小于20),编号1……n,分成m个男子项目和w个女子项目,不同项目取前三名的积分为:3、2、1(m20,n20)。◆功能要求:1.能统计各个学校的总分。2.可以按学校总分、男子总分、女子总分输出。3.可以查找某个学校的总分、男子总分、女子总分的情况。学院________________专业_________________班级_____________本专学号_________________姓名__________________密封线学生须将文字写在此线以下第2页共10页3、概要设计(或总体设计)3.1数据结构描述实现以上算法必须定义两个结构体,一个项目结构体,一个学校结构体。tructpro{//项目结构体;charname[N];//项目名称;intnums[4];//前三名学校编号;}p[21];structschool{//学校结构体;intnum;charname[N];//学校名称;intsums;//学校总分;intgirl;//女子总分;intboy;//男子总分;}sch[21];主要有五个模块:1.主函数模块;选择操作。即选择要实现的功能。2.总分排序模块;Sumsrank(),将参加运动会的学校按总分大小排列。3.女子总分排序模块;Girlrank()将参加运动会的学校按女子总分大小排列。4.男子总分排序模块;Boyrank()将参加运动会的学校按男子总分大小排列。5.查找模块;Search()查找某学校的分数情况。ADT定义ADTYundong{数据对象:D={e1,e2,e3,e4|e1,e2,e3,e4∈ElemSet}基本操作:Input(&A,x1,x2,x3….)促使条件:A为n维数组,x1,x2,x3…为变量。操作结果:将变量赋值给A中元素。Rank(&A)操作结果:将数组A中元素排序并列出。}ADTYundong3.2模块设计◆储存设计主菜单1234560输入各学校的名称、个项目的名称及获得前三名的学校编号,并储存。输出各个学校的总分、女子总分、男子总分。按编号输出按学校总分排名输出成绩。按学校女子总分排名输出成绩。按学校男子总分排名输出成绩输出查找某个学校的总分、女子总分、男子总分。退出程序。1输入各学校及各项目成绩并储存输入女子项目个数w输入男子项目个数m输入参加运动会的学校总数n女子项目男子项目输入项目编号(如1)输入项目编号(如w)输入项目编号(如1)输入项目编号(如m)输入第一的学校编号(编号为:)…输入第三名学校的编号(编号为:)…输入第一的学校编号(编号为:)…输入第三的学校编号(编号为:)输入第一的学校编号(编号为:)…输入第三的学校编号(编号为:)…输入第一的学校编号(编号为:)…输入第三的学校编号(编号为:)第3页共10页2.统计各学校总分情况,按编号输出按各学校编号显示分数情况按数字键继续选择操作。3.统计各学校总分排名显示各学校总分按数字键继续选择操作。4.统计各学校女子总分排名显示各学校女子总分按数字键继续选择操作。5.统计各学校男子总分排名显示各学校男子总分按数字键继续选择操作。6.按学校编号查询某个学校的得分情况输入要查询的学校编号显示该学校的编号、名称、总分、女子总分、男子总分0.退出程序按任意键可以退出。◆主函数流程main()4、详细设计及实现4.1input()开始intny==1exit(1)printf()m0||m20w0||w20n0||n20输入有误输入有误输入有误输入项目名称输入前三名学校编号结束YNYYYNNN开始printf()intx1234560第4页共10页4.2sumsrank()4.3girlrank()4.4boyrank()4.5search()5、调试分析1.input()输入函数输入函数中出现的主要错误有错误信息的循环编写的不是很好,经常出现死循环,有时易跳不出循环总在重复同一操作。while循环中的控制语句中的变量值在循环中的位置设置的不对以致在后面循环的时候出现无法实现循环,和循环出错,形成死循环的现象。例如控制语句中的y变量就出现了错误,混淆了退出循环是的值。为了将提示信息写进循环,可以将操作重复,所以出现了,报错不正确的现象。if语句中的判断语句出现错误,逻辑关系不清等错误也常常出现。例如混淆了“&&”和“||”的用法,导致了判断错误输入时出现了很多错误。开始intx输出结束开始inti,j;ifsch[j];.sumsch[j+1].sumsch[j]-sch[j+1]sch[j]=sch[j];sch[j+1]=sch[j+1]Y结束N开始inti,j;ifsch[j];.girlsch[j+1].g-irlsch[j]-sch[j+1]sch[j]=sch[j];sch[j+1]=sch[j+1]Y结束N开始inti,j;ifsch[j];.boysch[j+1].boysch[j]-sch[j+1]sch[j]=sch[j];sch[j+1]=sch[j+1]Y结束N第5页共10页出现这种情况后的解决办法,通过反复的修改和调试。换用不同的循环体找寻适合的控制语句。实现在输入错误时,出现错误提醒及修改操作。对于逻辑关系的换乱,可以试着用不同的判断语句来实现,或者不断试验判断正确逻辑。在C++环境中单击程序运行按钮。测试:屏幕显示菜单,输入1,回车。输入各个学校的名称和各个项目的名称及前三名的学校。2.排序函数在排序函数中,程序使用了冒泡排序法。但是中间出现了对结构体中的元素的不正确引用。致使后面输出时的编号和排名时的数据错误。在排序中if语句判断好大小后,最开始只是对当前的元素进行了排序,以致后面再输出结果时,输出错误,排序混乱。例如在总分排序中,只是将sch[j].sum与sch[j+1].sum进行了交换,致使后面排序的输出时完全错误。解决方法,仔细查找结构体。正确引用结构体元素。排序时应将结构体整体排序,而不是简单的将某个结构体中的某个元素排序。排序中还出现了循环错误。对于双层循环的控制出现错误,外层循环和内层循环没有很好的协调。例如外层循环循环变量为i,内层循环循环变量为j,i与j的关系没有弄清,使后面的结果发生了错误。解决方式,修改循环。检查外层循环和内层循环的控制语句,调试出最佳的循环关系。发现错误并修改。测试:输入2或3,回车。按学校的最初编号排列,输出学校名称、团体总分、女子总分、男子总分。第6页共10页按学校的团体总分排列,输出学校编号,学校名称、团体总分。调试分析:缺点是每次执行后无法返回主菜单,查找功能每次只能查找一个学校,不能循环使用。每次查找一个学校后就退出循环,不能继续操作。6、结论及体会1.课题小结:对于这次的实验题目,事先想象的很简单,自己认为只是几个简单的小模块,简单的排序和数据统计问题,想要实现是很简单的事情。可是没有想到做起来还是蛮辛苦的,有好多模块之间的联系自己事先都没有想清楚,导致做的时候很是手忙脚乱。事先所查的资料也是寥寥无几,能给自己提供的信息也很少。在编程序的时候遇到了很多困难,从而也发现了自己对之前C语言及数据结构的知识掌握的不是很理想。简单的做题还是可以,但是如果结合起来做一个简单的系统还真是困难。自己对于各个算法之间的联系还是模棱两可的,很多东西不是自己想象的那样简单。明白了,要想把一个系统做好需要了解很多东西,也要有全局的观念,自己做的是一个系统而不是一个简单的算法。仅仅了解书本上简单的程序是不够的,还要将这些只是用到实际的程序上,这一点中遇到的困难是我始料未及的。通过这次设计实验,让我对原来所学的知识有了更深刻的理解,尤其是原来并不是很懂得结构体知识,还有对于数据排序的知识。在写论文的时候也对于数据的流程图有了新的认识,原来学习的时候不是很喜欢画流程图,但是通过这次试验,让我发现流程图的重要性。这次实验让我学到了很多,不仅仅是知识,还有查找资料,编写程序、调试程序等能力,同时也让我明白了,只要决定做一件事,下定决心通过努力是可以成功的,虽然可能和自己的想象有些差距,但是如果不去做是连一点点的收获都得不到的,我们可以通过以后的努力使它更加完善和理想。这也是我这次试验的最大收获,这次试验让我获益匪浅。2.对系统的评价及改进设想我的系统自认为不是很理想的,因为自己有很多的想法没有被实现。时间复杂度和空间复杂度没很好的被考虑在内。所以算法的分析做的不是很够,自己只是将简单的计算思想和简单的程序功能体现出来。虽然程序上还有很多的地方不足,但是简单的功能,如分数输入、数据整理、数据排序、数据输出等功能都可以实现,基本的要求和功能都已实现,这是我比较满意的。还有让自己觉得程序还不错的地方是错误提示做的比较满意,在反复修改了程序循环之后可以正确的提示错误,并且可以退出循环重新输入。我认为这个系统还有很多需要改进的地方,有些功能没有完全的体现。原本我对于这个程序的设想是,除了数据的输入、整理、排序之外,查找功能是除了可以按学校查询,还可以按项目查询各学校的得分情况,但是这一点我的程序无法实现,还是因为结构体的运用上有些不清,无法达到这项功能。这是我对于这个程序最大的遗憾。也是最需要改进的地方。因为自己的编程能力真的不是很好,很多地方无法顾及,许多的东西无法实现,程序有很多的瑕疵和不足。所以希望在老师看过我的程序后,请老师多多批评指正,谢谢老师!!参考文献[1]严蔚敏,吴伟民.数据结构题集(C语言版).北京:清华大学出版社,1999.[2]徐孝凯.数据结构课程实验.北京:清华大学出版社,2002.附录主要的源程序代码。#