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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计报告报告八皇后和停车场.docx

1、数据结构课程设计报告报告八皇后和停车场经济管理学院本科课程设计论文数据结构课程设计学 号: 1005170116 姓 名: 李 登 班 级: 管理101 专 业: 信息管理与信息系统 系 别: 管理系 指导教师: 孙鸿飞 2011 年 12 月 30日 吉 林 第1章 八皇后问题1.1课题综述八皇后问题的来源及意义八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。 在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能

2、相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。1. 2 面对的问题1.21解决冲突问题 这个问题包括了行,列,两条对角线; 列:规定每一列放一个皇后,不会造成列上的冲突; 行:当第I行被某个皇后占领后,则同一行上的所有空格都不再放皇后,要把以I为下标的标记置为被占领状态;1.22所用的知识 使用数据结构的

3、知识,用递归法解决问题 1.3需求分析1.3.1 涉及到的知识点本次课程设计中,用到的主要知识有:递归法的运用,for语句的灵活运用。数据结构中树知识的灵活运用、栈及数组的掌握。1.3.2 功能要求 当运行程序时,在屏幕上显示每一种方法八个皇后的相对位置,要用比较直观的界面显示。 进入界面后,就会提示输入字符串的输入形式,在八皇后求解程序中,只要你选择输出解的格式,选择1则显示为每一列皇后的放置的行数,选择2则显示的是以矩阵形式形象的显示皇后的放置位置,选择0则退出程序的调试。在调试结果中,1的位置也就表示了该皇后应该所在的位置,0代表了空位置。1.4概要设计 本课件学生是用循环递归循环来实现

4、的,分别一一测试了每一种摆法,并把它拥有的92种变化表现出来。在这个程序中,我的主要思路以及思想是这样的: 1.4.1解决冲突问题 这个问题包括了行,列,两条对角线; 列:规定每一列放一个皇后,不会造成列上的冲突; 行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要 把以I为下标的标记置为被占领状态; 对角线:对角线有两个方向。在这我把这两条对角线称为:主对角线和从对角线。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。 1.4.2数据结构的

5、实现 而对于数据结构的实现,学生则是着重于: 数组aI:a I表示第I个皇后放置的列;I的范围:1.8; 对角线数组:bj(主对角线),cj(从对角线),根据程序的运行,去决定主从对角线是否放入皇后1.4.3流程图 图1-1 算法流程图1.5详细设计 解析:递归实现n皇后问题。算法分析:数组a、b、c分别用来标记冲突,a数组代表列冲突,从a0a7代表第0列到第7列。如果某列上已经有皇后,则为1,否则为0。数组b代表主对角线冲突,为bi-j+7,即从b0b14。如果某条主对角线上已经有皇后,则为1,否则为0。数组c代表从对角线冲突,为ci+j,即从c0c14。如果某条从对角线上已经有皇后,则为1

6、,否则为0。代码如下:#include static char Queen88;static int a8;static int b15;static int c15;static int iQueenNum=0; /记录总的棋盘状态数void qu(int i); /参数i代表行int main() int iLine,iColumn; /棋盘初始化,空格为*,放置皇后的地方为 for(iLine=0;iLine8;iLine+) aiLine=0; /列标记初始化,表示无列冲突 for(iColumn=0;iColumn8;iColumn+) QueeniLineiColumn=*; /主

7、、从对角线标记初始化,表示没有冲突 for(iLine=0;iLine15;iLine+) biLine=ciLine=0; qu(0); return 0;void qu(int i) int iColumn; for(iColumn=0;iColumn8;iColumn+) if(aiColumn=0&bi-iColumn+7=0&ci+iColumn=0) /如果无冲突 QueeniiColumn=; /放皇后 aiColumn=1; /标记,下一次该列上不能放皇后 bi-iColumn+7=1; /标记,下一次该主对角线上不能放皇后 ci+iColumn=1; /标记,下一次该从对角线

8、上不能放皇后 if(i7) qu(i+1); /如果行还没有遍历完,进入下一行 else /否则输出 /输出棋盘状态 int iLine,iColumn; printf(第%d种状态为:n,+iQueenNum); for(iLine=0;iLine8;iLine+) for(iColumn=0;iColumn8;iColumn+) printf(%c ,QueeniLineiColumn); printf(n); printf(nn); /如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置 QueeniiColumn=*; aiColumn=0; bi-iColumn+7=

