校园导航系统算法及分析课程设计Word文档格式.docx
《校园导航系统算法及分析课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《校园导航系统算法及分析课程设计Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
用图的结点代表景点或场所,用图的边代表景点或场所之间的路径。
所以首先应创建图的存储结构。
结点值代表景点信息,边的权值代表景点间的距离。
结点值及边的权值采用图存储。
本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。
计算路径长度,最短路线和最佳路径时可分别用迪杰斯特拉(Dijkastra)算法和哈密而顿回路算法实现。
最后switch
选择语句选择执行浏览景点信息或查询最短路径和距离。
2.1.1学校以及各景点介绍模块
采用了图的邻接矩阵存储结构,首先初始化每一个景点名称(一维数组)for(i=1;
i<
G.vexnum;
++i)G.vex[i].number=i……
景点介绍功能流程图
2.1.2查询最短路径(主要)
算法的主要思想是按路径长度递增的次序产生最短路径的算法。
中心思想是假设s为已求得最短路径的终点的集合,则下一条最短路径或者是弧(v,x)或者是中间经过s中是顶点而最后到达顶点x的路径。
(1)arcs表示弧上的权值。
若不存在,则置arcs为∞。
S为已找到从v出发的最短路径的终点的集合,初始状态为空集。
那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcs[LocateVex(G,v),i]vi∈V
(2)选择vj,使得D[j]=Min{D|vi∈V-S}
(3修改从v出发到集合V-S上任一顶点vk可达的最短路径长度
路径查询流程图
2.1.3查询各点距离
由于图的结构比较复杂,任意两个点之间都可能存在联系。
因此无法以数据
元素在存储区中的物理位置来表示元素之间的关系,但是却可以借助数组的数据
类型表示元素之间的关系。
2.1.4主函数
循环体用开关语句,该语句的条件值ck是当用户选择菜单通过调用主菜单函数得到,返回值整数作开关语句的条件。
根据该值调用相应的各功能函数,同时设置一个退出程序点,执行完用户的某项功能后继续显示菜单,当返回值为e
时函数结束程序,以免造成死循环。
2.2数据结构与函数考虑
2.2.1数据结构
定义结构体类型,将多个相关的变量包装成为一个整体使用。
#defineMax32767
#defineNUM20
自定义顶点的类型
typedefstructVertexType{
intnumber;
//景点编号
char*sight;
//景点名称
}VertexType;
自定义图的类型
typedefstruct{
VertexTypevex[NUM];
//图中的顶点,即为景点
intarcs[NUM][NUM];
//图中的边,即为景点间的距离
intvexnum;
//顶点数
}MGraph;
把图定义为全局变量
MGraphG;
intP[NUM][NUM];
辅助变量存储最短路径长度
longintD[NUM];
2.2.2
使用的系统头文件
#include"
stdio.h"
/*I/O函数*/
stdlib.h"
/*使用system()exit()atoi()malloc()free()函*/
string.h"
/*字符串函数,strcpy()strlen()strcmp()*/
三、主程序
#include<
stdio.h>
string.h>
stdlib.h>
#defineMax32767
#defineNUM20
typedefstructVertexType{
intnumber;
char*sight;
typedefstruct{
VertexTypevex[NUM];
intarcs[NUM][NUM];
intvexnum;
}MGraph;
MGraphG;
voidCreateMGraph(intv)//创建图的函数,v是函数入口
{
inti,j;
G.vexnum=v;
for(i=1;
++i)
G.vex[i].number=i;
G.vex[0].sight="
各个地点名字"
;
G.vex[1].sight="
江南大学校北门"
G.vex[2].sight="
第一食堂"
G.vex[3].sight="
江南大学东偏门"
G.vex[4].sight="
设计学院"
G.vex[5].sight="
体育中心"
G.vex[6].sight="
物联网工程学院"
G.vex[7].sight="
图书馆"
G.vex[8].sight="
江南大学东门"
G.vex[9].sight="
国家重点实验室"
G.vex[10].sight="
第二教学楼"
G.vex[11].sight="
第四食堂"
G.vex[13].sight="
臻善楼"
G.vex[12].sight="
江南大学南门"
for(j=1;
j<
++j)
G.arcs[i][j]=Max;
}
G.arcs[1][2]=G.arcs[2][1]=200;
G.arcs[1][3]=G.arcs[3][1]=210;
G.arcs[1][5]=G.arcs[5][1]=521;
G.arcs[2][4]=G.arcs[4][2]=299;
G.arcs[2][5]=G.arcs[5][2]=450;
G.arcs[2][3]=G.arcs[3][2]=869;
G.arcs[3][5]=G.arcs[5][3]=620;
G.arcs[3][8]=G.arcs[8][3]=756;
G.arcs[4][5]=G.arcs[5][4]=355;
G.arcs[4][6]=G.arcs[6][4]=221;
G.arcs[5][7]=G.arcs[7][5]=225;
G.arcs[5][8]=G.arcs[8][5]=900;
G.arcs[6][7]=G.arcs[7][6]=280;
G.arcs[6][9]=G.arcs[9][6]=241;
G.arcs[7][8]=G.arcs[8][7]=440;
G.arcs[7][10]=G.arcs[10][7]=350;
G.arcs[8][10]=G.arcs[10][8]=570;
G.arcs[9][10]=G.arcs[10][9]=1300;
G.arcs[9][11]=G.arcs[11][9]=998;
G.arcs[9][12]=G.arcs[12][9]=1200;
G.arcs[10][11]=G.arcs[11][10]=639;
G.arcs[10][12]=G.arcs[12][10]=805;
G.arcs[11][12]=G.arcs[12][11]=283;
G.arcs[12][13]=G.arcs[13][12]=296;
voidMap()//地图展示函数
printf("
\t************************江南大学大学地图导航系统*******************\n"
);
━━━━━━━━━━━━━━━1江南大学北大门━━━━━━━━━━\n"
┃┃┃\n"
2第一食堂━━━━━━━━━━━━━━━━━━━━━━━━━3江南大学东偏门\n"
4设计学院━━━━━━━━━━━━5体育中心━━━━━━━━━━━━┃\n"
6物联网工程学院━━━━━━━━━7图书馆━━━━━━━━━8江南大学东门\n"
9国家重点实验室10第二教学楼━━━━━━━━━━┃\n"
━━━━━━━━━━━━━━━━┃━━━━━━━━━━┃\n"
┃┃\n"
┃━━━11第四食堂\n"
┃\n"
13臻善楼━━━━━━━━━━━━━12江南大学南门\n"
}
voidInfo()//资料介绍函数
1江南大学校北大门:
这是江南大学最有名的大门,是一座充满历史感的高大的牌坊,正上面写着“江南大学”四个大字,背面写着“江南第一学府”六个字\n"
2江南大学第一食堂\n"
3江南大学东偏门:
\n"
4设计学院:
\n"
5体育中心:
6物联网工程学院:
7图书馆:
高达15层的雄伟的图书馆\n"
8江南大学东门:
9国家重点实验室:
10第二教学楼:
printf("
11第四食堂:
13臻善楼:
12江南大学南门:
}
voidShortestPath(intnum)//迪杰斯特拉算法最短路径函数num为入口点的编号
{
intv,w,i,t;
//i、w和v为计数变量
intfinal[NUM];
intmin;
for(v=1;
v<
NUM;
v++)
{
final[v]=0;
//假设从顶点num到顶点v没有最短路径
D[v]=G.arcs[num][v];
//将与之相关的权值放入D中存放
for(w=1;
w<
w++)//设置为空路径
P[v][w]=0;
if(D[v]<
32767)//存在路径
P[v][num]=1;
//存在标志置为一
P[v][v]=1;
//自身到自身
}
D[num]=0;
final[num]=1;
//初始化num顶点属于S集合
//开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合
for(i=1;
++i)//其余G.vexnum-1个顶点
min=Max;
//当前所知离顶点num的最近距离
for(w=1;
++w)
if(!
final[w])//w顶点在v-s中
if(D[w]<
min)//w顶点离num顶点更近
v=w;
min=D[w];
}//更新当前最短路径极其距离
final[v]=1;
//离num顶点更近的v加入到s集合
if(!
final[w]&
&
((min+G.arcs[v][w])<
D[w]))//不在s集合,并且比以前所找到的路径都短就更新当前路径
D[w]=min+G.arcs[v][w];
for(t=0;
t<
t++)
P[w][t]=P[v][t];
P[w][w]=1;
charMenu()//应用主界面显示函数
charc;
intflag;
do{
system("
cls"
flag=1;
Map();
printf("
\t\t欢迎使用江南大学导航图系统\n"
\t\t1.查询地点之间最短路径\n"
\t\t2.江南大学景点介绍\n"
\t\te.退出\n"
\t\t\t请输入您的选择:
"
scanf("
%c"
&
c);
if(c=='
1'
||c=='
2'
e'
)//如果输入为1,2,E中的一个,则返回C
flag=0;
while(flag);
returnc;
voidDisplay(intsight1,intsight2)//最短距离显示函数
inta,b,c,d,q=0;
a=sight2;
if(a!
=sight1)
{
\n\t从%s到%s的最短路径是"
G.vex[sight1].sight,G.vex[sight2].sight);
\t(最短距离为%d.m)\n\n\t"
D[a]);
\t%s"
G.vex[sight1].sight);
d=sight1;
for(c=0;
c<
++c)
{
P[a][sight1]=0;
for(b=0;
b<
b++)
{
if(G.arcs[d][b]<
Max&
P[a][b])
{
printf("
-->
%s"
G.vex[b].sight);
q=q+1;
P[a][b]=0;
d=b;
if(q%8==0)printf("
}
}
}
voidmain()//主界面最短路线查询显示函数
intv0,v1;
chare;
charck;
CreateMGraph(NUM);
do
ck=Menu();
switch(ck)
case'
:
gate:
system("
Map();
do
printf("
\n\n\t\t\t请选择出发地序号(1~13):
scanf("
%d"
v0);
if(v0<
1||v0>
13)
\n\n\t\t\t\t输入错误!
}while(v0<
13);
\t\t\t请选择目的地序号(1~13):
v1);
if(v1<
1||v1>
13||v1==v0)
}while(v1<
13||v1==v0);
ShortestPath(v0);
Display(v0,v1);
printf("
\n\n\t\t\t\t按回车键继续,按e退回首页\n"
getchar();
scanf("
e);
if(e=='
)
break;
gotogate;
case'
Info();
\n\n\t\t\t\t按回车键返回首页...\n"
break;
};
while(ck!
='
四、程序调试及运行结果贴图
5、总结
通过这次设计,是我得以更好的掌握C语言的编程,对一些算法思想和实现方法有了更深的了解。
在设计中,出现了一系列的问题,好多次都差点坚持不下去,但最终还是完成了!
当程序编译并且运行成功的那一刻,真的是非常的激动。
感谢老师平时上课时的教导,可以使我更好的完成这次作业