算法设计与分析课程设计题目:校园导航问题文档:物联网工程学院物联网工程专业学号学生姓名班级物联网1101二〇一三年十二月设计要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路(最短路径)。
本系统为用户提供以下功能:(一)、查询了解学校概况,为导游参观者提供关于学校的相关信息。
(二)、查询校园各个场所和景点信息;(三)、为导游者或外来人员参观人员提供校园交通信息,方便用户走访学校。
完成需要操作时,退出系统校园导航查询系统的开发方法总结如下:(1) 需求分析,了解学校各个场所与场所或者是各个景点与景点之间的信息,路径和距离,考虑该如何设计才能满足用户需求。
(2) 概要设计,对调查得到的数据进行分析,根据其要求实现的功能分析系统结构和界面将实现的基本功能。
(3) 详细设计,设计系统界面并编辑实现其各个功能的代码。
(4) 调试分析,在设计完成后,调试系统运行的状况,修改完善系统,然后进行测试。
一、需求分析1学校以及各景点介绍模块采用一维数组将学校景点依次排放好编号G.vex[i].number=i 在选择校园介绍的时候,弹出G.vex[0]校园简介。
在选择各景点信息的时候,可按编号查询2查询最短路径(主要)查出出发地到想要到达的景点的最短路径,初步构想采用最经典的迪杰斯特拉算法最短路径函数3查询各点距离将所有景点的距离显示出来。
4主菜单页面显示提供使用者选择功能界面,按照提示进行操作。
5退出完成需要操作时,退出系统校园导航系统模式图二、概要设计2.1算法设计说明校园导航模型是由各个景点和景点以及场所和场所之间的路径组成的,所以这完全可以用数据结构中的图来模拟。
用图的结点代表景点或场所,用图的边代表景点或场所之间的路径。
所以首先应创建图的存储结构。
结点值代表景点信息,边的权值代表景点间的距离。
结点值及边的权值采用图存储。
本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。
计算路径长度,最短路线和最佳路径时可分别用迪杰斯特拉(Dijkastra )算法和哈密而顿回路算法实现。
最后switch 选择语句选择执行浏览景点信息或查询最短路径和距离。
2.1.1学校以及各景点介绍模块采用了图的邻接矩阵存储结构,首先初始化每一个景点名称(一维数组)fo r(i=1;i<G .vexnum;++i) G .vex[i].number=i ……校园导航系统 校园介绍,各景点介绍查询校园所有景点路径 最短路径查询 查询各景点距离 输入起点与终点 输出最短路径SearchMenu子菜单输入景点编号编号值=iI<num输出景点介绍输出“错误”结束景点介绍功能流程图2.1.2查询最短路径(主要)算法的主要思想是按路径长度递增的次序产生最短路径的算法。
中心思想是假设s为已求得最短路径的终点的集合,则下一条最短路径或者是弧(v,x)或者是中间经过s中是顶点而最后到达顶点x的路径。
(1)arcs表示弧上的权值。
若不存在,则置arcs为∞。
S为已找到从v出发的最短路径的终点的集合,初始状态为空集。
那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcs[Locate Vex(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数据结构定义结构体类型,将多个相关的变量包装成为一个整体使用。
#define Max 32767#define NUM 20自定义顶点的类型typedef struct VertexType{int number; // 景点编号char *sight;// 景点名称}VertexType;自定义图的类型typedef struct{VertexType vex[NUM]; // 图中的顶点,即为景点int arcs[NUM][NUM]; // 图中的边,即为景点间的距离int vexnum; // 顶点数}MGraph;把图定义为全局变量MGraph G;int P[NUM][NUM]; 辅助变量存储最短路径长度long int D[NUM];2.2.2使用的系统头文件#include "stdio.h" /*I/O 函数*/#include "stdlib.h" /*使用system()exit()atoi()malloc()free()函*/ #include "string.h" /*字符串函数,strcpy()strlen()strcmp()*/三、主程序#include <stdio.h>#include <string.h>#include <stdlib.h>#define Max 32767#define NUM 20typedef struct VertexType{int number;char *sight;}VertexType;typedef struct{VertexType vex[NUM];int arcs[NUM][NUM];int vexnum;}MGraph;MGraph G;int P[NUM][NUM];long int D[NUM];void CreateMGraph(int v)//创建图的函数,v是函数入口{int i,j;G.vexnum=v;for(i=1;i<G.vexnum;++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<G.vexnum;++i){for(j=1;j<G.vexnum;++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;}void Map()//地图展示函数{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");}void Info()//资料介绍函数{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");}void ShortestPath(int num) // 迪杰斯特拉算法最短路径函数num为入口点的编号{int v,w,i,t; // i、w和v为计数变量int final[NUM];int min;for(v=1;v<NUM;v++){final[v]=0; // 假设从顶点num到顶点v没有最短路径D[v]=G.arcs[num][v];// 将与之相关的权值放入D中存放for(w=1;w<NUM;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<NUM;++i) //其余G.vexnum-1个顶点{min=Max; // 当前所知离顶点num的最近距离for(w=1;w<NUM;++w)if(!final[w]) // w顶点在v-s中if(D[w]<min) // w顶点离num顶点更近{v=w;min=D[w];} // 更新当前最短路径极其距离final[v]=1; // 离num顶点更近的v加入到s集合for(w=1;w<NUM;++w)if(!final[w]&&((min+G.arcs[v][w])<D[w])) // 不在s集合,并且比以前所找到的路径都短就更新当前路径{D[w]=min+G.arcs[v][w];for(t=0;t<NUM;t++)P[w][t]=P[v][t];P[w][w]=1;}}}char Menu()//应用主界面显示函数{char c;int flag;do{system("cls");flag=1;Map();printf("\t\t欢迎使用江南大学导航图系统\n");printf("\t\t 1.查询地点之间最短路径\n");printf("\t\t 2.江南大学景点介绍\n");printf("\t\t e.退出\n");printf("\t\t\t请输入您的选择:");scanf("%c",&c);if(c=='1'||c=='2'||c=='e')//如果输入为1,2,E中的一个,则返回Cflag=0;}while(flag);return c;void Display(int sight1,int sight2)//最短距离显示函数{int a,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<NUM;++c){P[a][sight1]=0;for(b=0;b<NUM;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("\n");}}}}}void main()//主界面最短路线查询显示函数int v0,v1;char e;char ck;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;goto gate;case'2':system("cls");Info();printf("\n\n\t\t\t\t按回车键返回首页...\n");getchar();getchar();break;};}while(ck!='e');}四、程序调试及运行结果贴图五、总结通过这次设计,是我得以更好的掌握C语言的编程,对一些算法思想和实现方法有了更深的了解。