9、0; ci+iColumn=0; 1.6调试分析及测试1.6.1 遇到的问题及解决方法 由于对八个皇后放置的位置不能一次确定,而且前一个皇后的放置位置直接影响着后面的放置位置,使程序调试时要花费不少时间。本程序有些代码重复出现,显得程序的有些代码看起来很杂乱。但其中最主要的问题是逻辑错误导致程序死循环或不循环或循环一小部分,但是编译时却没有错误,就是没有正确的输出答案。 1.6.2 算法的时空分析该算法的运行时间和和皇后的放置方法成正比,在最好情况下的时间和空间复杂度均为O(1),在最差情况下均为O(n*n),平均情况在它们之间。1.6.3 程序模块构架本程序模块划分比较合理,且利用指数组存储

10、棋盘,操作方便。至于整体的系统架构,为了简单起见,这样的系统可以分成两个模块,第一个模块是负责模拟问题、提供算法,而另外一个模块则致力于窗口演示,是一个窗体应用程序1.6.4 程序使用说明本程序的运行环境为DOS操作系统 进入演示程序后即显示文本方式的用户界面 进入界面后,就会提示输入字符串的输入形式,在八皇后求解程序中,只要你选择输出解的格式,选择1则显示为每一列皇后的放置的行数,选择2则显示的是以矩阵形式形象的显示皇后的放置位置,选择3则退出程序的调试。在调试结果中,1的位置也就表示了该皇后应该所在的位置,0代表了空位置。1.6.5测试结果 图1-2 初步运行界面 图1-3 位置标明每一行

11、皇后放置的列数 图1-4 位置标明每一行皇后放置的列数 图1-5 视图矩阵形式显示皇后位置第2章 停车场管理问 2.1要解决的问题停车场是一条可以停放n辆车的狭窄通道,且只有一个大门汽车停放安到达时间的先后依次由北向南排列(大门在最南端,最先到达的第一辆车停在最北端)若停车场已经停满n辆车,后来的汽车在便道上等候,一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路,等它开出后其他车在按照原次序开入车场,每两停在车场的车要安时间长短缴费。 要求:以栈模拟停车场,以队列车场外的便道,按照从终端输入的数据序列进行模拟管理。每一组数据包括三个数据项:汽

12、车“到达”或“离去”信息、汽车牌照号码、以及到达或离去的时刻。对每一组数据进行操作后的信息为:若是车辆到达,则输出汽车在停车场的内或便道上的位置:若是车辆离去则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上的停留时间不收费)。栈以顺序结构实现,队列以链表结构实现。2.2基本要求2.2.1解决问题的思路及要求 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车到达或离去信息,汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实

13、现,队列以链表结构实现。2.22对栈的要求需要另设一个栈,临时停放为离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻2.2.3算法流程图 图2-1 算法流程图 2.4算法基本思想描述 由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,我设计用顺序存储结构来存储停车场内的车辆信息,并给车辆按进栈顺序编号,当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场

14、为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。这是个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个堆栈,以之来暂时存放为出站汽车暂时让道的汽车。当停车场满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素设计成汽车的车牌号,并以链表的形式存储。另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆进入停车场时的时间和车辆离开停车场时的时间,然后计算、显示费用情况。

15、2.5概要设计2.5.1栈的抽象数据类型 ADT stack数据对象:D=aiaicharset,I=1,2,,n,n=0数据关系:R1=ai-1,aiai-1,aiD,I=2,n基本操作:Initstack(&S)操作结果:构造一个空栈S。DestroyStack(&S)初始条件:栈S已经存在。操作结果:操作结果:销毁栈S。ClaerStack(&S)初始条件:栈S已经存在。操作结果:将S清空为空栈。StackLength(&S)初始条件:栈S已经存在。操作结果:返回栈S的长度。StackEmpty(&S)初始条件:栈S已经存在。操作结果:若S为空栈,则返回TURE,否则返回FALSE。Ge

