迷宫课程设计报告.docx
- 文档编号:27098901
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:44
- 大小:359.03KB
迷宫课程设计报告.docx
《迷宫课程设计报告.docx》由会员分享,可在线阅读,更多相关《迷宫课程设计报告.docx(44页珍藏版)》请在冰豆网上搜索。
迷宫课程设计报告
课程设计报告(论文)
报告(论文)题目:
迷宫问题
哈夫曼编码/译码实现
作者所在系部:
计算机科学与工程系
作者所在专业:
网络工程
所在班级:
作者姓名:
作者学号:
指导教师姓名:
完成时间:
北华航天工业学院教务处制
摘要
在当前的市场经济体制下,企业要想提高市场的竞争力,不但要有好的产品,同时也要有好的信息查询系统,以实现企业高效率的管理及查询。
在本次课程设计中,主要解决的问题就是迷宫问题和利用创建的哈夫曼树进行编码/译码,运用C++语言编写的程序。
在迷宫问题中,可由操作者自己设计迷宫的内部构造,迷宫的入口点已被社定。
操作者自己社定迷宫出口点,当操作者输入的出口点超出迷宫本身的时候,做出提示:
输入有误,请操作者再次输入迷宫出口点。
根据操作者输入的出口点求出走出迷宫的一条路径。
如果能走出迷宫,再求解最短路径。
操作者可再次设置迷宫的出口点,采取相同的操作。
该程序已经过全面的系统测试,能够很好的运行,达到了预期的效果。
哈夫曼编码/译码系统主要有五个功能模块:
1:
创建哈夫曼树;2:
打印哈夫曼编码规则;3:
规则根据编码规则进行编码,并将编码保存在D:
code1file.dat文件中;4:
对保存在code1file.dat文件中的二进制代码进行译码,并将译码保存在D:
code2file.dat文件中;5:
打印哈夫曼编码。
该程序已经过全面的系统测试,能够很好的运行,达到了预期的效果。
例如:
无效数字的输入本系统的自动判断,按照不同的关键字输出结果,人性化的输入界面(包括输入提示,错误提示等等)。
在下面各章节的介绍中,你会了解到各程序的具体设计与实现,介绍中包括系统需求分析,概要设计,详细设计,调试分析以及测试记过等。
此次程序设计使我们进一步了解C++的精华之处及数据结构的一些编程思想。
C++是优秀的计算机程序设计语言,它的功能相当的强大。
C++是程序设计员必备的一种语言,本次课程设计帮助我们深入的了解了C++的精髓所在,为我们以后的学习打下了坚实的基础。
当今,很难找出一个不需要应用计算机的领域,这就意味着几乎所有技术人员都需要学会使用计算机。
对计算机了解的深度,不同领域、不同岗位上的工作人员有不同的要求。
学习计算机程序设计主要就是要应用于现实社会生活中。
应用程序设计使我们更好的管理生活,提高自己的生活水平。
关键词:
栈队列二维数组哈夫曼树哈夫曼编码二叉树
目录
摘要II
第1章绪论1
1.1课程设计选题的目的1
1.2课程设计选题的背景和意义1
1.3课题研究的主要内容2
第2章系统需求分析3
2.1输入/输出形式和输出值的范围3
2.2程序功能4
2.3测试数据4
第3章概要设计7
3.1设计思想7
3.2实现方法7
3.3函数间的关系7
第4章详细设计8
4.1实现定义的数据类型8
4.2实现定义操作伪代码算法8
第5章问题描述及解决方案10
5.1问题描述10
5.2问题的解决方案10
第6章测试并列出测试结果10
第7章总结14
7.1设计体会14
7.2结束语14
致谢15
参考文献16
附录17
(1)迷宫问题17
(2)哈弗曼编码与译码21
第1章绪论
随着信息产业的飞速发展,信息化管理已经引入并应用到各行业管理领域,各种形式的百货商场、大型仓储超市、便利店、连锁超市和专卖店等形式的零售业鳞次栉比,不断改变、影响着人们的价值观念和生活方式。
因此,要提升企业竞争力,就要大力推进企业信息化建设,利用先进的办公自动化系统来实现企业内部信息管理、共享及交流,才能使企业在竞争激烈的21世纪取得先机。
1.1课程设计选题的目的
为大家解决一些生活中实际的问题,在这个过程中,编程人员自身的能力也在不断地提高。
此次程序设计综合运用所学知识解决实际问题,将课堂的书本知识有效的在程序中体现出来,让学生更理解了C++功能之强大,进一步让学生对面向对象的方法以及C++的编程思想有了较好了解和认识。
此外,此次设计培养独立开发、设计、调试、运行程序的能力,激发了学生较强的自学兴趣,锻炼学生之间以及学生与老师的交通能力,培养学生合作精神,让学生更好的认识到合作的重要性,使学生在今后的学习中加强对合作精神的培养。
1.2课程设计选题的背景和意义
1.2.1课程设计的背景
(1)迷宫问题
儿童智力游戏的一种,同时也锻炼人的思维能力。
当我们在一个迷宫中时怎样避免重复的走一些路,避免怎样走投无路,无路可走,什么样的迷宫可走,怎样就知道迷宫无出口了,通过回溯法帮我们解答,动脑子想办法,看看计算机是怎么实现以最快的方式走出你设的迷宫的。
(2)哈夫曼编码/译码实现
在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。
在传送电文时,人们总希望传送时间尽可能短,这就要求电文代码尽可能短。
让出现频率高的(或权值大的)字符采用尽可能短的编码,出现频率低的字符采用稍长的编码,构造一种不等长编码。
哈弗曼树可用于构造使电文的编码总长最短的编码方案,利用其进行编码及译码能够是问题得以以最好方案解决。
1.2.2课程设计的意义
一般来说,课程设计要比教学实验复杂一些,涉及的深度深,而且更加实用些。
其目的是通过课程设计的综合训练,培养学生分析解决实际问题和编程等动手能力,最终目标是想通过这种形式,帮助同学系统掌握C++这门课程的主要内容,使老师更好的完成教学任务。
结合实际应用的要求,使课程设计既覆盖教学所要求的知识点,又接近工程的实际需要,训练自己实际分析问题和解决问题以及编程的能力。
通过详细的实例分析,循环渐进的描述,启发学生顺利的完成设计。
课程设计将设计要求、需求分析、算法设计、编程和实例测试运行分开,为学生创造分析问题、独立思考的条件。
只要学生在吃透要求和算法的前提下,完全可以不按书中提示的参考程序,自己设计出更具有特色的程序。
1.3课题研究的主要内容
1)迷宫问题
要求完成构造迷宫,输入入口出口,输出迷宫路径。
功能要求如下:
1.构建迷宫:
可以系统构建,也可以用户自己构建,输入1为不通,输入0为通路。
显示构建好的迷宫。
2.输出路径:
输入入口与出口,利用编好的函数对迷宫进行试探,有路径输出路径,无路径提示用户此迷宫无出口。
3.最短路径:
输出走出此迷宫的最短路径,即不用走回头路的一条路径。
4.要求系统有一定的容错性,给用户必要的提示。
2)哈夫曼编码/译码实现
要求完成发送端对待传送数据的编码和接收端对传送来的数据的译码。
功能要求如下:
1.接收原始数据:
从终端输入字符集大小为n,即n个字符和n个权值,建立哈夫曼树。
2.编码:
利用已建立好的哈夫曼树对输入的原文进行编码,结果存入code1file.dat文件中,同时输出到屏幕。
3.译码:
利用已编码的对译文(codefile.dat中的文本)进行译码,结果存入code2file.dat文件中,同时输出到屏幕。
4.打印编码规则:
即字符与编码的一一对应关系
5.打印哈夫曼树:
将建立的哈夫曼树用某种树的存储方式存储后输出。
第2章系统需求分析
2.1输入/输出形式和输出值的范围
2.1.1输入/输出形式的范围
(1)迷宫中建立数组时,首先输入迷宫的行数和列数。
边围规定为1,在程序中已赋值,内围用0、1输入,不用其他的数字,若输入错误会提示重新输入;然后选择系统创建的迷宫还是自己创建迷宫,输入选项1或2(输入其他选项按2处理);迷宫创建好后,输入入口和出口坐标(入口必须为通路即0,否则系统会报错,重新输入),找到路径或无路径;接下来会提示寻找其他路径还是退出次迷宫,输入1或2进行选择;选择1,则继续输入迷宫入口和出口,选择2或其他,则退出。
若还想创建别的迷宫就在接下来输入y或Y,输入其他则退出程序。
(2)在哈夫曼编码/译码实现程序中,先输入结点个数,然后根据提示分别输入五个字符(若输入数字,按字符处理),系统会根据系统的功能自动生成输入字符的哈弗曼码。
以上内容会存入文件里,若创建二叉树存储,则可再接下来的提示下输入y或Y,其他输入代表不创建;若存储则显示二叉树中序遍历的结果,接下来要求输入一串字符串,对其进行编码,要求输入已被编码的字符,若超出范围则提示该字符输入有误;若想继续编码则再下面的提示下选择y或Y,直至不选进入下一项译码过程,输入0、1码,若输入其他数字或0、1码不匹配则显示0、1码输入有误,会请重新输入,输入正确会保存到相应文件里;若继续译码选y或Y,直至不选则退出这一层;若想继续体验编码译码在接下来选择y或Y,重复上面的过程,输入其他退出程序。
2.1.2输出值的范围
(1)在迷宫设计中若输入出口超出迷宫大小,即为无路径;输出无限制。
(2)在哈夫曼编码/译码实现程序中,哈弗曼编码长度MAXBIT设为了12,字符个数,编码个数MAXNODE设为了15。
2.2程序功能
(1)迷宫问题
在迷宫问题中,可由操作者自己设定迷宫大小,迷宫内部构造有两个选择,系统设计,节省时间,也可由操作者自己设计,自己迷宫入口和出口并能保证入口为通路,若有路径会显示其路径并显示最短路径。
一个迷宫有不同入口和出口,可寻求多条路径。
(2)哈夫曼编码/译码实现
对输入字符按其ASC码进行编码,并保存至文件,可创建二叉树存储,并对其进行中序遍历,输入已编码字符能够对其进行编码,输入相应0、1码能够将其译成字符。
输入字符不能为重复的,若为重复的可判别出,提示输入不同字符。
2.3测试数据
2.3.1正确的输入及输出结果
(1)迷宫问题
(2)哈夫曼编码/译码实现
第3章概要设计
3.1设计思想
(1)迷宫中用回溯法从八个方向向前试探,用队列保存探测到的通路,建立一个数组模拟迷宫,将各个函数结合在一起。
(2)哈弗曼编码中先按字符权重大小排序在建立哈弗曼树,进而完成编码;译码时,将编好的编码与字符由文件传到两个字符串中,进而译码。
3.2实现方法
(1)迷宫中定义move数组,从东顺时针探测;进队出队完成探测;自己创建maze数组,并输入入口点和出口点,再进行计算。
(2)哈弗曼编码中,将用户输入字符存入声明好的结构变量数组HuffNode[]中,在进入排序函数,建立好哈弗曼树,进而编码;译码时定义string类型的变量s1[],s2[],字符存入s1中,编码存入s2中,进入进行译码。
3.3函数间的关系
(1)迷宫问题
(2)哈弗曼编码与译码
第4章详细设计
4.1实现定义的数据类型
(1)迷宫数组定义为结构体包含两个整型数据,迷宫出口和入口的值定义为整型。
(2)迷宫内部的设计时各坐标点设置成栈内整型。
(3)迷宫中求最短路径时定义结构体类型表示队列,包含整型坐标点,和整型下标;又有整型的队首尾指针。
(4)哈弗曼树定义成结构体类型,包含1个字符型变量表示字符也表示权重和3个整型变量分别表示双亲,左孩子,右孩子。
(5)哈弗曼编码定义为结构体类型,包含存放编码的整型数组和编码的起始位置。
(6)二叉树定义为结构体类型包含字符串类型的结点信息,和二叉树指针类型的左孩子右孩子。
4.2实现定义操作伪代码算法
(1)迷宫问题
求一般路径伪代码:
while(栈不空){
栈顶元素=>(x,y,d)
出栈;
求出下一个要试探的方向d++;
while(还有剩余试探方向){
if(d方向可走){
(x,y,d)入栈;
求新点坐标(i,j);
将新点(i,j)切换成当前点(x,y);
if((x,y)==(m,n))
结束;
else
重置d=0;
}
elsed++;
}}
求解最短路径伪代码:
(x,y)入队;
while(队列不为空)
{队首元素出队;
for(方向为0;方向<总方向数;改变方向)
{到达点坐标;
if(此坐标点为通路)
入队;
if(到达出口点)
{输出路径;
恢复迷宫;}
}
当前点搜索完,取下一点搜索;
}
(2)哈弗曼编码与译码
编码伪代码:
for(i=0;i<结点数;i++)
{
start=n-2;//从这一位开始记录编码,start为编码的开始位置;
c=i;
p=HuffNode[c].parent;
while(p!
=-1)//不为根结点时;
{
if(HuffNode[p].lchild==c)//左孩子记为0,右孩子记为1;
HuffCode[i].bit[start]=0;
else
HuffCode[i].bit[start]=1;
start--;//进行下一位编码;
c=p;
p=HuffNode[c].parent;//走下一个结点;
}
HuffCode[i].start=start+1;//记录编码开始位置;
}
哈弗曼译码伪代码:
for(i=0;i str.replace(i,1,"*");//从第i个位置开始,每次取一个字符,换成* for(i=k;i>=0;i--)//从最后一个字符开始i=k { t=1;//标记; while(t! =-1)//若找不到t=-1; { t=s.find(s2[i]);//t记录s2[]字符串中第一个字符的在s中的下标 if(t! =-1) { str.replace(t,s2[i].length(),s1[i]);//用权值替换相应的0、1码 s.replace(t,s2[i].length(),"*");//用*替换每个0、1码串 } } } 第5章问题描述及解决方案 5.1问题描述 (1)迷宫问题,方向设置,路径存储,迷宫图的存储,路径的求解,出口入口的设置。 (2)哈弗曼编码\译码中,哈弗曼树的建立,二叉树存储的实现,编码译码的实现。 5.2问题的解决方案 (1)迷宫问题中,采用move数组存储方向,采用二维数组存储迷宫图,采用栈存储路径,采用队列算出最短路径,参数传递出口入口和迷宫的大小。 (2)哈弗曼编码\译码中,用静态链表建立哈弗曼树,利用哈弗曼树进行编码,用字符串之间的互换进行译码。 并以静态链表为基础,建立二叉树存储,并中序遍历。 第6章测试并列出测试结果 (1)迷宫问题 (2)哈弗曼编码/译码 第7章总结 7.1设计体会 7.1.1系统的优点 (1)迷宫问题中,突出优点为采用了时间随机函数,系统自动生成迷宫,节约用户时间。 此外,用两种不同的存储方式(栈和队列)对迷宫进行探究。 界面清晰、通俗易懂、操作简便、结构严谨、逻辑习惯强。 (2)哈弗曼编码译码,可多次对不同字符集进行编码译码,并有一定的容错能力。 7.1.2本系统的不足 (1)对于迷宫问题,输入迷宫内部结构时,输入形式为0、1空格或回车,输入形式有误时,会使程序无法运行下去,有时还会进入死循环。 输入入口坐标时,没有容错,若大于迷宫规模,程序会出错。 (2)哈弗曼编码和译码中,没有明确的菜单,只能按程序一直进行下去,直至退出再开始,即编码完后进入译码状态就无法再返回进行编码了,这一点有待改进。 7.1.3可改进的地方 (1)各个菜单界面可以设计的更为美观,更简洁易懂。 (2)可以从各个方面考虑设置容错机制使程序更健壮。 7.2结束语 课设中感受到自己知识的匮乏,需要学习的东西很多,不能总是局限于书本,在课设期间养成了经常去图书馆查阅的习惯,这个习惯应该继续保持下去,此外,当出现问题时,应该及时与周围同学交流,多交流才能使学到的东西更深入到心里,总之,这是一次不错的锻炼,专业水平不说能提高什么,但在过程中学到的学习方法应该是能受益终生的! 致谢 在心里总是想感谢几个人。 在课设过程中,由于自己时间安排不当与专业基础知识的不扎实,课程设计的时间总是感觉不够,在课设中也遇到了很多困难,好多时候都想止步不前,但因为有身边的这群人,助我度过难关,有的鼓励我,有的引导我,我也渐渐放平心境,学会怎么去思考,怎么去解决遇到的问题,怎么让程序运行起来,其实我们都是学生,但是他们比我做的好,我应该向他们学习的,学习面对困难的态度与理智,学习坚韧的品行…两周课设结束了,但感觉收获了很多,不仅仅是任务完成了,更让我了解到身边这群值得我珍惜的朋友是多么的难得。 这仅仅是一个小小的课设其实,以后还要面对各种各样的更大的困难与逆境,只要坚持,找到正确的方法,相信一切都会克服的。 参考文献 [1]周霭如,林伟健C++程序设计基础北京: 电子工业出版社 [2]MarkAllenWeiss.数据结构与算法分析C++描述.北京: 人民邮电出版社,2007.1 [3]严蔚敏,吴伟民.数据结构: C语言版.北京: 清华大学出版社,1997 [4]耿国华.数据结构.北京: 高等教育出版社,2005 [5]姚伯元.课程设计(论文)规范化管理与培养学生综合素质.中国高等教育网教学研究,2005-2-2. [6]朱明方,吴及.数据结构教程.北京: 机械工业出版社,2007.1 附录 (1)迷宫问题 123.h #include #include #include #include #include usingnamespacestd; typedefstruct { intx,y; }item; typedefstruct { intx,y,d; }Datetype; typedefstack voidpath(int**maze,int,int,int,int); voidprintpath(); 操作.cpp #include"123.h" #defineNUM100//队列大小; typedefstruct{ intx,y;//所到点的坐标; intpre;//前驱点的下标; }SqType;//队列; intfront,rear;//队首指针与队尾指针; voidprintpath(SqTypesq[],int){//打印路径 inti; i=rear; do{ cout<<"("< i=sq[i].pre;//回溯; }while(i! =-1); } voidrestore(int**maze,intm,intn){//恢复迷宫 for(inti=1;i<=m;i++){ for(intj=1;j<=n;j++){ if(maze[i][j]==-1) maze[i][j]=0; } } } intpath1(int**maze,intm,intn,intc,intd,intx1,inty1)//最短路径 {//m,n为迷宫的长和宽,c,d为迷宫入口坐标,x1,y1为迷宫出口坐标;maze为迷宫; itemmove[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};//坐标增量数组; SqTypesq[NUM]; intx,y,i,j,v; front=rear=0; sq[0].x=c; sq[0].y=d; sq[0].pre=-1; if(maze[c][d]==0) maze[c][d]=-1;//入口点入队; elsegotoG; while(front<=rear){//队列不为空 x=sq[front].x; y=sq[front].y; for(v=0;v<8;v++){ i=x+move[v].x; j=y+move[v].y; if(maze[i][j]==0){ rear++; sq[rear].x=i; sq[rear].y=j; sq[rear].pre=front; maze[i][j]=-1;//访问过的坐标点,入队; } if(i==x1&&j==y1){ cout<<"最短路径为: "< printpath(sq,rear);//输出路径; restore(maze,m,n);//恢复迷宫; return1; } }//forv; front++;//当前点搜索完,取下一个点搜索 }//while G: cout<<"无路径。 "< return0; } voidpath(int**maze,inta,intb,intm,intn) { itemmove[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; stack_intst; Datetypetemp; intx,y,d,i,j; if(maze[a][b]==1){cout<<"进口输入有误。 ";return;} temp.x=a;temp.y=b;temp.d=-1;//初始化入口点坐标及方向; st.push(temp); while(! st.empty()) { temp=st.top(); st.pop(); x=temp.x;y=temp.y;d=temp.d+1; while(d<8) { i=x+move[d].x;j=y+move[d].y; if(maze[i][j]==0)//该点可到达; { temp.x=x;temp.y=y;temp.d=d;//坐标及方向; st.push(temp);//坐标及方向入栈; x=i;y=j; maze[x][y]=-1;//到达新点; if(x==m&&y==n) { cout<<"迷宫路径为: "< cout<<"("< Datetypet; while(! st.empty()) { t=st.top(); cout<<"("< st.pop(); }//输出路径; cout< return;//到达出口; } elsed=0;//重新初始化方向; } elsed++;//改变方向; } } cout<<"对不起,无法找到出口."; return;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 课程设计 报告