数据结构专业课程设计方案报告范例.doc
《数据结构专业课程设计方案报告范例.doc》由会员分享,可在线阅读,更多相关《数据结构专业课程设计方案报告范例.doc(19页珍藏版)》请在咨信网上搜索。
课程设计汇报 课程名称: 数据结构 课题名称: 迷宫问题 姓 名: 吴明华 学 号: 16020239 院 系: 计算机学院通信和信息工程系 专业班级: 通信112 指导老师: 周坚和 完成日期: 12月15日 目 录 第1部分 课程设计汇报…………………………………………………………3 第1章 课程设计目标…………………………………………………3 第2章 课程设计内容和要求…………………………………………4 2.1 问题描述………………………………………………4 2.2 设计要求………………………………………………4 第3章 课程设计总体方案及分析……………………………………4 3.1 问题分析………………………………………………4 3.2 概要设计………………………………………………7 3.3 具体设计………………………………………………7 3.4 调试分析………………………………………………10 3.5 测试结果………………………………………………10 3.6 参考文件………………………………………………12 第2部分 课程设计总结…………………………………………………………13 附录(源代码)……………………………………………………………………14 第1部分 课程设计汇报 第1章 课程设计目标 仅仅认识到队列是一个特殊线性表是远远不够,此次实习目标在于使学生深入了解队列特征,方便在实际问题背景下灵活利用它,同时还将巩固这种数据结构结构方………………………………………………………………………………………………………………………………………………………………………………………..(省略) 第2章 课程设计内容和要求 2.1问题描述: 迷宫问题是取自心理学一个古典试验。在该试验中,把一只老鼠从一个无顶大盒子门放入,在盒子中设置了很多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻求道路以抵达出口。对同一只老鼠反复进行上述试验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过数次试验最终学会走通迷宫路线。设计一个计算机程序对任意设定矩形迷宫以下图A所表示,求出一条从入口到出口通路,或得出没有通路结论。 图A 2.2设计要求: 要求设计程序输出以下: (1) 建立一个大小为m×n任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来; (2)找出一条通路二元组(i,j)数据序列,(i,j)表示通路上某一点坐标。 (3)用一个标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功效可用菜单选择。 第3章 课程设计总体方案及分析 3.1 问题分析: 1.迷宫建立: 迷宫中存在通路和障碍,为了方便迷宫创建,可用0表示通路,用1表示障碍,这么迷宫就能够用0、1矩阵来描述, 2.迷宫存放: 迷宫是一个矩形区域,能够使用二维数组表示迷宫,这么迷宫每一个位置全部能够用其行列号来唯一指定,不过二维数组不能动态定义其大小,我们能够考虑先定义一个较大二维数组maze[M+2][N+2],然后用它前m行n列来存放元素,即可得到一个m×n二维数组,这么(0,0)表示迷宫入口位置,(m-1,n-1)表示迷宫出口位置。 注:其中M,N分别表示迷宫最大行、列数,本程序M、N缺省值为39、39,当然,用户也可依据需要,调整其大小。 3.迷宫路径搜索: 首先从迷宫入口开始,假如该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。不然搜索其上、下、左、右位置是否是障碍,若不是障碍,就移动到该位置,然后再从该位置开始搜索通往出口路径;若是障碍就选择另一个相邻位置,并从它开始搜索路径。为预防搜索反复出现,则将已搜索过位置标识为2,同时保留搜索痕迹,在考虑进入下一个位置搜索之前,将目前位置保留在一个队列中,假如全部相邻非障碍位置均被搜索过,且未找到通往出口路径,则表明不存在从入口到出口路径。这实现是广度优先遍历算法,假如找到路径,则为最短路径。 以矩阵 0 0 1 0 1 为例,来示范一下 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 首先,将位置(0,0)(序号0)放入队列中,其前节点为空,从它开始搜索,其标识变为2,因为其只有一个非障碍位置,所以接下来移动到(0,1)(序号1),其前节点序号为0,标识变为2,然后从(0,1)移动到(1,1)(序号2),放入队列中,其前节点序号为1,(1,1)存在(1,2)(序号3)、(2,1)(序号4)两个可移动位置,其前节点序号均为2.对于每一个非障碍位置,它相邻非障碍节点均入队列,且它们前节点序号均为该位置序号,所以假如存在路径,则从出口处节点位置,逆序就能够找到其从出口到入口通路。 以下表所表示: 0 1 2 3 4 5 6 7 8 9 10 (0,0) (0,1) (1,1) (1,2) (2,1) (2,2) (1,3) (2,3) (0,3) (3,3) (3,4) -1 0 1 2 2 3 4 5 6 7 9 由此能够看出,得到最短路径:(3,4)(3,3)(2,3)(2,2)(1,2)(1,1)(0,1)(0,0) 搜索算法步骤图以下所表示: 3.2 概要设计 1.①构建一个二维数组maze[M+2][N+2]用于存放迷宫矩阵 ②自动或手动生成迷宫,即为二维数组maze[M+2][N+2]赋值 ③构建一个队列用于存放迷宫路径 ④建立迷宫节点struct point,用于存放迷宫中每个节点访问情况 ⑤实现搜索算法 ⑥屏幕上显示操作菜单 2.本程序包含10个函数: (1)主函数 main() (2)手动生成迷宫函数 shoudong_maze() (3)自动生成迷宫函数 zidong_maze() (4)将迷宫打印成图形 print_maze() (5)打印迷宫路径 (若存在路径) result_maze() (6)入队 enqueue() (7)出队 dequeue() (8)判定队列是否为空 is_empty() (9)访问节点 visit() (10)搜索迷宫路径 mgpath() 3.3 具体设计 实现概要设计中定义全部数据类型及操作伪代码算法 1. 节点类型和指针类型 迷宫矩阵类型:int maze[M+2][N+2];为方便操作使其为全局变量 迷宫中节点类型及队列类型:struct point{int row,col,predecessor} que[512] 2. 迷宫操作 (1)手动生成迷宫 void shoudong_maze(int m,int n) {定义i,j为循环变量 for(i<=m) for(j<=n) 输入maze[i][j]值 } (2)自动生成迷宫 void zidong_maze(int m,int n) {定义i,j为循环变量 for(i<=m) for(j<=n) maze[i][j]=rand()%2 //因为rand()产生随机数是从0到RAND_MAX,RAND_MAX是定义在stdlib.h中,其值最少为32767),要产生从X到Y数,只需要这么写:k=rand()%(Y-X+1)+X; } (3)打印迷宫图形 void print_maze(int m,int n) {用i,j循环变量,将maze[i][j]输出 □、■} (4)打印迷宫路径 void result_maze(int m,int n) {用i,j循环变量,将maze[i][j]输出 □、■、☆} (5)搜索迷宫路径 ①迷宫中队列入队操作 void enqueue(struct point p) {将p放入队尾,tail++} ②迷宫中队列出队操作 struct point dequeue(struct point p) {head++,返回que[head-1]} ③判定队列是否为空 int is_empty() {返回head==tail值,当队列为空时,返回0} ④访问迷宫矩阵中节点 void visit(int row,int col,int maze[41][41]) {建立新队列节点visit_point,将其值分别赋为row,col,head-1,maze[row][col]=2,表示该节点以被访问过;调用enqueue(visit_point),将该节点入队} ⑤路径求解 void mgpath(int maze[41][41],int m,int n) {先定义入口节点为struct point p={0,0,-1},从maze[0][0]开始访问。假如入口处即为障碍,则此迷宫无解,返回0 ,程序结束。不然访问入口节点,将入口节点标识为访问过maze[p.row][p.col]=2,调用函数enqueue(p)将该节点入队。 判定队列是否为空,当队列不为空时,则运行以下操作: { 调用dequeue()函数,将队头元素返回给p, 假如p.row==m-1且p.col==n-1,即抵达出口节点,即找到了路径,结束 假如p.col+1<n且maze[p.row][p.col+1]==0,说明未到迷宫右边界,且其右方有通路,则visit(p.row,p.col+1,maze),将右边节点入队标识已访问 假如p.row+1<m且maze[p.row+1][p.col]==0,说明未到迷宫下边界,且其下方有通路,则visit(p.row+1,p.col,maze),将下方节点入队标识已访问 假如p.col-1>0且maze[p.row][p.col-1]==0,说明未到迷宫左边界,且其左方有通路,则visit(p.row,p.col-1,maze),将左方节点入队标识已访问 假如p.row-1>0且maze[p.row-1][p.col]==0,说明未到迷宫上边界,且其上方有通路,则visit(p.row,p.col+1,maze),将上方节点入队标识已访问 } 访问到出口(找到路径)即p.row==m-1且p.col==n-1,则逆序将路径标识为3即maze[p.row][p.col]==3; while(p.predecessor!=-1) {p=queue[p.predecessor]; maze[p.row][p.col]==3;} 最终将路径图形打印出来。 3.菜单选择 while(cycle!=(-1)) ☆ 手动生成迷宫 请按:1 ☆ 自动生成迷宫 请按:2 ☆ 退出 请按:3 scanf("%d",&i); switch(i) { case 1:请输入行列数(假如超出预设范围则提醒重新输入) shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); case 2 :请输入行列数(假如超出预设范围则提醒重新输入) zidong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); case 3:cycle=(-1); break; } 注:具体源代码见附录 3.4 调试分析 在调试过程中,首先使用是栈进行存放,不过产生路径是多条或不是最短路径,所以经过算法比较,改用此算法 3.5 测试结果 1.手动输入迷宫 2.自动生成迷宫 3.6 参考文件 【1】 严蔚敏 吴伟民 《数据结构(C语言版)》 清华大学出版社, 9月 【2】 谭浩强 《C程序设计(第三版)》 清华大学出版社 1月 第2部分 课程设计总结 经过这段时间课程设计,本人对计算机应用,数据结构作用和C语言使用全部有了更深了解。尤其是C语言进步让我深刻感受到任何所学知识全部需要实践,没有实践就无法真正了解这些知识和掌握它们,使其成为自己财富。在理论学习和上机实践各个步骤中,经过自主学习和请教老师,我收获了不少。当然也碰到不少问题,也正是因为这些问题引发思索给我带了收获。从当初不喜爱上机写程序到现在能主动写程序,从当初拿着程序不只怎样下手到现在知道怎样分析问题,怎样用专业知识处理实际问题转变,我发觉不管是专业知识还是动手能力,自己全部有很大程度提升。在这段时间里,我对for、while等循环函数使用方法愈加熟悉,逐步形成了很好编程习惯。在老师指导帮助下,同学们课余时间讨论中,这些问题全部一一得到了处理。在程序调试能力上,无形中得到了很多提升。比如:头文件使用,变量和数组范围问题,定义变量时出现问题等等。 在实际上机操作过程中,不仅是让我们了解数据结构理论知识,更关键是培养处理实际问题能力,所以相信经过此次实习能够提升我们分析设计能力和编程能力,为后续课程学习及实践打下良好基础。 在这次短短课程实践里,我们得到了**老师关心和帮助。她给了我们很多信息,和我们一起探讨问题,问询我们碰到了哪些问题并耐心给指导。当我们碰到技术上难以处理问题时,她就会指导我们处理问题,她把自己多年来积累经验教授给我们,使我们顺利地完成了课程实践任务。时间过得真快,大学生活不知不觉就走过了十二个月,十二个月大学学习和课程实践阶段提升,使我们本身知识得到提升同时,也增强了我们对未来工作信心,我们相信自己未来三年学习更使我们有能力胜任未来工作。 附 录 #include"stdlib.h" #include"stdio.h" #define N 39 #define M 39 int X; int maze[N+2][M+2]; struct point{ int row,col,predecessor; }queue[512]; int head=0,tail=0; void shoudong_maze(int m,int n){ int i,j; printf("\n\n"); printf("请按行输入迷宫,0表示通路,1表示障碍:\n\n"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%d",&maze[i][j]); } void zidong_maze(int m,int n){ int i,j; printf("\n迷宫生成中……\n\n"); system("pause"); for(i=0;i<m;i++) for(j=0;j<n;j++) maze[i][j]=rand()%2; //因为rand()产生随机数是从0到RAND_MAX //RAND_MAX是定义在stdlib.h中,其值最少为32767) //要产生从X到Y数,只需要这么写:k=rand()%(Y-X+1)+X; } void print_maze(int m,int n){ int i,j; printf("\n迷宫生成结果以下:\n\n"); printf("迷宫入口\n"); printf("↓"); for(i=0;i<m;i++) {printf("\n"); for(j=0;j<n;j++) {if(maze[i][j]==0) printf("□"); if(maze[i][j]==1) printf("■");} } printf("→迷宫出口\n"); } void result_maze(int m,int n){ int i,j; printf("迷宫通路(用☆表示)以下所表示:\n\t"); for(i=0;i<m;i++) {printf("\n"); for(j=0;j<n;j++) {if(maze[i][j]==0||maze[i][j]==2) printf("□"); if(maze[i][j]==1) printf("■"); if(maze[i][j]==3) printf("☆"); } } } void enqueue(struct point p){ queue[tail]=p; tail++; } struct point dequeue(){ head++; return queue[head-1]; } int is_empty(){ return head==tail; } void visit(int row,int col,int maze[41][41]){ struct point visit_point={row,col,head-1}; maze[row][col]=2; enqueue(visit_point); } int mgpath(int maze[41][41],int m,int n){ X=1; struct point p={0,0,-1}; if(maze[p.row][p.col]==1) {printf("\n===============================================\n"); printf("此迷宫无解\n\n");X=0;return 0;} maze[p.row][p.col]=2; enqueue(p); while(!is_empty()) {p=dequeue(); if((p.row==m-1)&&(p.col==n-1)) break; if((p.col+1<n)&&(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze); if((p.row+1<m)&&(maze[p.row+1][p.col]==0)) visit(p.row+1,p.col,maze); if((p.col-1>=0)&&(maze[p.row][p.col-1]==0)) visit(p.row,p.col-1,maze); if((p.row-1>=0)&&(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze); } if(p.row==m-1&&p.col==n-1) {printf("\n==================================================================\n"); printf("迷宫路径为:\n"); printf("(%d,%d)\n",p.row,p.col); maze[p.row][p.col]=3; while(p.predecessor!=-1) {p=queue[p.predecessor]; printf("(%d,%d)\n",p.row,p.col); maze[p.row][p.col]=3; } } else {printf("\n=============================================================\n"); printf("此迷宫无解!\n\n");X=0;} return 0; } void main() {int i,m,n,cycle=0; while(cycle!=(-1)) { printf("********************************************************************************\n"); printf(" 欢迎进入迷宫求解系统\n"); printf(" 设计者:李娜娜。高玮芳 \n"); printf("********************************************************************************\n"); printf(" ☆ 手动生成迷宫 请按:1\n"); printf(" ☆ 自动生成迷宫 请按:2\n"); printf(" ☆ 退出 请按:3\n\n"); printf("********************************************************************************\n"); printf("\n"); printf("请选择你操作:\n"); scanf("%d",&i); switch(i) {case 1:printf("\n请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); while((m<=0||m>39)||(n<=0||n>39)) {printf("\n抱歉,你输入行列数超出预设范围(0-39,0-39),请重新输入:\n\n"); printf("请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); } shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); printf("\n\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break; case 2:printf("\n请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); while((m<=0||m>39)||(n<=0||n>39)) {printf("\n抱歉,你输入行列数超出预设范围(0-39,0-39),请重新输入:\n\n"); printf("请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); } zidong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); printf("\n\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break; case 3:cycle=(-1);break; default:printf("\n");printf("你输入有误!\n"); printf("\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break; } } }- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 专业课程 设计方案 报告 范例
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文