校园导航系统算法及分析课程设计.docx
- 文档编号:24736465
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:24
- 大小:174.87KB
校园导航系统算法及分析课程设计.docx
《校园导航系统算法及分析课程设计.docx》由会员分享,可在线阅读,更多相关《校园导航系统算法及分析课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
校园导航系统算法及分析课程设计
算法设计与分析课程设计
题目:
校园导航问题
文档:
物联网工程学院物联网工程专业
学号
学生姓名
班级物联网1101
二〇一三年十二月
设计要求:
设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路(最短路径)。
本系统为用户提供以下功能:
(一)、查询了解学校概况,为导游参观者提供关于学校的相关信息。
(二)、查询校园各个场所和景点信息;
(三)、为导游者或外来人员参观人员提供校园交通信息,方便用户走访学校。
完成需要操作时,退出系统
校园导航查询系统的开发方法总结如下:
(1)需求分析,了解学校各个场所与场所或者是各个景点与景点之间的信息,路径和距离,考虑该如何设计才能满足用户需求。
(2)概要设计,对调查得到的数据进行分析,根据其要求实现的功能分析系统结构和界面将实现的基本功能。
(3)详细设计,设计系统界面并编辑实现其各个功能的代码。
(4)调试分析,在设计完成后,调试系统运行的状况,修改完善系统,然后进行测试。
一、需求分析
1学校以及各景点介绍模块
采用一维数组将学校景点依次排放好编号G.vex[i].number=i在选择校园介绍的时候,弹出G.vex[0]校园简介。
在选择各景点信息的时候,可按编号查询
2查询最短路径(主要)
查出出发地到想要到达的景点的最短路径,初步构想采用最经典的迪杰斯特拉算法最短路径函数
3查询各点距离
将所有景点的距离显示出来。
4主菜单页面显示
提供使用者选择功能界面,按照提示进行操作。
5退出
完成需要操作时,退出系统
SearchMenuI 输出景点介输出“错绍误”结束 校园导航系统 子菜单 校园介绍,各景 查询校园所有景 最短路径查询 查询各景点距 点介绍 点路径 输入景点 离 编号 =i编号值 输入起点与终点 输出最短路径 校园导航系统模式图 二、概要设计 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 V-S}∈D[j]=Min{D|vi,使得vj)选择2(. (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 使用的系统头文件 #includestdio.h/*I/O函数*/ #includestdlib.h/*使用system()exit()atoi()malloc()free()函*/ #includestring.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瘮硥? ? 楳桧? 江南大学东门; ? 敶學崹献杩瑨尽国家重点实验室; ? 敶學? ? 楳桧? 第二教学楼; G瘮硥? 崱献杩瑨尽第四食堂; ? 敶學? ? 楳桧? 臻善楼; ? 敶學㈱? 楳桧? 江南大学南门; 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; .arcs[5][3]=620;G.arcs[3][5]=G 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(\************************江南大学大学地图导航系统*******************\n); printf(━━━━━━━━━━━━━━━1江南大学北大门━━━━━━━━━━\n); printf(┃┃ ┃\n); printf(┃┃ ┃\n); 江南3━━━━━━━━━━━━━━━━━━━━━━━━━第一食堂2printf( 大学东偏门\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(江南大学校北大门: 这是江南大学最有名的大门,是一座充满历史感的高大的牌坊,正上面写着“江南大学”四个大字,背面写着“江南第一学府”六个字\n); printf(江南大学第一食堂\n); printf(江南大学东偏门: \n); printf(设计学院: \n); printf(_x0005_体育中心: \n); printf(物联网工程学院: \n); printf(_x0007_图书馆: 高达15层的雄伟的图书馆\n); printf(8江南大学东门: \n); printf(9国家重点实验室: \n); printf(第二教学楼: \n); printf(第四食堂: \n); printf( 臻善楼: \n); printf( 江南大学南门: \n); } voidShortestPath(intnum)//迪杰斯特拉算法最短路径函数num为入口点的编号 { 为计数变量v和w、intv,w,i,t;//i 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; numfinal[num]=1;//初始化顶点属于S集合 集合Snum//开始主循环,每一次求得到某个顶点的最短路径,并将其加入到for(i=1;i nummin=Max;//当前所知离顶点的最近距离for(w=1;w 顶点在if(! final[w])//wv-s中numif(D[w] v=w; min=D[w]; }//更新当前最短路径极其距离 集合s加入到v顶点更近的num离final[v]=1;// 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欢迎使用江南大学导航图系统\n); printf(\\t1.查询地点之间最短路径\n); printf(\\t2.江南大学景点介绍\n); printf(\\te.退出\n); printf(\\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(\ \t从%s到%s的最短路径是,G.vex[sight1].sight,G.vex[sight2].sight); printf(\(最短距离为%d.m)\n\n\t,D[a]); printf(\%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(\ ); } } } } } 主界面最短路线查询显示函数voidmain()// { intv0,v1; chare; charck; CreateMGraph(NUM); do { system(cls); ck=Menu(); switch(ck) { case'1': gate: system(cls); Map(); do { printf(\ \n\t\t\t请选择出发地序号(1~13): ); scanf(%d,&v0); if(v0<1||v0>13) printf(\ \n\t\t\t\t输入错误! \n); }while(v0<1||v0>13); do { );13~1请选择目的地序号(printf(\\t\t: ) scanf(%d,&v1); if(v1<1||v1>13||v1==v0) ! \n); printf(\ \n\t\t\t\t输入错误}while(v1<1||v1>13||v1==v0); ShortestPath(v0); Display(v0,v1); printf(\ \n\t\t\t\t按回车键继续,按e退回首页\n); getchar(); scanf(%c,&e); if(e=='e') break; gotogate; case'2': system(cls); Info(); printf(\ \n\t\t\t\t按回车键返回首页...\n); getchar(); getchar(); break; }; } while(ck! ='e'); } 四、程序调试及运行结果贴图 五、总结 通过这次设计,是我得以更好的掌握C语言的编程,对一些算法思想和实现方法有了更深的了解。 在设计中,出现了一系列的问题,好多次都差点坚持不下去,但最终还是完成了! 当程序编译并且运行成功的那一刻,真的是非常的激动。 感谢老师平时上课时的教导,可以使我更好的完成这次作业
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 校园 导航系统 算法 分析 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)