1、需求分析
设计一个校园导游系统程序,为来访的客人提供各种服务的信息查询。
(1).设计工商学院校园无向图,所含的景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2).为来访客人提供图中任意景点相关信息的查询。
(3).为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
2、设计思路
校园旅游模型是由景点和景点之间的路径组成的,所以这完全可以用数据结构中的图来模拟。用图的结点代表景点,用图的边代表景点之间的路径。所以首先应设计一个图类。结点值代表景点信息,边的权值代表景点间的距离。结点值及边的权值用顺序表存储,所以需要设计一个顺序表类。本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。计算路径长度和最短路线时可用弗洛伊德(Floyd)算法实现。最后用switch选择语句选择执行浏览景点信息或查询最短路径。
3 算法设计
3.1 概要设计
3.1.1 程序中包含的模块 (1)主程序模块 主函数:void main(void)
void cmd(void) cmd修改显示框大小,字体背景颜色,初始化景点,景点信息打印菜单,
MGraph InitGraph(void); //初始化图。
MGraph * CreatUDN(MGraph *G); //初始化图形接受用户输入 void Menu(void);//菜单函数 void Browser(MGraph *G);//浏览函数 void ShortestPath_DIJ(MGraph *G);
void Floyd(MGraph *G);// 查询图中任意两个景点间的所有路径 void Search(MGraph *G);//查找函数
int LocateVex(MGraph *G,char*v); // 迪杰斯特拉算法 计算起点各顶点间短
路径,
void print(MGraph *G); //输出函数 (2)查询模块
景点信息查询:void introduce()
最短路径查询:要查找的两景点的最短距离:用floyd算法求两个景点的最短路径:
(3)打印模块:void print(MGraph *G); 3.1.2模块间的调用关系
主函数main()调用void cmd(void)调用menu 并且用switch设置开关语句。 3.2 详细设计 3.2.1定义符号变量
#define INFINITY 1000 /*穷*/
#define MAX_VERTEX_NUM 40/*定义全局变量*/
创建两个类 存储景点信息和存储景点道路和长度 typedef struct ArCell //邻接矩阵 {
int adj; //存储路径长度
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct //图顶点表示主要景点存放景点编号、名称、简介等信息 {
char name[20]; int num;
char introduction[60];//简介 }infotype;
typedef struct//图中的边表示景点间的道路,存放路径长度等信息。 {
infotype vexs[MAX_VERTEX_NUM];//顶点信息域 AdjMatrix arcs;
int vexnum,/*顶点数*/ arcnum;//边个数 }MGraph; MGraph b;
3.2.2自定义函数原型说明
给出函数声明
1 / 22
void cmd(void);
MGraph InitGraph(void); void Menu(void);
void Browser(MGraph *G);
void ShortestPath_DIJ(MGraph *G); void Floyd(MGraph *G); void Search(MGraph *G);
int LocateVex(MGraph *G,char*v); MGraph * CreatUDN(MGraph *G); void print(MGraph *G);
3.2.3定义各顶点之间的距离: for(i=0;i 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; 2 / 22 G.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;i 3.2.4界面菜单设计:菜单选择 void Menu() { printf(\ 武汉工商学院院导游图\\n\ printf(\ ┏━━━━━━━━━━━━━━━━━━━━┓\\n\ printf(\ ┃ 1.浏览校园全景 ┃\\n\ printf(\ ┃ 2.查看所有游览路线 ┃ \\n\ printf(\ ┃ 3.确定两景点之间最短距离 ┃\\n\ printf(\ ┃ 4.查看景点信息 ┃\\n\ printf(\ ┃ 5.退出导游系统 ┃\\n\ printf(\ ┗━━━━━━━━━━━━━━━━━━━━┛\\n\ printf(\} Menu(); scanf(\ while(i!=5) { switch(i) 3 / 22 { case 1:system(\ case 2:system(\ case 3:system(\ case 4:system(\ case 5:exit(1);break; default:break; } 3.2.6介绍景点: void Browser(MGraph *G) { int v; printf(\┏━━┳━━━━━━━━━━┳━━━━━━━━━┓\\n\ printf(\┃编号┃景点名称 ┃简介 ┃\\n\ printf(\┗━━┻━━━━━━━━━━┻━━━━━━━━━┛\\n\ for(v=0;v printf(\┗━━┻━━━━━━━━━━┻━━━━━━━━━┛\\n\} 3.2.7要查找的两个景点的最短距离: 用floyd算法求两个景点的最短路径 void Floyd(MGraph *G)// 查询图中任意两个景点间的所有路径。 { int v,u,i,w,k,j,flag=1,p[20][20][20],D[20][20]; for(v=0;v { p[v][w][v]=1;p[v][w][w]=1; } 4 / 22