ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:381.55KB ,
资源ID:20893182      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20893182.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(武汉理工大学数据结构课程设计Word文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

武汉理工大学数据结构课程设计Word文档格式.docx

1、2、 设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、 调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。4、 经验和体会(包括对算法改进的设想)5、 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。时间安排:1、第20周(6月29日至7月3日)完成。2、7月3 日8:00到计算中心检查程序、交课程设计报告、源程序(CD盘)。指导教师签名: 年 月 日系主任(或责任教师)签名:链式简单选择排序主要涉及到数据结构中链表和

2、排序两个知识点,其中,链表的知识又涉及创建、插入、遍历等。为了获得测试用例,还需掌握随机数产生方法以及文本文件读写的相关操作。所以,课程设计是很考验我们综合能力的,通过学习,可以进一步提升我们的软件开发能力。1课程设计问题描述及开发工具1.1 课程设计问题描述试编写一个程序,以单链表作为存储结构,实现对待排序表中的数据的简单选择排序,用多组测试例子对程序进行测试,并输出排序结果。1.2 开发工具本课程设计需要安装有支持标准C/C+的Visual C+编译器(VC6.0或更高版本)的计算机一台。2程序设计2.1思想描述为解决问题,首先要建立一组测试用例,本程序提供两中产生数据的方法,在交互界面下

3、,用户可自行选择。一种是直接通过计算机利用rand()函数产生随机数并写入文件;另一种则是由用户自己向文件中输入数据。其次要建立一个单链表,将该文件中的数据(设置为float类型)逐个存储在建立的单链表中。最后,依次对单链表中的结点数据进行简单选择排序,其中排序分为从大到小排序和从小到大排序两种方式,同样可在交互界面下,由用户自行选择。排序后,输出排序结果和运行时间,为保证结果正确性,还要做对结果进行检查。整个人机交互过程中,为保证用户输入指令的合法性,还要对输入数据进行词法分析。选择排序基本思想是:通过n-i次关键字比较,从n-i+1(i=1,2,.,n-1)个记录中选取关键字最大或最小的记

4、录作为有序序列中第i个记录。以此方法循环下去,直到排序完成。程序总流程图如上所示2.2存储结构设计本课程设计要求使用线性表的链式存储结构来存储待排序的数据,定义一个结点类型,它包括两个域:存储数据元素信息的数据域,存储后继元素地址的指针域。单链表结构体的定义如下:struct elem float data; elem *next;值域data以float型存储所要排序的数据,指针域next以指针型存储了指向下一个结点的地址。2.3 主要算法设计本程序中的几个较为核心的算法有:创建链表函数void creat_self(elem *&head),随机数函数void rand_data(int

5、n,int w),简单选择排序void sort(elem *head,int cho),词法分析函数int ana(char a,int i,int j)。现依次用c+语言描述他们的具体算法。2.3.1 链表的创建在文件data.txt中,已经保存了要排序的数据,通过读取文件,可以为每个结点写入数据。创建的这个单链表是带头结点的,在遍历它的时候当注意这点,一般情况下,文件是可以打开的,但如果文件无法打开,则输出提示信息并退出函数。void creat_self(elem *&head)/把文件中的数据读出,并建立一个头指针为head的单链表,保存这些数据 int c=0; elem *p2;

6、 ifstream fin(data.txt); if(!fin) coutnext; for(int i=0;fin;i+) elem *p=new elem; finp-data; p-next=p1- p1-next=p; p2=p1; p1=p; p2-next=NULL; /读入的最后一个数无效,故舍去。 fin.close(); 2.3.2随机数据产生函数该函数用到的是伪随机数rand(),并由参数n和w限制个数和分布范围。其实可以把语句fout rand()%w ;改写成fout float(rand()%w)/33*31这样的形式,获得大致分布在0w范围内的随机小数。void

7、rand_data(int n,int w)/产生n个分布在0w范围内的随机数,并写入文件datatxt中 ofstream fout(fout) cout0)in; foutfloat(rand()%w) else if(w for(int i=0;0-float(rand()%abs(w)next,即进入外层循环,直到循环到最后一个结点为止。这里还用到了一个函数clock(),它包含在头文件time.h中,用来计算程序的运行时间,有利于我们更直观地了解程序的效率。函数实现代码如下:void sort(elem *head,int cho)/选择排序算法,参数cho决定排序方式 clock_

8、t start,end; float temp; /始终指向待排数据的最大(小)值 start=clock(); for(elem *p=head-p!=NULL;p=p-next) p2=p; for(elem *p1=p-p1!p1=p1- if(p2-datap1-data&cho=0) p2=p1; else if(p2-data /通过中间变量交换数据,完成一轮排序,筛选出一个最值。data=p- p-data=temp; end=clock(); cout算法用时为(double)(end-start)/CLOCKS_PER_SEC秒endlendl ; /计算算法执行时间2.3.

9、4词法分析在实际输入过程中,用户可能输入非法字符,所以这里需要对数据进行分析,一旦输入不合法,就要提示用户重新输入,否则,本程序可能会崩溃。a保存输入的字符,i,j是程序允许的指令。基本思想为:获取用户输入的字符串a,把a0和i,j比较,若比较成功,并且a1为0时,返回1,否则,返回0。int ana(char a,int i,int j)/词法分析,检验用户的输入是否合法 if(a0=0+i|a0=+j)&(a1=0) return 1; return 0;3程序调试过程问题与改正在本课程设计的程序调试过程中,出现错误提示如下: (1)-Configuration: test - Win32

10、 Debug-Compiling.test.cppE:c+安装MyProjects课设test.cpp(17) : error C2628: elem followed by void is illegal (did you forget a ?)执行 cl.exe 时出错. 分析:原来,在定义完结构体以后,没有在括号外面打上“,”,结构体的定义与函数体的格式有点相似,但是函数体后面不用加“,”,这些都是细节上的东西,不要把二者混淆了。 (2)有一次的调试结果如图所示:分析:可以看出,本来是要由计算机自动产生3个随机数,结果链表保存了4个数,并且第四个数明显是错误的。通过分析文件读写过程,发现

11、最后一次保存到链表的数据实际上是无效的。通过改正creat_self(elem *&head)函数,即删除链表最后一个结点,问题解决。(3)-Configuration:c+安装MyProjects课设test.cpp(113) : error C2065:flag : undeclared identifier执行 cl.exe 时出错。在void check(elem *head,int cho)函数中,定义了一个flag变量,用于标示运行状态,但却提示flag未定义,原来,flag被定义在了while语句中,走出while语句后,就不在其作用域内里。把flag定义在函数开头位置,问题解决

12、。4运行结果及说明4.1以随机方式创建链表输入n为100,分布范围w为200,产生100个随机数,建立一个链表。输出的结果如下:4.2 用户自己写入数据用户把数据手动输入到文件data.txt中。4.3 比较三组不同输入数据的排序(1)3000个数据从小到大排序结果如下:(2)500个数据从小到大的排序结果:(3)2000个数据从大到小排序结果如下:4.4结果分析(1)这里使用的数据也可以是小数,负数,但字符等是不允许的。(2)在void creat(elem *&head) 函数中,head必须是一个指针的引用,否则,通过函数建立的链表头指针无法传递。(3)用例一是产生3000个分布在044

13、44间的随机数,并按照从小到大的顺序排序,可以看到,用时为0.047秒,排序后的数据经过check(elem *head)函数的检查,结果正确。用例二是对500组负数排序,因为数据较少,故用时极短,系统显示的用时为0秒。用例三是对2000组分布在06666范围的数据排序,用时0.031秒。对同样一组数据而言,排序的时间可能不同,但差距都很小。5时间复杂度分析 链式简单选择排序void sort(elem *head,int cho)时间复杂度为o(n*n);随机数产生函数void rand_data(int n,int w),创建函数,检查函数void check(elem *head,int

14、 cho),打印函数void print(elem *head)时间复杂度均为o(n)。6经验与体会省略7课程设计源程序 /*链式简单选择排序程序武汉理工大学LDSD 2013年7月2日*/#includetime.hiostreamfstreamusing namespace std;void print(elem *head)/遍历链表,在屏幕上显示每个结点中的数据 head=head- while(head!=NULL) cout head=head-void check(elem *head,int cho)/通过对相邻数据大小进行比较,判断排序算法结果是否正确 int flag=1;

15、 if(head) while(head-next! if(head-next- cout if(flag) coutcho; while(!ana(cho,1,0); if(cho0=1系统会自动产生浮点数,请输入数据的个数N和分布范围W(数据分布在0-W区间)。 do cinnw; if(w=0)范围w值不能为0,请重新输入! while(w=0); rand_data(n,w); creat_self(head);请把数据写入到data.txt文件中,数据之间以空格间隔。不要输入字符,否则,字符后的数据将被忽略。数据输入完成后,输入任意字符继续。n1;void main() char c

16、ho10; system(color F0 /为使输出窗口视觉效果更佳,这里设置背景色为亮白色(F),前景色为黑色(0)。 elem *head=NULL;= 欢迎使用链式选择排序系统! creat(head);查看当前(未排序)链表中的数据吗?查看请选择1,跳过请选择0。 while(! if(cho0= print(head);cout请选择排序方式:从大到小选择1,从小到大选择0。排序算法运行结果如下: sort(head,cho0- print(head); check(head,cho0-本科生课程设计成绩评定表班级: 姓名: 学号:序号评分项目满分实得分1学习态度认真、遵守纪律10设计分析合理性3设计方案正确性、可行性、创造性204设计结果正确性405设计报告的规范性6设计验收总得分/等级评语:注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格指导教师签名:201 年月日

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1