16、tTop(S,&e)初始条件:栈S已经存在。操作结果:若栈S不空,则以e返回栈顶元素。Push(&S,e)初始条件:栈S已经存在。操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S,&e)初始条件:栈S已经存在。操作结果:删除S的栈顶元素,并以e返回其值。StackTraverse(S,visit()初始条件:栈S已经存在。操作结果:从栈底到栈顶依次对S中的每个元素调用函数visit( )。ADT stack2.5.2链式队列的抽象数据类型typedef struct Qnode QelemType data; Struct Qnode next;Qnode,QueuePtr;typede

17、f structQueuePtr front; 队头指针QueuePtr rear; 队尾指针ADT Queue数据对象:D=aiaiElemSet,i=1,2,n,n=0数据关系:R1=ai-1,aiai-1,aiD,i=2,n 约定中端为队列头,后端为队列尾。基本操作:InitQueue(&Q)操作结果:构造一个空队列Q。DestroyQueue(&Q)初始条件:队列Q已经存在。操作结果:队列Q被销毁,不再存在。ClearQueue(&Q)初始条件:队列Q已经存在。操作结果:将Q清为空队列。QueueEmpty(Q)初始条件:队列Q已经存在。操作结果:若Q为空队列,则返回TRUE,否则FA

18、LSE。QueueLength(Q)初始条件:队列Q已经存在。操作结果:返回Q的元素个数,即队列的长度。GetHead(Q,&e)初始条件:Q为非空队列。操作结果:用e返回的e队头元素。EnQueue(&Q,e)初始条件:队列Q已经存在。操作结果:插入元素e为Q的新的队尾元素。DeQueue(&Q,&e)初始条件:Q为非空队列。操作结果:删除Q的队头元素,并用e返回其值。QueueTraverse(Q,visit()初始条件:Q已经存在且非空。操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。ADT Queue2.6模块划分2.6.1主程

19、序模块 main() 初始化 while(重复条件) 接受命令; switch(调用条件) Case调用条件A 到达处理;break; Case调用条件D 离开处理;break; Case调用条件E 退出处理; 2.6.2 两个栈模块 实现栈抽象数据类型: 数据对象:D=aiaicharset,I=1,2,,n,n=0 数据关系:R1=ai-1,aiai-1,aiD,I=2,n 2.6.3队列模块 实现队列抽象数据类型 数据对象:D=aiaiElemSet,i=1,2,n,n=0 数据关系:R1=ai-1,aiai-1,aiD,i=2,n约定中端为队列头,后端为队列尾。 2.6.4模块调用关系

20、 图2-2 模块调用关系 栈模块1-模拟停车场 栈模块2-模拟倒车场 队列模块-模拟车道2.7详细设计与源程序2.7.1详细设计以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管理。另设一个栈,临时停放为离去的汽车让路而从停车场退出来的汽车。栈以顺序存储结构实现,队列以链表存储结构实现。停车场栈park模拟停车场。临时栈Aux-park模拟倒车场。便道队列Road模拟停车场外便道。程序运行后,先设定停车时间单位和计费单位,再设定停车场容量(测试数据设定停车场容量n=2)。继续输入车辆数据:车辆属性(到达A或离开D)、车牌号、时间(到达时间或离开时间)。程序根据输入

21、数据中的“车辆属性”进入该属性程序模块。输出车辆停放位置或离开时的收据。然后循环,继续输入车辆数据。当输入车辆数据为E时,程序自动退出。2.7.2部分源程序 停车场问题管理程序代码如下: #include/定义输入输出函数 #include/数据流输入输出 #include/字符串处理 #include/定义数学函数 #include /定义杂项函数及内存分配函数 #define size 2 /停车场位置数 /模拟停车场的堆栈的性质 typedef struct zanlind int number; /汽车车号 int ar_time; /汽车到达时间 zanInode; typedef

22、struct zanInode *base; /停车场的堆栈底 zanInode *top; /停车场的堆栈顶 int stacksize_curren; stackhead; /堆栈的基本操作; void initstack(stackhead &L) /构造一个空栈 L.base=(zanInode*)malloc(size*sizeof(zanlind); if(!L.base)exit(0); /存储分配失败 L.top=L.base; L.stacksize_curren=0; void push(stackhead &L,zanInode e) /把元素e压入L栈成为新的栈顶元素

23、*L.top+=e; L.stacksize_curren+; void pop(stackhead &L,zanInode &e) /把元素e弹出L栈 if(L.top=L.base) cout停车场为空 !; return; e=*(-L.top); L.stacksize_curren-; /模拟便道的队列的性质 typedef struct duilie int number; /汽车车号 int ar_time; /汽车到达时间 struct duilie *next; *queueptr; Typedef struct queueptr front; /便道的队列的队头 queue

24、ptr rear; /便道的队列的队尾 int length; linkqueue; /队列的基本操作 void initqueue(linkqueue &q) /构造一个空队列 2.8调试过程中的问题及系统测试情况2.8.1出现的问题(1)编程过程中忽略头文件的作用,导致漏掉了一个头文件,以致产生下列错误提示。错误提示:error C2065: malloc : undeclared identifier error C2065: exit : undeclared identifier 执行 cl.exe 时出错.在代码中加上#definestdlib.h,解决此问题。(2)没有良好的编程

25、习惯,没有合适的缩进及换行,给程序的调试带来了比较多的困难。(3)编程过程中比较粗心,一些程序结束的分号和成对出现的大括号忘记写。2.8.2运行过程 图2-3 这是停车场系统的登录界面。 图2-4 车辆到达登记信息,为了便于观察,车场内最多可停3辆车,当停车场内已满时,只登记车牌号,然后进入便道上,即进入队列中。 图2-5 分别显示车场内和便道上的车辆信息情况。 图2-6 车场内车辆离开时,输入离开时间,然后计算、显示费用, 如果便道上有车,则显示要进入车场内的车牌号码,同时登记时间。 课程设计心得体会过这次数据结构课程设计,我认识到从课本上学到的知识是远远不够的。本次设计使我深入的了解了栈与

26、队列的建立、插入、删除和在实际问题下灵活运用它们,另一方面使我对栈和队列的抽象数据类型有了进一步的认识。例如:关于停车场问题的,总体来说,这个题目还是比较简单的,主要是运用了栈和队列的一些知识和操作。也没有用到其他太多的数据结构知识。程序基本上还是能够运行,结果也正确,能够实现那些基本的车辆到达、离开、收费、遍历显示等主要功能。但我觉得这个程序还有很多小的地方是可以完善的,比如:在输入登记车辆到达时间的时候,没有相关的小时、分钟数字的限制范围(小时 023,分钟 060);这就使程序不那么健壮了,还有,在计算收费时如果离开时间是到了第二天了,这样就可能会导致收费时负的或减少很多。就是说,还应该

27、算天数,要不就要规定只能当天停,当天开走。我改了几次改不好,又鉴于程序要求中也没有提及,所以我也就没去该了。只要能实现主要的功能就好了。 我的收获如下(1)巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。(2)培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。(3)通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法。(4)通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。 根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。更让我懂得

28、实践是检验和掌握真理的最好办法。2、写程序的过程中要考虑周到,严密。3、在做设计的时候要有信心,有耐心,切勿浮躁。4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。 6、虽然经过努力终于把该系统完成,可是该系统还是不完善,程序中的一些算法还不是很清楚,只不过把简单的功能实现了出来,这些缺憾归根结底都是因为我的C+语言和数据结构的水平还不是很高 ,还需要经过不懈的努力才能做出比较完善的系统。这次课程设计让我明白要真正的掌握一门编程语言需要的不仅仅是课本上的东西,还要在实际的编程过程

29、中慢慢的掌握其中的奥妙。同时我明白了,要成为一名优秀的编程人员所要具备的各种条件(坚实的编程语言基础、熟练的调试程序的技能、重要的是要有耐心、同时细心也是不可缺少的)。所以为了自己的梦想,在以后的学习过程中,我要不断的充实自己,努力的学习。通过这次课程设计,对数据结构的特点以及存储表示方式的认识有了明显的提高,同时还对在具体应用中选择合适的数据结构和存储结构的能力有了进一步的提升。 参考文献1. 吕凤哲,C+语言程序设计(第二版).北京:电子工业出版社,20052. 耿国华等著,数据结构C语言描述,西安电子科技大学出版社3. 苏仕华,数据结构课程设计.-北京:机械工业出版社,2005.54 严蔚敏,吴伟民主编. 数据结构(C语言版).清华大学出版社. 2002 5 殷人昆等著. 数据结构(C+版). 清华大学出版社. 20016 金远平著. 数据结构(C+描述). 清华大学出版社. 2005 7 许卓群等著. 数据结

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

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