1、4.1.3提出问题 124.1.4分析问题 124.1.5解决问题 124.1.6提出问题 134.1.7分析问题 134.1.8解决问题 134.2算法的效率及改进设想 135 心得体会 14附1 15附2 26附3 27附4 28附5 29参 考 文 献 30一、 概述1.1设计目的数据结构主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础
2、,广泛的应用于信息学、系统工程等 各种领域。数据结构课程设计是为数据结构课程独立开设的实践性教学环节。数据结构课程设计对于巩固数据结构知识,加强学生的实际动手能力和提高学生综合素质是十分必要的。课程设计的目的:1)要求学生达到熟练掌握C语言的基本知识和技能。2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。3)提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。4)培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。5)初步掌握软件开发过程的问题分析、系统设计、程序编
3、码、测试等基本方法和技能。1.2 课程设计内容问题描述:参加运动会有n个学校,学校编号为1n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1m,女子m+1m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m=20,n=20)功能要求: (1)系统以菜单方式工作(2)由程序提醒用户填写比赛结果,输入各项目获奖运动员信息。(3)所有信息记录完毕后,用户可以查询各个学校的比赛成绩(4)查看参赛学校信息和比赛项目信息等。界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能
4、要求。1.3相关知识1)链表的存储用法:是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。2)文件与结构体存储:结构体是一种复杂的数据类型,结构体类型的定义只是列出了该结构的组成情况,编译系统并未因此而分配存储空间,当定义了结构体类型的变量或数组后,编译系统才会分配存储空间3)栈的出栈用法:堆栈是RAM中划出的一片特殊存储区,用于临时存放一些重要数据(这些数据存放一会后是必须回到原位的)
5、,其中数据的位置由堆栈指针确定,而数据的存放和读取则由入栈指令和出栈指令控制,入出必须对应成对的使用才能使压入的数据正确的回到压入前的位置。4)查找方法:顺序查找是一种最基本和最简单的查找方法。它的思路是,从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。否则就是表中没有要找的元素,查找不成功。对于表中记录的关键字是无序的表,只能采用这种方法。存储结构:顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。 5)链接存储方法:它不要求逻辑上相邻的结点
6、在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。 索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。 散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。二 、系统设计21系统功能要求1).可以输入各个项目的前三名或前五名的成绩;这里需要用到栈的存储用法,链表的存储用法,结构存储。2)能统计各学校总分这里就应该采用文件与结构体存储,并处理好关系。3)可以按学校编号、学校总分、男女团体总分排序输出;这里要用到的是栈的出栈用法,链表的用法,文件等。4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三
7、或前五名的学校。而这里要用到的是文件,查找方法,存储结构这三大块。2.2 数据结构设计2.2.1主函数void main() int choice; printf(n = welcome =n);n *运动会比赛计分系统*nn Design by 谭斌 nnn *1.输入比赛信息*n *2.输出比赛信息*n *3.查询比赛信息*n *4. 退出系统 *nn =nnn请选择要实现步骤的编号:nn scanf(%d,&choice); switch(choice) case 1: inputinformation(); writedata(); main(); case 2: output();
8、case 3: inquiry(); case 4: exit(0); default: 2.22数组typedef struct int itemnum; /项目编号 int top; /取名次的数目 int range5; /名次 int mark5; /分数itemnode; /定义项目结点的类型 int schoolnum; /学校编号 int score; /学校总分 int mscore; /男团体总分 int wscore; /女团体总分 itemnode cm+w; /项目数组headnode;/定义头结点类型headnode hn;/定义一个头结点数组2.23文件的储存voi
9、d writedata() /把数据存储在文件中 FILE *report; int i; if(report=fopen(sportsdata.txt,w)=null) printf(不能打开文件n exit(1); for(i=0;im+w|s=0) printf(此次运动会不包括这个项目.nnn 想在每次查询结束想返回主菜单进行其它项时,应在main( )函数中调用其它函数时再调用main( )函数,如: inputinformation();writedata();readdata();main(); output(); inquiry(); readdata(); 程序出现语法错误,
10、发现是输入名次信息的地方忘带地址符&,或是程序不完整,只写了一个大括号。如:*名次:hi.cj.ranges);附录五: 总结4.1调试中所遇到的较重要问题的回顾4.1.1提出问题所有输入输出内容只能在一屏内显示,学过c语言,很知道”n”是换行,”f”是换屏的,可是在这里就是无法实现。4.1.2解决问题输入clrscr();4.1.3提出问题设置选项,供用户输入选择时,当按任意键时都会跳入下一步操作,或者直接退出系统。4.1.4分析问题在供用户选择时,提供了几个选项,就写几个case语句,但是当用户输入的并不是这几个数字时,系统就不能做出正确判断。4.1.5解决问题修改case语句,添加def
11、ault语句提示出错,要求重新输入; default: clrscr(); /*清屏*/输入错误,请重新选择 4.1.6提出问题当同一项目中有同一学校的两个人时,便不能正确输出或者输出相同人名。4.1.7分析问题由于同时有两个相同学校编号的人存在,系统在输出时,不能确定那个是正确的,或者用后来的覆盖以前的。4.1.8解决问题用for函数实现从开始到结尾的遍历。4.2算法的效率及改进设想算法的效率:总的来讲,严重引响执行速度的便是查找,查找任意一个数据,便要将其所在的结构从头至尾遍历一次,耗费大量的时间。 改进设想:因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关
12、学校的各种信息为集合的结构。在这次上机过程中遇到过一些问题,但经过我们不懈努力,解决了部分,还有的现在不能解决,留着我们日后思考和解决。比如说在运用数据结构排序的时候,方法的选择上,总是想用时间复杂度小的算法,但结果出了问题,最后还是用了我们熟悉的选择法排序。结构体的运用上感觉不是很熟悉,遇到结构体的时候很陌生,这是以后必须要加强的。在我们的这个程序中用了两个结构体:struct node int num;struct node *f22;我们同样遇到了一些还不能很好解决的问题,在输出的时候不能得到我们想要的效果,在按学校编号排序查询输出的时候,发生了重叠在做了几次修改之后都能使之满意,这有待
13、学习和修改。 在编写之前,做整体的规划很重要,这才能让我们的效率更高和合作得更好。5 心得体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要
14、的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高.源代码#includema
15、th.h#include process.h#define n 2/学校数目 #define m 1/男子项目数目 #define w 1/女子项目数目#define null 0int itemnum;int top;int range5;int mark5;int schoolnum;int score;int mscore;int wscore;itemnode cm+w;void inputinformation() /输入信息,建立系统int i,j,k,s;for(i=0;hi.score=0;hi.mscore=0;hi.wscore=0; /初始化头结点*学校编号:scanf(
16、hi.schoolnum); /输入头结点信息for(j=0;jm+w;j+)*项目编号:hi.cj.itemnum);*取前3名or前5名:hi.cj.top);*获得几个名次:k); /输入项目信息for(s=0;s5;s+)hi.cj.ranges=0, hi.cj.marks=0; /初始化排名和分数k; /输入所获名次信息if(hi.cj.top=3)switch(hi.cj.ranges)case 0: hi.cj.marks=0; break;case 1: hi.cj.marks=5;case 2: hi.cj.marks=3;case 3: hi.cj.marks=2;els
17、e hi.cj.marks=7;case 4:case 5: hi.cj.marks=1;hi.score=hi.score+hi.cj.marks;/按取前三名还是取前五名分别记分if(j=m-1)hi.mscore=hi.mscore+hi.cj.marks;/是男子项目则记到男子分数里面去hi.wscore=hi.wscore+hi.cj.marks;/是女子项目则记到女子项目里面去nvoid output() /输出函数int choice,i,j,k;int remembern;int sign;do*1.按学校编号输出.*n*2.按学校总分输出.*n*3.按男团总分输出.*n*4.
18、按女团总分输出.*nnn* 请选择编号*nn:switch(choice)nn*学校编号:%dn,hi.schoolnum);*学校总分: ,hi.score);*男团总分:,hi.mscore);*女团总分: %dnnn,hi.wscore); /按编号顺序输出break;rememberi=i;for(j=i+1;if(hrememberi.scorehj.score)k=rememberi;rememberi=rememberj,rememberj=k; / 用冒泡排序方法,用辅助数组记住头结点下标 ,hrememberi.score);,hrememberi.mscore);,hrememberi.wscore);/按所记下标顺序输出 /按学校总分输出if(hrememberi.mscorehj.mscore)rememberi=rememberj;rememberj=k;,hrememberi.schoolnum); /按男团总分输出if(hrememberi.wscorehj.wscore) /按女团
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1