当前位置:文档之家› 校园导游系统程序课程设计报告

校园导游系统程序课程设计报告

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自定义函数原型说明给出函数声明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.vexnum;i++)for(j=0;j<G.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;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<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[j][i].adj=G.arcs[i][j].adj;return G;3.2.4界面菜单设计:菜单选择void Menu(){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){case 1:system("cls");Browser(&b);Menu();break;case 2:system("cls");ShortestPath_DIJ(&b);Menu();break; case 3:system("cls");Floyd(&b);Menu();break;case 4:system("cls");Search(&b);Menu();break;case 5:exit(1);break;default:break;}3.2.6介绍景点:void Browser(MGraph *G){int v;printf("┏━━┳━━━━━━━━━━┳━━━━━━━━━┓printf("┃编号┃景点名称┃简介┃\n");printf("┗━━┻━━━━━━━━━━┻━━━━━━━━━┛\n");for(v=0;v<G->vexnum;v++)printf("┃%-4d┃%-20s┃%-60s \n",G->vexs[v].num,G->vexs[v].name,G->vexs[v].introductio n);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<G->vexnum;v++)for(w=0;w<G->vexnum;w++){D[v][w]=G->arcs[v][w].adj;for(u=0;u<G->vexnum;u++)p[v][w][u]=0;if(D[v][w]<INFINITY){p[v][w][v]=1;p[v][w][w]=1;}for(u=0;u<G->vexnum;u++)for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++)if(D[v][u]+D[u][w]<D[v][w]){D[v][w]=D[v][u]+D[u][w];for(i=0;i<G->vexnum;i++)p[v][w][i]=p[v][u][i]||p[u][w][i];}while(flag){ printf("请输入出发地编号:");scanf("%d",&k);if(k<0||k>G->vexnum){printf("景点编号存!\n请输入出发地编号:");scanf("%d",&k);}printf("请输入目的地编号:");scanf("%d",&j);if(j<0||j>G->vexnum){ printf("景点编号存!\n请输入目的地编号:");scanf("%d",&j); }if(k>=0&&k<G->vexnum&&j>=0&&j<G->vexnum) flag=0;}printf("%s",G->vexs[k].name);for(u=0;u<G->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的最短路径的长度。

相关主题