1、需求分析设计一个校园导游系统程序,为来访的客人提供各种服务的信息查询。(1).设计工商学院校园无向图,所含的景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。(2).为来访客人提供图中任意景点相关信息的查询。(3).为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。2、设计思路校园旅游模型是由景点和景点之间的路径组成的,所以这完全可以用数据结构中的图来模拟。用图的结点代表景点,用图的边代表景点之间的路径。所以首先应设计一个图类。结点值代表景点信息,边的权值代表景点间的距离。结点值及边的权值用顺序表存储,所以需要设计一个顺序表类。本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。计算路径长度和最短路线时可用弗洛伊德(Floyd)算法实现。最后用switch选择语句选择执行浏览景点信息或查询最短路径。3算法设计3.1概要设计3.1.1程序中包含的模块(1)主程序模块主函数:voidmain(void)voidcmd(void)cmd修改显示框大小,字体背景颜色,初始化景点,景点信息打印菜单,MGraphInitGraph(void);//初始化图。MGraph*CreatUDN(MGraph*G);//初始化图形接受用户输入voidMenu(void);//菜单函数voidBrowser(MGraph*G);//浏览函数voidShortestPath_DIJ(MGraph*G);voidFloyd(MGraph*G);//查询图中任意两个景点间的所有路径voidSearch(MGraph*G);//查找函数intLocateVex(MGraph*G,char*v);//迪杰斯特拉算法计算起点各顶点间短1路径,voidprint(MGraph*G);//输出函数(2)查询模块景点信息查询:voidintroduce()最短路径查询:要查找的两景点的最短距离:用floyd算法求两个景点的最短路径:(3)打印模块:voidprint(MGraph*G);3.1.2模块间的调用关系主函数main()调用voidcmd(void)调用menu并且用switch设置开关语句。3.2详细设计3.2.1定义符号变量#defineINFINITY1000/*穷*/#defineMAX_VERTEX_NUM40/*定义全局变量*/创建两个类存储景点信息和存储景点道路和长度typedefstructArCell//邻接矩阵{intadj;//存储路径长度}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedefstruct//图顶点表示主要景点存放景点编号、名称、简介等信息{charname[20];intnum;charintroduction[60];//简介}infotype;typedefstruct//图中的边表示景点间的道路,存放路径长度等信息。{infotypevexs[MAX_VERTEX_NUM];//顶点信息域AdjMatrixarcs;intvexnum,/*顶点数*/arcnum;//边个数}MGraph;MGraphb;3.2.2自定义函数原型说明给出函数声明2voidcmd(void);MGraphInitGraph(void);voidMenu(void);voidBrowser(MGraph*G);voidShortestPath_DIJ(MGraph*G);voidFloyd(MGraph*G);voidSearch(MGraph*G);intLocateVex(MGraph*G,char*v);MGraph*CreatUDN(MGraph*G);voidprint(MGraph*G);3.2.3定义各顶点之间的距离:for(i=0;iG.vexnum;i++)for(j=0;jG.vexnum;j++)G.arcs[i][j].adj=INFINITY;G.arcs[0][1].adj=80;/*路径度*/G.arcs[0][2].adj=180;G.arcs[0][6].adj=200;G.arcs[1][11].adj=120;G.arcs[1][2].adj=100;G.arcs[2][5].adj=50;G.arcs[3][4].adj=60;G.arcs[4][9].adj=140;G.arcs[5][9].adj=250;G.arcs[5][7].adj=150;G.arcs[6][7].adj=190;G.arcs[6][9].adj=150;G.arcs[8][7].adj=130;G.arcs[8][6].adj=50;G.arcs[10][12].adj=100;G.arcs[9][10].adj=150;G.arcs[3][4].adj=190;G.arcs[5][13].adj=150;G.arcs[14][7].adj=350;3G.arcs[2][3].adj=190;G.arcs[2][9].adj=150;G.arcs[2][11].adj=120;G.arcs[0][8].adj=120;G.arcs[1][2].adj=50;G.arcs[10][12].adj=170;G.arcs[12][15].adj=160;for(i=0;iG.vexnum;i++)for(j=0;jG.vexnum;j++)G.arcs[j][i].adj=G.arcs[i][j].adj;returnG;3.2.4界面菜单设计:菜单选择voidMenu(){printf(\n武汉工商学院院导游图\n);printf(┏━━━━━━━━━━━━━━━━━━━━┓\n);printf(┃1.浏览校园全景┃\n);printf(┃2.查看所有游览路线┃\n);printf(┃3.确定两景点之间最短距离┃\n);printf(┃4.查看景点信息┃\n);printf(┃5.退出导游系统┃\n);printf(┗━━━━━━━━━━━━━━━━━━━━┛\n);printf(Option-:);}Menu();scanf(%d,&i);while(i!=5){switch(i)4{case1:system(cls);Browser(&b);Menu();break;case2:system(cls);ShortestPath_DIJ(&b);Menu();break;case3:system(cls);Floyd(&b);Menu();break;case4:system(cls);Search(&b);Menu();break;case5:exit(1);break;default:break;}3.2.6介绍景点:voidBrowser(MGraph*G){intv;printf(┏━━┳━━━━━━━━━━┳━━━━━━━━━┓\n);printf(┃编号┃景点名称┃简介┃\n);printf(┗━━┻━━━━━━━━━━┻━━━━━━━━━┛\n);for(v=0;vG-vexnum;v++)printf(┃%-4d┃%-20s┃%-60s\n,G-vexs[v].num,G-vexs[v].name,G-vexs[v].introduction);printf(┗━━┻━━━━━━━━━━┻━━━━━━━━━┛\n);}3.2.7要查找的两个景点的最短距离:用floyd算法求两个景点的最短路径voidFloyd(MGraph*G)//查询图中任意两个景点间的所有路径。{intv,u,i,w,k,j,flag=1,p[20][20][20],D[20][20];for(v=0;vG-vexnum;v++)for(w=0;wG-vexnum;w++){D[v][w]=G-arcs[v][w].adj;for(u=0;uG-vexnum;u++)p[v][w][u]=0;if(D[v][w]INFINITY){p[v][w][v]=1;p[v][w][w]=1;}5}for(u=0;uG-vexnum;u++)for(v=0;vG-vexnum;v++)for(w=0;wG-vexnum;w++)if(D[v][u]+D[u][w]D[v][w]){D[v][w]=D[v][u]+D[u][w];for(i=0;iG-vexnum;i++)p[v][w][i]=p[v][u][i]||p[u][w][i];}while(flag){printf(请输入出发地编号:);scanf(%d,&k);if(k0||kG-vexnum){printf(景点编号存!\n请输入出发地编号:);scanf(%d,&k);}printf(请输入目的地编号:);scanf(%d,&j);if(j0||jG-vexnum){printf(景点编号存!\n请输入目的地编号:);scanf(%d,&j);}if(k=0&&kG-vexnum&&j=0&&jG-vexnum)flag=0;}printf(%s,G-vexs[k].name);for(u=0;uG-vexnum;u++)if(p[k][j][u]&&k!=u&&j!=u)printf(--%s,G-vexs[u].name);printf(--%s,G-vexs[j].name);printf(总路线%dm\n,D[k][j]);}3.2.8查看所有游览路线迪杰斯特拉算法计算单源最短路径,引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v0到每个终点vi的最短路径的长度。若从v到vi有弧,则D为弧上的权值;6否则置D为∞。4测试分析4.1主程序界面主程序从voidmain()开始运行voidcmd(void)cmd修改显示框大小,字体背景颜色,初始化景点,景点信息的赋值初始化无向邻接图b=InitGraph();调用menu菜单函数打印菜单,提示用户输入选择功能。图4-1.主程序界面4.2浏览景点信息输出浏览比较简单就是把原来的景点信息利用for循环输出,intv=0;v小于最多的景点个数输出景点信息。依次输出。图4-2浏览景点信息4.3查看所有游览线路查看所有路线是使用voidShortestPath_DIJ(MGraph*G)//迪杰斯特拉算法计算起点各顶点间短路径,然后利用for循环输出计算的结果。输入景点不正确时会输出景点不存在请重新7输入景点编号。图4-3:查看所有游览路线4.4确定两景点之间最短距离利用voidFloyd(MGraph*G)//函数利用循环嵌套查询图中存在的任意两个景点间的最短路径再利用循环输出,如果景点不存在将会输出景点不存在请输入出发地(目的地)编号。图4-4:确定两景点之间最短距离4.5查看景点信息利用voidSearch(MGraph*G)//函数,查看景点信息查找景点编号,当输入景点编号不在范围时输出“景点编号不存在请重新输入编号:”输入正确时输出景点信息。8图4-5:查看景点信息5系统功能及实现5.1主程序界面定义一个I,然后,调用InitGraph()函数初始化图,再调用menu()函数,再输入选择,利用switch开关语句,用户选择,需要的功能,实现想要的.。Inti1.浏览校园全景i=?2.查看所有路线3.两景点最短距离4.查看景点信息5.退出导游系统12345图5-1.主程序界面5.2浏览景点信息定义v;用for循环for(v=0;iG.vexnum;v++)当条件成立的时候执行printf语句,直到循环不成立的时候输出结束,intvfor(i=0;iG.vexnum;)printf(┃%-4d┃%-20s┃%-60s\n,G-vexs[v].num,G-vexs[v].na