创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*实验三:校园导游咨询一、设计方案简介设计一个校园导游程序,为来访的客人提供各种信息查询服务。
1)设计你所在学校的校园平面图,2)为来访客人提供图中任意景点相关信息的查询。
3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
二、设计题目实现:实际需求1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息:以边表示路径,存放路径长度等相关信息。
2)为来访客人提供图中任意景点相关信息的查询。
3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
2)概要设计1、校园全景一览图、显示出校园的平面图。
2、提供校园中任意景点问路查询,即求任意两个景点之间的所有路径。
3、提供校园图中多个景点的最佳访问路线查询,即求途径这过个景点的最佳(短)路径。
1.功能模块图;void Map();//校园地图void CreateGraph();//创建图void OutputPlace();//输出景点列表void SearchPlace();//查询景点信息void SearchPath();//查询最短路径void Shortpath(int i);//计算最短路径void Output(int sight1,int sight2);//输出函数2.各个模块详细的功能描述。
Map();//显示校园整体的地图、包含学校各景点的详细位置CreateGraph();//创建图、主要用来保存各景点信息OutputPlace();//输出景点列表、供选择景点信息查询时使用SearchPlace();//查询景点信息、景点的名称及介绍SearchPath();//查询最短路径、两景点间最短距离Shortpath(int i);//计算两景点间最短路径Output(int sight1,int sight2);//输出两景点最短路径及信息四.详细设计1.功能函数的调用关系图2012年01 月2.各功能函数的数据流程图全局变量Graph G;int path[NUM][NUM];int D[NUM];3.重点设计及编码创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*重点设计:求最短路径编码:void Shortpath(int num)//迪杰斯特拉算法最短路径{int v,w,i,t;//i、w和v为计数变量//t表示景点个数int final[NUM]; //标志数组、用来存放顶点的信息int min;//记录权值、最终输出路径for(v=0;v<NUM;v++)2012年01 月{final[v]=0; //假设从顶点num到顶点v没有最短路径D[v]=G.arc[num][v].length;//将num到其余顶点的最短路径长度初始化为权值for(w=0;w<NUM;w++)path[v][w]=0;//初始化从v到w的路径值if(D[v]<MAX) //存在路径{path[v][num]=1; //存在标志置为一path[v][v]=1; //自身到自身}}D[num]=0;//初始化新路径final[num]=1; //初始化num顶点属于final集合//开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到final集合for(i=0;i<NUM;++i) // 其余G.vexnum-1个顶点{min=MAX; //当前所知离顶点num的最近距离for(w=0;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=0;w<NUM;++w) //更新当前最短路径极其距离if(!final[w]&&((min+G.arc[v][w].length)<D[w]))//不在s集合,并且比以前所找到的路径都短就更新当前路径{D[w]=min+G.arc[v][w].length;//更新路径for(t=0;t<NUM;t++)path[w][t]=path[v][t];path[w][w]=1;}}}2012年01 月void Output(int sight1,int sight2) // 输出函数{int a,b,c,d,q=0;//a、b、c和d为计数变量//q控制计数变量、用于换行a=sight2; //将景点二赋值给aif(a!=sight1) // 如果景点二不和景点一输入重合,则进行...{printf("\t\t\t\t\t\t从%s到%s的最短路径是:\n\n\t\t\t\t\t",G.vertex[sight1].name,G.vertex[sight2].name);//输出提示信息//输出sight1到sight2的最短路径长度,存放在D[]数组中printf("\t%s",G.vertex[sight1].name); //输出景点一的名称d=sight1; //将景点一的编号赋值给dfor(c=0;c<NUM;++c){gate:; //标号,可以作为goto语句跳转的位置path[a][sight1]=0;for(b=0;b<NUM;b++){if(G.arc[d][b].length<MAX&&path[a][b]) //如果景点一和它的一个临界点之间存在路径且最短路径{printf("--->%s",G.vertex[b].name); //输出此节点的名称q=q+1; //计数变量加一,满8控制输出时的换行创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*path[a][b]=0;d=b; //将b作为出发点进行下一次循环输出,如此反复if(q%14==0) printf("\n");goto gate;}}}2012年01 月printf("\n\n\t\t\t\t\t\t最短距离为%dm.\n\n\t",D[a]);}}五.测试数据及运行结果系统主界面学校平面图2012年01 月学校景点图2012年01 月2012年01 月2012年 01月最短路径信息查询2012年 01月异常信息三、设计评述:设计者对本设计的评述及通过设计的收获体会1.改进方案系统还有部分漏洞未能修复、不够绝对的稳定、还需改进!求最短路径时可以采用比较简单的哈密尔顿算法。
本次课程设计仅完成了要求的基本功能、由于平时掌握的不够好以及时间关系未能完成选作功能、这是一大缺陷!另外通过本次课程设计也更好的掌握了平时所学的知识、通过实践学到了许多课本上没有的知识!2.体会以后要加强动手时间能力、多与同学交流算法精髓!在编写程序中尽量做到独立完成、对于自己想要完成的问题要主动编程完成、这样自己是一个很大的提升、也能学到很多的知识、熟练编程!报告最后有两部分附录附录一:参考资料1、C语言程序设计(谭浩强版)2、数据结构(C语言版)编著:严蔚敏、吴伟民清华大学出版社附录二:源程序(将所有的源程序附在最后的附录中)// 查询景点信息.cpp : Defines the entry point for the console application.//2012年01 月#include "stdafx.h"#include "stdio.h"#include <string.h>#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <conio.h>#define NUM 20#define MAX 100000#define FALSE 0#define TURE 1typedef struct ArcNode{int length; //路径长度} ArcNode, *ArcLink; //边结点的定义typedef struct VertexNode{int number; //景点的编号char *name; //景点的名称char *info; //景点的简介} VertexNode; //顶点结点的定义创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*typedef struct Graph{VertexNode vertex[NUM];ArcNode arc[NUM][NUM];int vexnum,arcnum; //图的顶点数,边数} Graph; //图的定义Graph G;2012年01 月int path[NUM][NUM];int D[NUM];void CreateGraph();//创建图void Map();//学校地图void outputplace();//输出校园景点名称void searchplace();//查询景点信息void searchpath();//查询最短路径void shortestpath_DIJ(int num);//迪杰斯特拉算法最短路径void output(int sight1,int sight2);//输出函数void CreateGraph()//创建图{int i,j;G.vexnum=12;G.arcnum=17;for(i=1;i<NUM;i++)G.vertex[i].number=i;G.vertex[1].name="太原理工大学正门";G.vertex[1].info="学校正门位于学校的正南方向、是进入学校前的第一道亮丽\n\t\t的风景线!\n";G.vertex[2].name="电机馆";G.vertex[2].info="电机馆是数学系,电子信息系,自动化,通讯等学院的学院楼!\n";G.vertex[3].name="科学楼";G.vertex[3].info="科学楼是我校科研机构场所,也是山西省网关所在地!\n";G.vertex[4].name="多学科楼";G.vertex[4].info="科学楼是计算机科学与技术学院,软件学院,电子信息学院,\n\t\t土木,建筑的学院楼,也是我校最好的学院楼!\n";G.vertex[5].name="图书馆";G.vertex[5].info="太原理工图书馆经历了初创时期,发展时期,面向现代化的转型时期。