校园导航Word下载.docx
《校园导航Word下载.docx》由会员分享,可在线阅读,更多相关《校园导航Word下载.docx(32页珍藏版)》请在冰豆网上搜索。
距离;
校园导航。
第一章绪论
现代社会,新兴科技日新月异,信息千变万化,人们在渴望得到最多最广的信息的同时又渴望得到信息的路径能越来越简单,易操作,而且能在简易的操作中得到更多的信息。
这就要求信息咨询系统的开发者在开发之时能尽可能的全面理解客户的想法要求,而且在开发的时候能更简易的操作和更新,这种思想都符程序设计的开发思想。
本次设计其实就是数据结构中图类的问题。
将校园景点作为图的结点,将景点间的路径作为图的边,路径距离作为边的权值。
这样一来,求两景点间最短路径的问题就抽象成了求图中一结点到另一结点的问题。
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN,CLOSE表的方式,这里均采用永久和临时标号的方式。
注意该算法要求图中不存在负权边。
Floyd-Warshall算法(Floyd-Warshallalgorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题。
Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。
第二章需求分析
2.1设计要求
设计学校的平面图,至少包括8个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
2.2基本要求
(1)设计校园平面图,在校园景点选10个左右景点。
以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;
以边表示路径,存放路径长度等有关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。
2.3设计目的
根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。
明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现最短路径的两种算法。
第三章概要设计
3.1算法思路
3.1.1迪杰斯特拉算法思想
设G=(V,E)为一个带全有向图,把图中顶点集合V分成两组。
第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将所到达最短路径的顶点加入到集合S中,直到全部顶点都加入到S中)。
第二组为其余未确定最短路径的顶点集合(用U表示,U=V-S,U中的顶点不断的加入到S中,直到U为空,S=V)。
在U加入S的过程中,始终保持源点到S中各顶点的最短路径长度小于或等于源点到U中任意顶点的最短路径长度。
3.1.2迪杰斯特拉算法步骤
设n为图G=(V,E)中的顶点数,dist[n]存放从源点到每个终点当前最短路径的长度,path[n]存放相应路径,S为已求得最短路径的终点的集合,U为V-S,初始为不含有源点的所有顶点。
(1)初始化已求的最短路径的集合S为只含有元素源点a,S={a}。
(2)从U中选取一个距离源点v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
(3)以k为新考虑的中间点,修改U中各顶点的距离;
若从源点v到顶点u(uU)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值为顶点k的距离加上顶点k到u边上的权。
(4)重复步骤
(2)和(3)直到所有顶点都包含在S中。
3.1.3佛洛伊德算法思想
从邻接矩阵a开始进行n次迭代,第一次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于1的顶点的最短路径长度;
第k次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于k的顶点的最短路径长度第n次迭代后a[i,j]的值就是从vi到vj的最短路径长度。
3.1.4佛洛伊德算法步骤
1.从任意一条单边路径开始。
所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2.对于每一对顶点u和v,看看是否存在一个顶点w使得从u到w再到v比已知的路径更短。
如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;
否则G[i,j]=无穷大。
定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。
把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j]=min(G[i,j],G[i,k]+G[k,j]),如果G[i,j]的值变小,则D[i,j]=k。
在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
3.2程序模块
程序的主要功能函数包括:
intmain()//系统的主函数
intlogin()//主登陆界面代码
intlogin1()//景点及简介菜单
intlogin2()//校园地图
intlogin3()//从一景点到其它景点最短路径操作页面
intlogin4()//任意两景点间的最短路径操作页面
intprintname()//景点名称的输出
intprintinfo()//景点信息的输出
intCreateUDN(MGraph&
G)//无向网的邻接矩阵的创建及初始化
intDijkstra()//迪杰斯特拉算法实现
voidFloyd()//佛洛伊德算法实现
3.3各模块间的调用关系
主函数voidmain()
要调用:
login()
主登陆界面login()
login1(),login2(),login3(),login4()
景点及简介菜单login1()
要调用printname(),printinfo(),login()和本身
从一景点到其它景点最短路径操作页面login3()
要调用Dijkstra(),login(),printname()和本身
任意两景点间的最短路径操作页面login4()
要调用Floyd(),login(),printname()和本身
3.4功能模块图
如图3-1所示
图3-1
第四章详细设计
4.1图的结构及主要功能函数的实现
4.1.1图的结构定义
struct{
charname[50];
charinfo[200];
}sce[8];
//景点名称及景点信息
typedefstruct
{
intvexs[8];
intarcs[8][8];
intvexnum,arcnum;
}MGraph;
//图的结构
4.1.2主要功能函数的实现
1.无向网的邻接矩阵的创建及初始化
G)
{
intc[8][3]={0,2,25,0,4,50,0,5,20,1,6,25,3,6,40,4,6,30,5,6,30,6,7,25};
inti,j,k,vexnum=8,arcnum=8;
for(i=0;
i<
8;
i++)
for(j=0;
j<
j++)
G.arcs[i][j]=INT_MAX;
for(k=0;
k<
k++)
{
G.arcs[c[k][0]][c[k][1]]=c[k][2];
G.arcs[c[k][1]][c[k][0]]=c[k][2];
}
return0;
2.迪杰斯特拉算法实现
voidPpath1(intpath[],inti,intv0)
{
intk;
k=path[i];
if(k!
=v0)
{
Ppath1(path,k,v0);
printname(k);
printf("
-->
"
);
}
}//迪杰斯特拉算法求最短路径的中间顶点的遍历
voidDispath1(intdist[],intpath[],ints[],intv0)
inti;
for(i=0;
loop:
if(s[i]==1)
{
if(i==v0)
{
++i;
gotoloop;
}
printf("
从"
printname(v0);
到"
printname(i);
的最短路径为:
%d\n"
dist[i]);
if(dist[i]==32767)
{
printf("
没有路径!
\n"
其路径为:
Ppath1(path,i,v0);
\n\n"
}
}//迪杰斯特拉算法中对最短路径及最短距离的输出
intDijkstra(intgm[8][8],intv0)
intdist[8],path[8],s[8];
inti,j,k,mindis,n=8;
n;
dist[i]=gm[v0][i];
s[i]=0;
if(gm[v0][i]<
10000)
path[i]=v0;
else
path[i]=-1;
s[v0]=1;
path[v0]=0;
for(i=0;
mindis=10000;
for(j=0;
if(s[j]==0&
&
dist[j]<
mindis)
k=j;
mindis=dist[j];
}
s[k]=1;
for(j=0;
if(s[j]==0)
if(gm[k][j]<
10000&
dist[k]+gm[k][j]<
dist[j])
dist[j]=dist[k]+gm[k][j];
path[j]=k;
Dispath1(dist,path,s,v0);
//遍历及输出函数
return0;
3.佛洛伊德算法实现
voidPpath2(intpath[8][8],inti,intj)
intk;
k=path[i][j];
if(k!
=-1)
Ppath2(path,i,k);
printname(k);
printf("
Ppath2(path,k,j);
}//佛洛伊德算法对中间顶点的遍历输出
voidDispath2(inta[8][8],intpath[8][8])
inti,j,k;
printf("
请输入表示出发景点的数字:
"
scanf("
%d"
&
k);
i=k-1;
请输入表示目的景点的数字:
j=k-1;
if(j==i)
出发景点与目的景点一致!
请重新输入:
gotoloop;
if(a[i][j]>
10000||i==j)
printname(i);
printname(j);
else
a[i][j]);
Ppath2(path,i,j);
}//佛洛伊德算法对最短路径及最短距离的输出
voidFloyd(intgm[8][8])
inta[8][8],path[8][8];
inti,j,k;
a[i][j]=gm[i][j];
path[i][j]=-1;
for(k=0;
for(i=0;
for(j=0;
if(a[i][j]>
a[i][k]+a[k][j])
{
a[i][j]=a[i][k]+a[k][j];
path[i][j]=k;
}
}
Dispath2(a,path);
5.界面的实现
代码如下:
intlogin()
inti;
intlogin1();
intlogin2();
intlogin3();
intlogin4();
********************************************************************************\n"
\t\t\t欢迎使用校园导航系统\t\t\t\n"
\t\t\t1.景点及简介\t\t\n"
\t\t\t2.景点导航\t\t\n"
\t\t\t3.从一景点到其它景点最短路径\t\t\n"
\t\t\t4.任意两景点的最短路径\t\t\n"
\t\t\t0.退出系统\t\t\n"
请输入您的操作:
i);
switch(i)
case0:
{system("
CLS"
欢迎再次使用!
\n2秒后自动退出!
Sleep(2000);
return(0);
break;
case1:
login1();
case2:
login2();
case3:
login3();
case4:
login4();
default:
{printf("
无效的操作,请重新输入:
gotoloop;
}//.主登陆页面代码
注:
附录中有其他界面的代码
第五章测试
5.1测试结果截图
1.主登陆界面界面如下图5-1所示。
图5-1主登陆界面
2.景点简介操作界面如下图5-2所示。
图5-2景点简介
3.景点简介输出界面如下图5-3所示。
图5-3景点简介输出
4.景点地图输出界面如下图5-4所示。
图5-4景点地图
5.迪杰斯特拉算法操作界面如下图5-5所示。
图5-5迪杰斯特拉算法
6.迪杰斯特拉算法输出界面如下图5-6所示。
图5-6迪杰斯特拉算法输出
7.佛洛伊德算法操作及输出界面如下图5-7所示。
图5-7佛洛伊德算法
8.退出系统界面如下图5-8所示。
图5-8退出系统
第六章总结
参考文献
[1]严蔚敏,吴伟民.《数据结构(C语言版)》.北京:
清华大学出版社,2009.
[2]郭有强.《C语言程序设计》.北京:
[3]胡元义.《数据结构教程》.西安:
西安电子科技大学出版社,2012.
[4](美国)维斯译者:
冯舜玺.《数据结构与算法分析:
C语言描述》.
机械工业出版社,2004
[5](美)科曼(Cormen,T.H.)等著,殷建平等译.《算法导论》.机械工业出版社,2013
源程序清单
#include<
stdio.h>
conio.h>
stdlib.h>
#include<
windows.h>
#defineINT_MAX32767
#defineMAX_VERTEX_NUM20
charname[50];
}sce[8]={{"
教学楼"
"
A、B、C三栋教学楼共有大中小多媒体教室132间,机房10间,阶梯教室4间可容纳200多人"
},
{"
图书馆"
5层,藏书500多万册,几乎各类书籍,一楼还有电子阅览室,二楼三楼设有学术报告厅可容纳500多人,四楼五楼设有自习室可容纳1000多人"
行政楼"
学校教学中心,在校老师的办公地点,内设有各系的行政地点,是校领导和各系老师处理各种事情的地点"
食堂"
一二号食堂(三号食堂在建)靠近男女生宿舍,分三层,有各种小炒,点心,面食,小吃,南北方各种食物,三楼还有包厢可聚餐"
体育馆"
占地800多平方米,内设2个篮球场,1个排球场,4个羽毛球场,20个乒乓球台,用于体育教学,各种球类比赛"
北门"
离大学城商业街最近的门,校门外是207、117、115终点站,蚌埠学院人流量最大的出入口"
宿舍"
一到四栋是女孩宿舍,五到十栋是男生宿舍,宿舍都是六人间,内含水池,独立卫生间,空调"
大学生活动中心"
室内场所200多平方米,有舞台,音响,灯光等基本设施,用于各种社团班级活动(比赛,晚会等)"
};
intprintname(intk)
intj=k;
for(inti=0;
15;
if(sce[j].name[i]=='
\0'
)return0;
%c"
sce[j].name[i]);
}//景点名称的输出函数
intprintinfo(intk)
200;
sce[j].info[i]);
typedefenum{UDN}GraphKind;
//图的邻接矩阵结构体
intc[8][3]={0,2,25,0,4,50,0,5,20,1,6,25,3,6,40,4,6,30,5,6,30,6,7,25};
inti,j,k,vexnum=8,arcnum=8;
G.arcs[i][j]=INT_MAX;
G.arcs[c[k][0]][c[k][1]]=c[k][2];
G.arcs[c[k][1]][c[k][0]]=c[k][2];
}//图的初始化
intdist[8],path[8],s[8];
inti,j,k,mindis,n=8;
dist[i]=gm[v0][i];
s[i]=0;
if(gm[v0][i]<
path[