校园导航系统算法及分析课程设计.docx

上传人:b****3 文档编号:4142303 上传时间:2022-11-28 格式:DOCX 页数:17 大小:218.34KB
下载 相关 举报
校园导航系统算法及分析课程设计.docx_第1页
第1页 / 共17页
校园导航系统算法及分析课程设计.docx_第2页
第2页 / 共17页
校园导航系统算法及分析课程设计.docx_第3页
第3页 / 共17页
校园导航系统算法及分析课程设计.docx_第4页
第4页 / 共17页
校园导航系统算法及分析课程设计.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

校园导航系统算法及分析课程设计.docx

《校园导航系统算法及分析课程设计.docx》由会员分享,可在线阅读,更多相关《校园导航系统算法及分析课程设计.docx(17页珍藏版)》请在冰豆网上搜索。

校园导航系统算法及分析课程设计.docx

校园导航系统算法及分析课程设计

算法设计与分析课程设计

题目:

校园导航问题

文档:

 

物联网工程学院物联网工程专业

 

学号

学生姓名

班级物联网1101

 

二〇一三年十二月

 

设计要求:

设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路(最短路径)。

本系统为用户提供以下功能:

(一)、查询了解学校概况,为导游参观者提供关于学校的相关信息。

(二)、查询校园各个场所和景点信息;

(三)、为导游者或外来人员参观人员提供校园交通信息,方便用户走访学校。

完成需要操作时,退出系统

校园导航查询系统的开发方法总结如下:

(1)需求分析,了解学校各个场所与场所或者是各个景点与景点之间的信息,路径和距离,考虑该如何设计才能满足用户需求。

(2)概要设计,对调查得到的数据进行分析,根据其要求实现的功能分析系统结构和界面将实现的基本功能。

(3)详细设计,设计系统界面并编辑实现其各个功能的代码。

(4)调试分析,在设计完成后,调试系统运行的状况,修改完善系统,然后进行测试。

一、需求分析

1学校以及各景点介绍模块

采用一维数组将学校景点依次排放好编号G.vex[i].number=i在选择校园介绍的时候,弹出G.vex[0]校园简介。

在选择各景点信息的时候,可按编号查询

2查询最短路径(主要)

查出出发地到想要到达的景点的最短路径,初步构想采用最经典的迪杰斯特拉算法最短路径函数

3查询各点距离

将所有景点的距离显示出来。

4主菜单页面显示

提供使用者选择功能界面,按照提示进行操作。

5退出

完成需要操作时,退出系统

 

校园导航系统模式图

2、概要设计

2.1算法设计说明

校园导航模型是由各个景点和景点以及场所和场所之间的路径组成的,所以这完全可以用数据结构中的图来模拟。

用图的结点代表景点或场所,用图的边代表景点或场所之间的路径。

所以首先应创建图的存储结构。

结点值代表景点信息,边的权值代表景点间的距离。

结点值及边的权值采用图存储。

本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。

计算路径长度,最短路线和最佳路径时可分别用迪杰斯特拉(Dijkastra)算法和哈密而顿回路算法实现。

最后switch

选择语句选择执行浏览景点信息或查询最短路径和距离。

2.1.1学校以及各景点介绍模块

