公园导游图课设Word格式.docx
《公园导游图课设Word格式.docx》由会员分享,可在线阅读,更多相关《公园导游图课设Word格式.docx(31页珍藏版)》请在冰豆网上搜索。
建立的过程是采用前序便利的方法来创建,设计两种生成树的方式:
一种是系统随机生成,另一种是人工输入。
考虑到屏幕界面的有限性,限定二叉树不超过5层,最多26个字符,输入字符小数点“.”代表NULL。
初始树为某种颜色的结点,三种情况的遍历采用填充另外一种醒目的颜色,来表示当前遍历的结点,同时显示该结点的访问序号。
同时在遍历的过程中在遍历图形的下方显示出遍历序列。
1.1.4数组应用
按照行优先顺序将用户随机输入的数据建成2维数组并以图形方式逐步显示出来,然后再按照列优先顺序以图形方式逐步输出相应数组。
1.1.5拓扑排序演示
演示拓扑排序的过程。
按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。
要求每输出一个顶点后就演示从图中删去此顶点以及所有以它为尾的弧。
1.1.6图的遍历
演示图的深度优先,广度优先遍历过程,并输出原图结构及遍历结果。
要求图的结点数不能少于6个。
可以由系统随机生成图,也可以由用户手动输入图。
报告中要写出画图的思路;
画出图的结构,有兴趣的同学可以进一步改进图的效果。
1.1.7八皇后问题演示
在8*8的棋盘上摆放8个皇后,使他们不在同一条对角线上和不在一行和列上。
解决8皇后时,在安放第i行皇后时,需要在列的方向从1到n试探(j=1,…,n):
首先在第j列安放一个皇后,如果在列、主对角线、次对角线方向有其它皇后,则出现攻击,撤消在第j列安放的皇后。
如果没有出现攻击,在第j列安放的皇后不动,递归安放第i+1行皇后。
该课题要求求解可能的方案及方案数并逐步演示摆放皇后的过程。
1.1.8双链表创建演示
建立一个递增有序的双链表。
功能是随机生成8个结点数据,每生成一个结点则申请空间得到一个指针,将数据存放到指针所指的数据域中,然后将结点插入到已经排好序的双链表中。
所以第一步工作是判断新结点的插入位置,第二不演示插入过程中指针的变化,第三步显示插入后的链表结果。
1.1.9公园导游图
给出一张某公园的导游图,游客通过终端询问可知:
从某一景点到另一景点的最短路径。
游客从公园大门进入,选一条最佳路线,使游客可以不重复地游览各景点,最后回到出口(出口就在入口旁边)。
要求用图示展示最佳路径。
1.2选题方案:
所选题目根据学号确定,学号模9加1,即(学号%9+1)。
如你的学号为12,则所选题目号为:
12%9+1=(题目4)。
注意,所有的课题都要求用图形方式演示步骤和结果。
有兴趣的同学可以自己针对数据结构课程中所讲算法来设计一个演示过程的算法,但要预先告知老师,经过审批,方可确定课题。
1.3设计要求:
1.3.1课程设计报告规范
(1)需求分析
a.程序的功能。
b.输入输出的要求。
(2)概要设计
a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;
每个模块的功能。
b.课题涉及的数据结构和数据库结构;
即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
(3)详细设计
a.采用C语言定义相关的数据类型。
b.写出各模块的类C码算法。
c.画出各函数的调用关系图、主要函数的流程图。
(4)调试分析以及设计体会
a.测试数据:
准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。
b.程序调试中遇到的问题以及解决问题的方法。
c.课程设计过程经验教训、心得体会。
(5)使用说明
用户使用手册:
说明如何使用你编写的程序,详细列出每一步的操作步骤。
(6)书写格式
a.设计报告要求用A4纸打印成册:
b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;
行距为22。
(7)附录
a.源程序清单(带注释)
1.3.2考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。
具体考核标准包含以下几个部分:
(1)平时出勤(占10%)
(2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
(3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
(4)设计报告(占30%)
注意:
不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
(5)独立完成情况(占10%)。
1.3.3课程验收要求
(1)运行所设计的系统。
(2)回答有关问题。
(3)提交课程设计报告。
(4)提交软盘(源程序、设计报告文档)。
(5)依内容的创新程度,完善程序情况及对程序讲解情况打分。
2进度安排
2.1计算机0701/0702班:
第7周:
星期一8:
00——12:
00上课星期一14:
00——16:
00上课
星期五18:
00——22:
00上机
第8周:
星期六14:
00——18:
00上机星期日8:
星期日18:
第9周:
星期六8:
00上机星期日14:
2.2计算机0703班:
第7周:
星期六8:
00上机星期日18:
。
目录
1.需求分析.....................................................................1
1.1课程设计内容和要求...............................................1
1.2输入输出的要求....................................................1
2.概要设计............................................................2
2.1主要程序功能模.....................................................2
2.2课题涉及的数据结构和数据库结构............................2
3.详细设计............................................................4
3.1C语言定义的相关数据类型.....................................4
3.2各模块的类C码算法..............................................4
3.3各函数的调用关系图、主要函数的流程图.................7
4.调试分析以及设计体会.................................................11
4.1测试数据.............................................................11
4.2程序调试中遇到的问题以及解决问题的方法................15
4.3经验教训、心得体会............................................15
5.使用说明...................................................................16
6.附录.........................................................................17
1需求分析
1.1课程设计内容和要求。
程序要能够显示出地图,要能够查找出地图中任意两点间的最短距离,以及不重复遍历全图的最短路径,并且在查找及遍历的每个过程都在图中显示出暂时的结果,以便演示整过过程。
1.2输入输出的要求。
程序执行要求有描述地图的两个文件,并放到相应位置。
其中一个文件存放有描述地图各个景点之间距离的矩阵,另一个文件存有地图中各景点在显示器上显示的位置。
两个地图文件不允许有错误。
执行相应功能前要求先选择。
查找任意两点间的最短距离,要求输入要查找最短路径的两点。
在运行各个小过程后要求输出暂时结果。
2概要设计
2.1程序模块
程序共有主模块、查找两点最短路径并输出具体过程、寻找不重复遍历全图图路径并输出遍历过程、三个模块。
主模块包含、载入地图、显示地图、功能选择与调用三部分。
查找两点最短路径并输出具体过程模块中的输出具体过程为显示地图模块
模块结构如图:
图2.1
2.2课题涉及的数据结构和数据库结构
程序主要用了图和栈两种数据结构,采用矩阵来保存图形结构的地图,用栈保存遍历时经过的结点用以遍历的回溯,以及存储最终路径。
图的抽象数据类型:
ADTGraph{
数据对象:
D={a1|1<
i≤n,n≥0}
数据关系:
R={<
ai,aj>
|ai,aj∈D,1≤j≤n,1≤j≤n,其中每个元素可以有零个或多个前驱,可以有零个或多个后继}
基本运算:
LoadImg(*g):
从相应文件中载入图数据初始化图g。
OutputImg(*g)把图输出到屏幕。
bestpath()不重复遍历图。
Floyed()计算图中所有点的两两最短路径。
}
栈的抽象数据类型:
ADTList{
数据对象:
D={ai|1≤i≤n,n≥0,}
数据关系:
|ai,ai+1∈D,i=1,…,n-1}
push(*s,e):
进栈:
将元素e查到栈s中作为栈顶元素。
pop(*s,*e):
出栈:
从栈s中退出栈顶元素,并将其值赋予e。
copsta(*s1,*s):
把栈s中的内容复制到栈s1。
}
3详细设计
3.1采用C语言定义相关的数据类型。
图的定义:
typedefstruct
{
intedges[MAX][MAX];
intn;
/*n顶点数*/
inte;
/*e边数*/
}MGraph;
栈的定义:
intbody[MAX];
inttop;
}Stack;
3.2写出各模块的类C码算法。
3.2.1读取地图:
把保存在文件中的地图数据载入到程序中相应的数据结构,图结构体g及顶点位置数组vl[][2]中。
voidLoadImg(intvl[][2],MGraph*g)
fp=fopen("
g.g2"
"
r"
);
fscanf(fp,"
%d"
&
(g->
n));
for(i=0;
i<
g->
n;
i++)
%d%d"
vl[i][0],&
vl[i][1]);
fclose(fp);
g.g1"
for(i=0,g->
e=0;
i<
for(j=0;
j<
j++)
edges[i][j]));
fclose(fp);
3.2.2显示地图:
把地图以图形方式输出到显示器。
voidOutputImg(intvl[][2],MGraph*g)
{for(i=0,g->
{if(g->
edges[i][j]!
=INF&
&
j)
{g->
e++;
画两点间路径;
画景点;
3.2.3不重复遍历全图的最短路径:
寻找从起点开始不重复走完所有景点的路径,如果该路径不存在,将提示。
如果存在将会最终找出符合要求的最短路径。
Step1:
if(没遍历完)
{if(向前有一景点没访问过)往下走;
else
{回溯到上一景点点(原景点之后景点变为没访问过);
{if(遍历到起点且访问其以后景点必然与以前的试探路径相同)
//说明路径不再存在;
若以前找到过遍历路径则输出最佳结果结束;
else到Step1开始下一步搜索;
else若比以前有的结果更好,则输出结果并继续试探更好的遍历方法;
3.2.4两点间最短路径:
采用弗洛伊德算法,求出每点间的最短路径,并在计算过程中输出用户所求两点间的暂时计算出的最短路径。
voidFloyed(MGraph*g,intA[][MAX],intpath[][MAX],intvl[][2])
for(i=0;
i++)/*置初值*/
for(j=0;
j<
j++)
{
A[i][j]=g->
edges[i][j];
path[i][j]=-1;
输入两景点;
for(k=0;
k<
k++)
{for(i=0;
g->
i++)
if(A[i][k]!
A[k][j]!
A[i][j]>
(A[i][k]+A[k][j]))
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
输出0到k号顶点被考虑作为中间节点时两景点的最短路径图;
3.3各函数的调用关系图、主要函数的流程图。
3.3.1函数调用关系图:
图3.1函数调用关系图
3.3.2主函数流程图:
图3.2主函数流程图
3.3.3查找两点最短路径函数Floyed()流程图:
图3.3查找两点最短路径函数流程图
3.3.4不重复遍历景点函数bestpath()
图3.4不重复遍历景点函数
4调试分析以及设计体会
4.1测试数据:
程序中的测试数据主要为景点地图相关的数据,景点个数、景点间距离、显示景点时在屏幕上的位置,由于数据量比较大,所以把数据保存到文件,在程序运行时从文件中输入数据。
从文件1中输入景点个数和在景点屏幕上的显示位置数据,每对坐标按顺序对应相应编号的景点:
10(景点个数为10)
300100200150300150
400150250200350200
450200200250300250
400250
从文件2中输入以下的景点间距离数据到程序,32767表示两景点间没有路径,数据的行数和列数分别对应第一个顶点和第二个顶点的编号。
相对于主对角线对称的两点表示的是同一条路径,所以必须相等。
0502032327673276732767327673276732767
5003276732767103276732767433276732767
2032767015327673276732767327673276732767
32327671503276731327673276732767
3276710332767032327676932767
32767327673332036327675416
327673276732767132767360327673276724
327674332767327676327673276701832767
327673276732767327679543276718021
3276732767327673276732767162432767210
在键盘输入数据主要为功能选择类输入,和查找两景点间距离数时输入的景点号码
下面图中调试用的景点号为0、9。
运行后得到如下结果:
图4.1:
选择功能界面
图4.2:
遍历图运行中
图4.3:
遍历图完成
选择2后系统提示输入两点:
图4.4:
选择2后系统提示输入两点图
图4.5:
选择2输入0、9后运行截图
图4.6:
选择2输入09后运行完成截图
4.2程序调试中遇到的问题以及解决问题的方法。
程序调试中遇到了各种各样的问题,大部分是输入错误以及局部的逻辑混乱,或者某些地方考虑不周造成。
输入错误主要有等于写成赋值、缺少分号、符号->
写成了减号-以及字符忘加引号等。
输入错误在编译时一般可以排除,编译时还没排除的错误以及逻辑错误一般要在调试运行时排除。
排除错误主要是通过在程序中加入大量输出函数,输出运行状态,然后根据输出结果定位出错位置,找出出错原因并解决问题。
但在中途还遇到过一些奇怪的问题,如函数执行完毕之后不能正常跳出。
我实在是找不到错在哪里,后来我改变了函数的结构,及程序的组织方式,问题终于没有了。
我自己觉得应该是对语言或编译环境的细节还了解得不够造成了这类问题不能解决。
4.3经验教训、心得体会。
两周的课程设计中,碰到过许多问题。
首先,上课时听的理论知识,各种算法似乎很容易理解,但是在真正的运用过程中,并不能把理论知道很好的和实践结合起来。
在平时做实验时,尤其是这次课程设计,总感到有些无从下手。
因此,在学知识的过程中,一定要多动手、动脑,将所学的知识熟练掌握,自如运用。
其次,通过这次课程设计,对自己的逻辑思维能力是一个很大的锻炼,加强了我们的系统思考问题的能力,在编程方面,我们开始从整体的角度来考虑问题了,而不再像以前一样的,没有一个总体的概念。
也就是因为这种习惯,使自己在课程设计过程中浪费了不少的时间。
程序设计是一个毅力的考验过程。
有时候往往只是一个小小的错误,却要费很多的时间来解决。
在这个过程不能过于急躁,并且要很有耐心才行程序需要反复调试,其过程很可能相当令人头疼,有时花很长时间设计出来还是需要重做,那时心中未免有点灰心,有时还特别想放弃,此时更加需要静下心,查找原因。
在课程设计中,感谢老师的耐心指导,让我能能能够顺利写出程序并把程序更快的调试正确,我从中也学到了许多新的方法和知识。
感谢在做课程设计帮助自己的一些同学,是他们给我的意见和建议,让我的程序能够更加完善。
5.使用说明
把地图文件放到与程序文件相同的目录,然后运行程序,程序会提供地图的图形显示,以及两个供选择的功能,选择相应编号或即可完成对应功能,并在图上看到其完成过程。
6.附录
#include"
stdio.h"
Conio.h"
graphics.h"
Dos.h"
#defineclosegrclosegraph
#defineMAX12
#defineINF32767
/*定义图结构*/
intn,e;
/*n顶点数e边数*/
/*定义栈结构*/
intpush(Stack*s,intn)
{if(s->
top==MAX-1)return0;
s->
top++;
body[s->
top]=n;
return1;
intpop(Stack*s,int*n)
if(s->
top==-1)return0;
*n=s->
top];
top--;
voidcopsta(Stack*s1,Stack*s)
inti;
s1->
top=s->
top;
=s->
body[i]=s->
body[i];
voidInitgr(void)/*BGI初始化*/
intgd=DETECT,gm=0;
/*和gd=VGA,gm=VGAHI是同样效果*/
registerbgidriver(EGAVGA_driver);
initgraph(&
gd,&
gm,"
"
/*从文件中读取图形到程序*/
voidLoadImg(intvl[][2],MGraph*g)/*vl顶点在显示器中显示时的坐标值*/
{FILE*fp;
inti,j;