采用了图的邻接矩阵存储结构,首先初始化每一个景点名称(一维数组)for(i=1;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函数*/

#include"stdlib.h"/*使用system()exit()atoi()malloc()free()函*/

#include"string.h"/*字符串函数,strcpy()strlen()strcmp()*/

三、主程序

#include

#include

#include

#defineMax32767

#defineNUM20

typedefstructVertexType{

intnumber;

char*sight;

}VertexType;

typedefstruct{

VertexTypevex[NUM];

intarcs[NUM][NUM];

intvexnum;

}MGraph;

MGraphG;

intP[NUM][NUM];

longintD[NUM];

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(i=1;i

{

for(j=1;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");

printf("━━━━━━━━━━━━━━━1江南大学北大门━━━━━━━━━━\n");

printf("┃┃┃\n");

printf("┃┃┃\n");

printf("2第一食堂━━━━━━━━━━━━━━━━━━━━━━━━━3江南大学东偏门\n");

printf("┃┃┃\n");

printf("┃┃┃\n");

printf("4设计学院━━━━━━━━━━━━5体育中心━━━━━━━━━━━━┃\n");

printf("┃┃┃\n");

printf("┃┃┃\n");

printf("┃┃┃\n");

printf("6物联网工程学院━━━━━━━━━7图书馆━━━━━━━━━8江南大学东门\n");

printf("┃┃┃\n");

printf("┃┃┃\n");

printf("┃┃┃\n");

printf("9国家重点实验室10第二教学楼━━━━━━━━━━┃\n");

printf("┃┃┃\n");

printf("┃┃┃\n");

printf("━━━━━━━━━━━━━━━━┃━━━━━━━━━━┃\n");

printf("┃┃\n");

printf("┃━━━11第四食堂\n");

printf("┃\n");

printf("13臻善楼━━━━━━━━━━━━━12江南大学南门\n");

}

voidInfo()//资料介绍函数

{

printf("1江南大学校北大门:

这是江南大学最有名的大门,是一座充满历史感的高大的牌坊,正上面写着“江南大学”四个大字,背面写着“江南第一学府”六个字\n");

printf("2江南大学第一食堂\n");

printf("3江南大学东偏门:

\n");

printf("4设计学院:

\n");

printf("5体育中心:

\n");

printf("6物联网工程学院:

\n");

printf("7图书馆:

高达15层的雄伟的图书馆\n");

printf("8江南大学东门:

\n");

printf("9国家重点实验室:

\n");

printf("10第二教学楼:

\n");

printf("11第四食堂:

\n");

printf("13臻善楼:

\n");

printf("12江南大学南门:

\n");

}

voidShortestPath(intnum)//迪杰斯特拉算法最短路径函数num为入口点的编号

{

intv,w,i,t;//i、w和v为计数变量

intfinal[NUM];

intmin;

for(v=1;v

{

final[v]=0;//假设从顶点num到顶点v没有最短路径

D[v]=G.arcs[num][v];//将与之相关的权值放入D中存放

for(w=1;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

{

min=Max;//当前所知离顶点num的最近距离

for(w=1;w

if(!

final[w])//w顶点在v-s中

if(D[w]

{

v=w;

min=D[w];

}//更新当前最短路径极其距离

final[v]=1;//离num顶点更近的v加入到s集合

for(w=1;w

if(!

final[w]&&((min+G.arcs[v][w])

{

D[w]=min+G.arcs[v][w];

for(t=0;t

P[w][t]=P[v][t];

P[w][w]=1;

}

}

}

charMenu()//应用主界面显示函数

{

charc;

intflag;

do{

system("cls");

flag=1;

Map();

printf("\t\t欢迎使用江南大学导航图系统\n");

printf("\t\t1.查询地点之间最短路径\n");

printf("\t\t2.江南大学景点介绍\n");

printf("\t\te.退出\n");

printf("\t\t\t请输入您的选择:

");

scanf("%c",&c);

if(c=='1'||c=='2'||c=='e')//如果输入为1,2,E中的一个,则返回C

flag=0;

}

while(flag);

returnc;

}

voidDisplay(intsight1,intsight2)//最短距离显示函数

{

inta,b,c,d,q=0;

a=sight2;

if(a!

=sight1)

{

printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);

printf("\t(最短距离为%d.m)\n\n\t",D[a]);

printf("\t%s",G.vex[sight1].sight);

d=sight1;

for(c=0;c

{

P[a][sight1]=0;

for(b=0;b

{

if(G.arcs[d][b]

{

printf("-->%s",G.vex[b].sight);

q=q+1;

P[a][b]=0;

d=b;

if(q%8==0)printf("\n");

}

}

}

}

}

voidmain()//主界面最短路线查询显示函数

{

intv0,v1;

chare;

charck;

CreateMGraph(NUM);

do

{

system("cls");

ck=Menu();

switch(ck)

{

case'1':

gate:

system("cls");

Map();

do

{

printf("\n\n\t\t\t请选择出发地序号(1~13):

");

scanf("%d",&v0);

if(v0<1||v0>13)

printf("\n\n\t\t\t\t输入错误!

\n");

}while(v0<1||v0>13);

do

{

printf("\t\t\t请选择目的地序号(1~13):

");

scanf("%d",&v1);

if(v1<1||v1>13||v1==v0)

printf("\n\n\t\t\t\t输入错误!

\n");

}while(v1<1||v1>13||v1==v0);

ShortestPath(v0);

Display(v0,v1);

printf("\n\n\t\t\t\t按回车键继续,按e退回首页\n");

getchar();

scanf("%c",&e);

if(e=='e')

break;

gotogate;

case'2':

system("cls");

Info();

printf("\n\n\t\t\t\t按回车键返回首页...\n");

getchar();

getchar();

break;

};

}

while(ck!

='e');

}

四、程序调试及运行结果贴图

 

5、总结

通过这次设计,是我得以更好的掌握C语言的编程,对一些算法思想和实现方法有了更深的了解。

在设计中,出现了一系列的问题,好多次都差点坚持不下去,但最终还是完成了!

当程序编译并且运行成功的那一刻,真的是非常的激动。

感谢老师平时上课时的教导,可以使我更好的完成这次作业

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1