校园导游咨询程序设计报告
校园导游咨询系统课程设计报告
目录一、需求分析 (2)二、概要设计 (2)三、详细设计 (4)四、设计和调试分析 (9)五、用户手册 (9)六、测试结果 (10)1.操作命令符为s/S, (10)2.操作命令符为v/V, (11)3.操作符为v/V, (11)4.操作符为e/E, (11)5.综上可以查得: (12)七、附录 (12)参考文献 (13)校园导游咨询系统一、需求分析1.从福建农林大学的平面图中选取28个有代表性的景点,抽象成一个无向带权图。
以图中顶点表示景点,边上的权值表示两地间的距离。
2.本程序的目的是为了用户提供路径咨询,根据用户指定的始点和终点输出相应路径,或者根据用户指定的景点输出景点的信息。
3.测试数据(附后)。
二、概要设计1.抽象数据类型图的定义如下:ADT {struct arcnode{ int v;int w;struct arcnode *next;};struct node{ int degree;struct arcnode *first;}adjlist[28];}2.主程序V oid mian(){初始化临接矩阵windows(); / /初始化串口getch();}3.函数定义的变量#define infi 32767#define MAX 28int M,N; //无向图中的顶点M,无向图的变数int adjmatrix[MAX][MAX]; // 保存临接矩阵的2唯数组char *schoolIfo[MAX+1]={ //此数组用于界面显示信息"null","东台-dt","金1-j1","金2-j2","金3-j3","金4-j4","食堂-st","田径场-tjc","校大门-xdm","创业园-cyy","校医院-xyy","图书馆-tsg","映辉桥-yhq","观音湖-gyh","成教楼-cjl","生物楼-swl","博学楼-bxl","创新楼-cxl","明德楼-mdl","拓荒广场-thgc","南区公寓-nqgy","田家炳楼-tjbl","农大新区-ndxq","中华广场-zhgc","905终点站-zdz","蜂疗医院-flyy","研究生公寓-yjsgy","昌融学生街-crxsj","北区学生公寓-bqxsgy"};char *charcd2[MAX]={ //用于显示最短路径时走向的数组"校大门","金1","昌融学生街","创业园","东台","金2","田径场","拓荒广场","南区公寓","校医院","食堂","成教楼","创新楼","田家炳楼","农大新区","观音湖","金3","映辉桥","金4","明德楼","中华广场","905终点站","蜂疗医院","生物楼","博学楼","图书馆","研究生公寓","北区学生公寓"};char *charcd[MAX]={ //用于用户输入起始点与终止点时对应的数组"xdm","j1","crxsj","cyy","dt","j2","tjc","thgc","nqgy","xyy","st","cjl","cxl","tjbl","ndxq","gyh","j3","yhq","j4","mdl","zhgc","zdz","flyy","swl","bxl","tsg","yjsgy","bqxsgy"};char *infor[MAX]={ //介绍景点信息数组"校大门:\n 占不提供介绍","金1:\n 指金山大道的一处,由图可知","昌融学士街:\n 农大的小吃一条街,来农大一定要来尝尝!","创业园:\n 农大创业有志者的孵化地","东台:\n 农大老师所住之处","金2:\n 金山大道的第二处有图可看出","田径场:\n 农大的运动场地","拓荒广场:\n 大礼堂就在此处","南区公寓:\n 顾名思意,学生公寓","校医院:\n 希望你不要来","食堂:\n 学校八九十食堂都在这,不错蛮好吃的。
校园导游咨询程序
【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】(1)设计你的学校的校园平面图,所含景点不少于10个。
以图中顶点表示学校各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点的问路查询.(3)为来访客人提供图中任意景点相关信息的查询。
【测试数据】由读者根据实际情况指定。
【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。
顶点和边均含有相关信息。
#include<stdio.h>#include<process.h>#include <cstdlib>#include<string.h>#define INT_MAX 10000#define N 20int Length[N][N];// 边的值int shortest[N][N];//两点间的最短距离int path[N][N];// 经过的景点(数字代表)void introduce();//景点介绍int shortestdPath();//任意两点的最短距离void floyed(); //弗洛伊德算法void display(int i,int j);//打印路径char str[N+1][20] = {" ","南区大门","交大子弟学校","文达湖","软件学院","南区礼堂","校医院","建设银行","宿舍楼群A","中国移动","国防生大楼","四食堂","艺术学院","8栋","一食堂","逸夫楼","图书馆","基础学院","信息学院","土木学院","电气学院"};//文字代表int main(){/*主函数*/int i,j;char k;for(i=0;i<=N;i++)for(j=0;j<=N;j++)Length[i][j]=INT_MAX;Length[1][3]=Length[3][1]=170;Length[2][3]=Length[3][2]=120;Length[3][4]=Length[4][3]=400;Length[2][5]=Length[5][2]=350;Length[3][6]=Length[6][3]=200;Length[4][8]=Length[8][4]=50;Length[8][9]=Length[9][8]=150;Length[5][12]=Length[12][5]=150;Length[6][7]=Length[7][6]=160;Length[7][9]=Length[9][7]=150;Length[6][13]=Length[13][6]=200;Length[7][14]=Length[14][7]=200;Length[9][11]=Length[11][9]=100;Length[11][14]=Length[14][11]=100;Length[12][13]=Length[13][12]=150;Length[13][14]=Length[14][13]=250;Length[12][15]=Length[15][12]=100;Length[13][16]=Length[16][13]=80;Length[13][17]=Length[17][13]=80;Length[17][19]=Length[19][17]=100;Length[19][20]=Length[20][19]=80;Length[18][16]=Length[16][18]=50;Length[15][18]=Length[18][15]=160;Length[18][20]=Length[20][18]=200;Length[15][10]=Length[10][15]=50;Length[1][1]=Length[2][2]=Length[3][3]=Length[4][4]=Length[5][5]=0;Length[6][6]=Length[7][7]=Length[8][8]=Length[9][9]=Length[10][10]=0; Length[11][11]=Length[12][12]=Length[13][13]=Length[14][14]=Length[15][15]=0; Length[16][16]=Length[17][17]=Length[18][18]=Length[19][19]=Length[20][20]=0;while(1){printf("**********************欢迎使用华东交大南区导游系统!******************\n\n");printf("1.景点信息查询请按1 \n");printf("2.景点最短路径查询请按2 \n");printf("3.退出系统请按3 \n\n");printf("学校景点列表:\n");printf("1:南区大门");printf("2:交大子弟学校");printf("3:文达湖");printf("4:软件学院");printf("5:南区礼堂\n");printf("6:校医院");printf("7:建设银行");printf("8:宿舍楼群A ");printf("9:中国移动");printf("10:国防生大楼\n");printf("11:四食堂");printf("12:艺术学院");printf("13:8栋");printf("14:一食堂");printf("15:逸夫楼\n");printf("16:图书馆");printf("17:基础学院");printf("18:信息学院");printf("19:土木学院");printf("20:电气学院\n\n");printf("*************************************************************** ******\n\n");printf("请选择服务:");scanf("\n%d",&k);switch(k){case 1:printf("进入景点信息查询:\n");introduce();break;case 2:printf("进入最短路径查询:");shortestdPath();break;case 3:exit(0);default:printf("输入信息错误!\n请输入1,2,3\n");break;}}return 0;}/*main*/void introduce(){/*景点介绍*/int a;printf("请输入您想了解的景点编号:");scanf("%d",&a);getchar();printf("\n");switch(a){case 1:printf("1:南区大门\n\n 学校的南区正门,与北区大门正对遥遥相对\n\n");break;case 2:printf("2:交大子弟学校\n\n 生源包括学校部分老师的孩子和学校周围村庄的孩子\n\n");break;case 3:printf("3:文达湖\n\n 湖心设有喷泉,湖畔绿树掩映\n\n");break;case 4:printf("4:软件学院\n\n 成立于2002年,学院有在校师生近3700人,部分学生培养方式为“软件工程+应用背景专业\n\n");break;case 5:printf("5:南区礼堂\n\n 是交大中大节日活动的举办场所,观众几乎场场爆满,星期六和星期天日新网在南礼有偿播放大片\n\n");break;case 6:printf("6:校医院\n\n 校医院的医生经验丰富,开的药钱学校给报销绝大多数\n\n");break;case 7:printf("7:建设银行\n\n 设有自动取款机,交大学生的现金多数是从那里取出来的\n\n");break;case 8:printf("8:宿舍楼群A\n\n 南区1/3 的男生住在那里\n\n");break;case 9:printf("9:中国移动\n\n 这里还有中国联通和中国电信营业厅\n\n\n");break;case 10:printf("10: 国防生大楼\n\n 国防生居住和训练的地方。
java校园导游咨询课程设计
java校园导游咨询课程设计一、课程目标知识目标:1. 理解Java语言面向对象编程的基本概念,掌握类的定义、属性和方法的声明及使用。
2. 学习使用Java异常处理机制,提高程序的健壮性。
3. 了解Java事件处理机制,掌握事件监听器和事件处理方法的使用。
4. 掌握Java图形用户界面(GUI)设计,熟练运用Swing组件构建应用程序界面。
技能目标:1. 能够运用面向对象思想,设计并实现一个校园导游咨询系统的核心功能模块。
2. 能够使用Java异常处理机制,对程序中可能出现的错误进行有效捕获和处理。
3. 能够利用事件处理机制,实现导游咨询系统的用户交互功能。
4. 能够运用Swing组件,设计美观、易用的校园导游咨询系统界面。
情感态度价值观目标:1. 培养学生团队协作能力,提高沟通与表达能力,增强解决实际问题的信心。
2. 激发学生对计算机编程的兴趣,培养自主学习、持续探究的精神。
3. 引导学生关注校园环境,提高环保意识,培养学生热爱校园的情感。
课程性质:本课程为实践性较强的Java编程课程,通过设计校园导游咨询系统,使学生将所学知识应用于实际项目中,提高编程能力和解决实际问题的能力。
学生特点:学生已经掌握了Java编程基础,具有一定的编程能力,但面向对象编程和事件处理等方面尚需加强。
教学要求:注重理论与实践相结合,引导学生通过自主探究、团队协作的方式完成课程任务,提高学生的编程技能和综合素养。
同时,关注学生的情感态度价值观培养,使学生在学习过程中得到全面发展。
二、教学内容1. 面向对象编程基础:- 类与对象的概念及关系- 成员变量和局部变量的区别与使用- 方法的定义、调用及重载- 构造方法的作用及定义2. Java异常处理:- 异常的概念及分类- try-catch语句的使用- 异常的抛出和自定义异常3. Java事件处理:- 事件监听器接口及事件类的概念- 常用事件监听器及事件适配器- 事件处理方法的设计与实现4. Java图形用户界面设计:- Swing组件的概述及使用- 布局管理器的选择与运用- 菜单、对话框及工具栏的设计与实现5. 校园导游咨询系统设计与实现:- 系统需求分析- 功能模块划分- 数据存储与操作- 界面设计与实现教学内容安排与进度:第一周:面向对象编程基础,完成类的定义、对象创建及方法调用第二周:Java异常处理,实现对可能出现的错误进行捕获和处理第三周:Java事件处理,实现导游咨询系统的用户交互功能第四周:Java图形用户界面设计,设计并实现系统界面第五周:整合前面所学知识,完成校园导游咨询系统的设计与实现教材章节关联:《Java程序设计》第3章:面向对象编程基础《Java程序设计》第5章:异常处理《Java程序设计》第6章:事件处理与图形用户界面设计教学内容确保科学性和系统性,结合课程目标,以实践为导向,使学生能够将所学知识应用于实际项目中,提高编程能力和解决实际问题的能力。
齐鲁工业大学校园导游咨询系统设计报告
成绩:__________________ 校园导游系统设计报告学院名称理学院一、系统分析此次课程设计的主要内容是校园导航系统,所谓系统其实也不尽然,只不过是个小小的提示,为来访的客人提供各种信息查询服务。
主要包括:①查看学校的全景图②各个景点的简介③学校主要景点的分布④查看某一景点到其它所有景点的最短路径⑤查询任意两个景点之间的最短路径。
矚慫润厲钐瘗睞枥庑赖。
二、概要设计抽象数据类型的定义:ADT Graph{数据对象 V:V具有相同特性的数组元素的集合,称为顶点集。
数据关系 R:R={VR}VR={<v,w>|v,w∈V且P(v,w),<v,w> 表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义或信息}聞創沟燴鐺險爱氇谴净。
基本操作P:CreateGraph(&G,V,VR);初始条件:V是图的顶点集,VR是图中弧的集合。
操作结果:按V和VR的定义构造图G。
DistroyGraph(&G)初始条件:图G存在操作结果:销毁图GLocateVex(G,u);初始条件:图G存在,u和G中顶点有相同的特征。
操作结果:若存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。
GetVex(G,u);初始条件:图G存在,u是图中的顶点。
操作结果:返回u的值。
InsertVex(&G,v);初始条件:图G存在,v和图中的顶点有相同的特性。
操作结果:在图G中新增顶点v.InsertArc(&G,v,w);初始条件:图G存在,v和w是图中的顶点。
操作结果:在图G中增添弧<v,w>,若是无向图,还增添弧<w,v>。
}ADT Graph主程序流程(各函数之间的调用关系):Main();//主函数Initview();//景点信息的初始化InitLength();//各个景点之间距离的初始化log();//登录时的头部showmenu();//登录后的菜单browser();//全景图的浏览browse_view_info();//景点简介的查询browse_view_distribute();//主要景点的分布onetoall();//某一景点到其它所有景点的最短路径onetoone();//查询任意两个景点之间的最短路径三、详细设计#include<stdio.h>#include<string.h>#include<windows.h>#include<conio.h>#include<malloc.h>#define MAX 50#define TRUE 1#define FALSE 0#define INFINITY 10000typedef int **PathMatrix;typedef int *DistancMatrix;typedef struct view{ int no;//景点编号char name[100];//景点名称char briefinfo[1000];//景点简介}view;typedef struct edge{ //pathlength arcs;//两个景点之间的距离int length; char direction[4];//方向}edge;void showmenu(){printf(" 齐鲁工业大学主要景点列表 \n");printf("\t*********************************************************\n"); 残骛楼諍锩瀨濟溆塹籟。
校园导游咨询程序设计报告
数据结构课程设计设计题目:校园导游咨询学院:信息学院班级:计算机1008班姓名:学号: 20101221180日期: 2012 年 3 月校园导航问题[问题描述]设计一个校园导游程序,为来访的客人提供各种信息查询服务。
[基本要求](1)设计所在学校的校园平面图,所含景点不少于十个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个顶点之间的一条最短的简单路径。
(4)校园导游图的景点和道路的修改扩充功能。
(5)扩充道路信息,如道路类别(车道、人行道),以致可按客人所需分别查询人行路径或车行路径。
(6)扩充每个景点的林洁景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
(7)实现校园导游的仿真界面。
一、概要设计 (4)二、详细设计 (6)三、调试分析 (12)四、调用关系 (12)五、用户操作指南 (13)[测试数据]一、概要设计1. 数据类型#define V_MAX 20#define E_MAX 200typedef struct {char name[10];//名字//char code[10];//代码char info[20];//信息,简介int x,y;//坐标}VType;//顶点类型typedef struct {int live;//标记是否存在,如果被删除则为0,存在为1 char name[10];// 路名int length;//路的长度char ivex[10],jvex[10];//路(边)连接的两个顶点的名字int type;//表示道路类型,0表示两个都是,1表示人行道,2表示行车道}EdgeType;//边类型typedef struct AdjNode{int length;// 弧的长度char name[10];//关联的顶点的名字struct AdjNode *next;//下一条弧}AdjNode;//弧结点typedef struct {int live;//标记是否存在,如果被删除则为0,存在为1int flag;//标记是否被访问过VType data;//顶点的信息AdjNode *first_adj;//指向该顶点的第一条弧}VNode;//景点(顶点)结点typedef struct {VNode vex[V_MAX];//顶点数组EdgeType edge[E_MAX];//边的数组int v_num,e_num;}Graph;//图类型////////////////////////////////Graph G;AdjNode *p;2.基本函数////////////////////////////////void creatGraph(Graph &G);//创建校园图void load(Graph &G);//从文件中读取数据void save(Graph &G);//保存数据入文件int find_v(Graph G,char name[10]);//通过输入景点名字,返回该景点在vex数组里的下标void print_Graph(Graph G);//以邻接矩阵的形式输出图信息int direction(Graph G,char bname[10],char fname[10]);//用于判断并输出一个景点在另外一个景点的方位信息void search_view(Graph G);//查询并输出景点的所有信息void del_v(Graph &G);//删除景点void add_v(Graph &G);//增加景点void add_e(Graph &G)//增加道路void modify_v(Graph &G);//修改景点信息void del_e(Graph &G);//删除道路二、详细设计本程序由m.cpp、head.h、Menu.h、dijie.h4个文件构成。
校园导游咨询实验报告
本实验旨在通过设计并实现一个校园导游咨询系统,提高学生对数据结构在实际问题中的应用能力,培养编程实践能力和问题解决能力。
通过本次实验,学生能够深入了解图论在计算机科学中的应用,学会使用图论算法解决实际问题,并掌握Java编程语言在图形用户界面(GUI)设计中的应用。
二、实验内容1. 问题描述设计一个校园导游咨询系统,为来访客人提供以下服务:- 查询校园内景点的详细信息,包括名称、代号、简介等。
- 查询任意两个景点之间的最短路径。
- 提供从指定景点出发,游览所有景点的推荐路径。
2. 基本要求- 设计校园平面图,包含不少于10个景点。
- 以图中顶点表示校内各景点,存储景点名称、代号、简介等信息。
- 以边表示路径,存储路径长度等相关信息。
- 实现景点信息查询、景点间最短路径查询和推荐游览路径查询功能。
3. 数据结构- 采用邻接矩阵存储校园平面图,表示景点间的路径关系。
- 使用前趋结点数组辅助Floyd算法实现最短路径查询。
4. 算法- 使用Floyd算法计算任意两个景点之间的最短路径。
- 使用DFS算法结合贪心思想计算推荐游览路径。
5. 界面设计- 使用Java Swing实现图形用户界面,方便用户进行操作。
1. 需求分析- 与用户沟通,了解用户对校园导游咨询系统的需求。
- 确定系统功能,包括景点信息查询、景点间最短路径查询和推荐游览路径查询。
2. 系统设计- 设计系统架构,包括数据结构、算法和界面设计。
- 确定数据存储方式和算法实现方法。
3. 编码实现- 使用Java编程语言实现系统功能。
- 实现数据结构、算法和界面设计。
4. 测试与调试- 编写测试用例,验证系统功能。
- 调试系统,修复发现的问题。
四、实验结果1. 景点信息查询- 用户可以输入景点代号,查询景点详细信息,包括名称、代号、简介等。
2. 景点间最短路径查询- 用户可以输入两个景点的代号,查询它们之间的最短路径。
3. 推荐游览路径查询- 用户可以输入起始景点的代号,查询从该景点出发,游览所有景点的推荐路径。
校园导游系统实验报告
竭诚为您提供优质文档/双击可除校园导游系统实验报告篇一:校园导游图系统数据结构实验报告一.设计目的通过布置具有一定难度的实际程序设计项目,使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;使学生掌握分析问题,求解问题的方法并提高学生设计编程实现的能力。
二.设计内容用无向网表示学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
游客通过终端可询问:(1)从某一景点到另一景点的最短路径。
(2)游客从公园进入,选取一条最佳路线。
(3)使游客可以不重复地浏览各景点,最后回到出口(出口就在入口旁边)。
[基本要求](1)将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上的权值表示距离.为此图选择适当的数据结构。
(2)把各种路径都显示给游客,由游客自己选择浏览路线。
(3)画出景点分布图于屏幕上。
[实现提示] (1)构造一个无向图g并用邻接矩阵来存储。
(2)利用迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径用二维数组p[i][]来记录,最短路径长度就用一维数组d[i]存放;i的范围:0~20。
(3)一维数组have[]是用来记录最短路径出现顶点的顺序。
(4)根据起点和终点输出最短路径和路径长度。
三.概要设计1.功能模块图;2.各个模块详细的功能描述。
1.浏览校园全景:采用深度遍历遍历图进行所有景点浏览,将遍历景点信息输出2.查看所有游览路线:用户输入一个景点,采用迪杰斯特拉算法将从该景点起所有路径查出并输出在屏幕上3.选择出发点和目的地:用户输入一个出发点和一个目的地编号,采用弗洛伊德算法求出发点到目的地的最短路径4.查看景点信息:直接用编号进行单个景点查询。
四.详细设计重点设计及编码在求最短路径时采用迪杰斯特拉算法//迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点voidshortestpath_DIJ(mgraph*g) {//迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]//若p[v][w]为1,则w是从v0到v的最短路经上的顶点//final[v]类型用于设置访问标志intv,w,i,min,final[20],D[20],p[20][20],t=0,x,flag=1 ,v0;//vo为起始景点的编号while(flag){printf("请输入一个起始景点编号:");scanf("%d",if(v0g->vexnum){printf("景点编号不存在!请重新输入景点编号:");scanf("%d",}if(v0>=0}for(v=0;vvexnum;v++){fin al[v]=0;//初始化各顶点访问标志D[v]=g->arcs[v0][v].adj;//v0到各顶点v的权值赋值给d[v]for(w=0;wvexnum;w++)//初始化p[][]数组,各顶点间的路径全部设置为空路径0p[v][w]=0;if(D[v]final[v0]=1;//v0的访问标志设为1,v属于s集for(i=1;ivexnum;i++)//对其余g.vexnum-1个顶点w,依次求v到w的最短路径{min=InFInITY;for(w=0;wvexnum;w++)//在未被访问的顶点中,查找与v0最近的顶点vif(!final[w])if(D[w]vexnum;w++)//修改v0到其余各顶点w的最短路径权值d[w]if(!final[w]//修改v0到w的权值d[w]for(x=0;xvexnum;x++)//所有v0到v的最短路径上的顶点x,都是v0到w的最短路径上的顶点p[w][x]=p[v][x];p[w][w]=1;}}for(v=0;vvexnum;v++)//输出v0到其它顶点v的最短路径{if(v0!=v)printf("%s",g->vexs[v0].name);//输出景点v0的景点名for(w=0;wvexnum;w++)//对图中每个顶点w,试探w是否是v0到v的最短路径上的顶点{if(p[v][w]t++;}if(t>g->vexnum-1}}五.测试数据及运行结果1.正常测试数据和运行结果1.浏览校园全部景点信息:2.查看景点信息:3.输出两个景点间的最短路径:2.异常测试数据及运行结果1.当输出错误编号时程序没有反映,继续输入直到输入正确:2.当查询两景点编号相同时的最短路径时,结果如下:篇二:校园导游实验报告[1]校园导游实验报告学号:20XX30457018姓名:熊博班级:09计科1班完成日期:20XX-12-211、问题描述制作陶瓷学院的校园导游图,游客通过终端可询问:(1)从某一景点到另一景点的最短路径。
数据结构校园导游咨询系统课程设计报告及课程总结.doc
姓名:班级:学号:指导教师:2012年12月目录1、需求分析 (1)1.1 系统简介 (1)1.2 系统功能模块介绍 (1)2、概要设计 (1)2.1 系统功能结构图 (1)2.2 系统流程图 (2)2.3 主要函数概要设计 (3)2.3.1 主函数概要设计 (3)2.3.2 初始化图函数InitGraph() (3)2.3.4 查询景点信息函数设计SearchGraph() (4)2.3.5 显示图中信息函数设计ShowGraph() (4)2.3.6 弗洛伊德算法函数设计Floyd() (4)3、详细设计 (4)3.1 主函数详细设计 (4)3.2初始化图函数详细设计InitGraph() (5)3.3查询景点信息函数详细设计SearchGraph() (6)3.4 弗洛伊德算法函数详细设计Floyd() (7)4、调试分析 (8)4.1 显示主界面函数测试 (8)4.2 查找两景点间最短路径测试 (9)4.3 查看景点信息测试 (10)5.课程设计总结 (11)6、附录 (12)1、需求分析1.1 系统简介随着现代社会生活节奏的加快,人们外出旅行以寻求放松的时间越来越多。
考虑到游客不可能对所有景点都有所了解,因此可能无法找到游玩景点最省时,最高效的路径,而人工导游成本又过高,故使用C语言,基于《数据结构》中图的相关算法开发了“江西农业大学校园咨询系统”。
开发本系统目的在于为来访我校的游客提供一条最短游览路径,本系统从实际出发,通过对校园平面图的分析,将其转化为数据并保存在系统中,因此系统提供的路径具有较大的可信性。
本系统界面友好,提示信息充分,在实际使用过程中运行良好。
1.2 系统功能模块介绍本系统主要分为以下三大功能模块:1、查询两景点最短路径:用户在选择此功能模块后,按照屏幕上方提示的景点名称及其对应的编号,要求用户输入起点和终点的编号,系统将在已存储的景点中进行匹配,若未找到所需查询的景点编号,系统将提示错误并要求用户再次输入。
校园导游咨询(最短路径)
typedef struct
{
infotype vexs[MAX_VERTEX_NUM]; //顶点的数据域
AdjMatrix arcs; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
(2)各个函数的声明如下:
void cmd(void);
数据结构课程设计
实验报告
学号:
姓名:
提交日期:
成绩:
东北大学秦皇岛分校
设计题目:校园导游咨询
一、实验目的
(1)熟练掌握图的创建及遍历基本操作算法。
(2)熟练掌握最短路径算法。
(3)利用图的遍历和最短路径求解技术,设计一个校园导游程序,为来访的客人提供各种信息查询服务。
二、需求分析
实验内容
【问题描述】
MGraph InitGraph(void); //初始化图
void Menu(void); //整体菜单
void Browser(MGraph *G); //遍历校园全景
void ShortestPath_DIJ(MGraph * G); //景点所有路线
void Floyd(MGraph *G); //两景点之间最短距离
while(flag)
{
printf("请输入一个起始景点编号:");
scanf("%d",&v0); //输入一个值赋给v0
if(v0<0||v0>G->vexnum)
{
printf("景点编号不存在!请重新输入景点编号:");
scanf("%d",&v0);
《校园导游咨询》实验设计报告
设计题目:___校园导游咨询__一、需求分析及规格说明1、要求:用无向网表示学校的校园景点平面图,所含景点不少于十个。
图中顶点表示主要景点,存放景点的代码和名称等信息,图中的边表示景点间的道路,存放路径长度等信息。
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
a)简易菜单管理,界面友好。
b)对城市信息(城市名、城市间的里程)进行录入和编辑(可选);c)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径,给出相应的距离。
d)对于任意两个景点之间的一条最短的简单路径,给出所经过景点的信息和距离。
对景点采用相应的字符选择。
2、功能:修改及查询校园各景点的信息3、测试数据:a)请输入出发景点:A 鲁迅像请输入到达景点:F 图书馆b)请输入出发景点:B 音乐楼请输入到达景点:H 体育馆二、概要设计1、数据存储结构:一个结构体数组存放各景点名及其编号;一个二维数组存放两景点间的距离;一个栈结构,存储最短路径所经过的各个点;以及多个辅助数组;2、算法思想:1)使用菜单页,选择不同的功能(修改距离、求最短路径、退出等),进行相应的操作;2)采用邻接矩阵作为数据的存储结构,打表,确定位置,修改距离值;3)利用Dijkstra算法,求两地间的距离,并输出其路径;4)主程序有简易菜单,选择功能模块执行,在程序运行过程中可以反复操作。
3、子函数:void init() //初始化各景点的名称、编号及两地已知距离等信息void list(int pos) //以表格的形式打印邻接矩阵string chto_string(char a) //将景点的编号转换为名称,返回void alter(int x,int y,int dist) //修改相应位置上的距离信息void Dijkstra(int s,int t) //求两点间的最短距离void output(int s,int t) //输出最短距离的路径bool menu(int step) //根据不同的操作序号,实现各自的功能4、主函数:int main(){//初始化景点的各个信息;//显示菜单页,提供修改信息、查最短路径的功能//根据键入的信息,进行相应的操作}三、详细设计1、数据类型:全局变量:int mat[10][10](两点距离) ,p[10](路径前去节点) ,dst[10](到起点的距离);const int MAX=INT_MAX/2(最大值); bool visited[10](结点是否访问过);stack<int> path(存放最短距离的路径);struct liocation // 存放景点的名称及编号信息{ char syb;string name;}school[10];2、基本操作:void init() //初始化各景点的名称、编号及两地已知距离等信息school[],mat[][];void list(int pos) //根据不同的pos,打印对应的表头,及其距离信息,表格的形式;若不连通则不输出string chto_string(char a) //根据给出的编号,搜索其对应的景点名称void alter(int x,int y,int dist) //修改相应位置上的距离信息,mat[x][y]=distvoid Dijkstra(int s,int t) //求两点间的最短距离{//初始化各个景点到起点的距离dst[]=mat[][],到起点的起始距离;//置起点的visited[]为true,即访问过;//循环进行9次以下操作:调整当前点与起点的距离,并记录其前驱点p[];}void output(int s,int t) //输出路径{//将记录下的路径p[],按顺序导入在栈中;(将其逆序)//逐个弹出栈中的元素,输出对应的路径信息,包括起点、中间点、距离;//输出全程最短行程的距离}bool menu(int step) // 菜单内容{//如果输入的操作序号有误,则提示,返回主菜单;//清屏;if(1修改功能){//打印表格,及对应的提示语句;//读取两个景点序号及两地的新距离;//覆盖原来的距离;//不再修改,则返回主菜单;//return true;}else if(求最短路径功能){//打印表格,及对应的提示语句;//读取正确的起点、终点编号,若不正确则提示,返回重新输入;//调用chto_string(char a),在编号旁,显示其对应的景点名称;//调用void Dijkstra(int s,int t),求最短路径;//调用void output(int s,int t) 输出对应的路径信息;//return true;}if(退出) return false;}int main(){//调用init(),初始化;//显示主菜单内容;//读取操作序号;//调用bool menu(int step),进行相应的功能;//if(menu的结果为false)则退出程序,否则重复进行;}四、调试分析1、打印表格的时候,输出有部分出现乱码。
校园导游系统程序--课程设计-报告
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设置开关语句。
课程设计校园导游程序
课程设计 校园导游程序一、课程目标知识目标:1. 学生能理解校园导游程序的基本概念和原理,掌握程序设计的基本步骤。
2. 学生能运用所学知识,结合校园实际情况,设计出功能完善、操作简便的校园导游程序。
技能目标:1. 学生能运用编程软件,编写并调试校园导游程序,具备基本的程序调试能力。
2. 学生能通过小组合作,提高沟通与协作能力,共同完成校园导游程序的编写。
情感态度价值观目标:1. 学生能对程序设计产生兴趣,培养主动学习和探究的精神。
2. 学生在校园导游程序的设计过程中,能关注用户体验,培养良好的服务意识。
3. 学生通过解决实际校园问题,增强自信心,培养勇于克服困难的品质。
课程性质:本课程为信息技术学科,结合校园实际情况,以提高学生编程兴趣和实际操作能力为主。
学生特点:六年级学生对计算机操作已有一定基础,具备基本的编程知识,好奇心强,喜欢探索新事物。
教学要求:教师需关注学生个体差异,鼓励学生动手实践,注重培养学生的团队合作意识和解决问题的能力。
在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. 校园导游程序基本概念:介绍程序设计的基本原理,引导学生了解校园导游程序的功能和作用。
- 教材章节:第二章第二节“程序设计的基本原理”2. 编程语言基础:回顾并巩固Python编程语言的基本语法和结构。
- 教材章节:第一章“Python编程基础”3. 界面设计:学习设计简洁、直观的图形用户界面,提高用户体验。
- 教材章节:第三章第一节“图形用户界面设计”4. 数据处理:运用列表、字典等数据结构,实现校园景点信息的存储与展示。
- 教材章节:第四章“数据结构与数据处理”5. 程序调试与优化:学习使用调试工具,找出并修复程序中的错误,提高程序质量。
- 教材章节:第六章第三节“程序调试与优化”6. 小组合作与项目实践:分组进行校园导游程序的设计与实现,提高团队协作能力。
- 教材章节:第五章“项目实践与团队协作”教学进度安排:1. 第1-2周:学习校园导游程序基本概念,回顾Python编程基础。
毕业设计 课程设计 校园导游系统设计报告
int a;
printf("您想查询哪个景点的详细信息?请输入景点编号:");
scanf("%d",&a);
getchar();
printf("\n");
switch(a)
{
case 1:
printf("1:学校南门\n\n学校的正门,巴洛克风格建筑,大气优雅,气势宏伟。\n\n");break;
shortest[i][j]=shortest[i][k]+shortest[k][j];
path[i][j]=k;
path[j][i]=k;
}
}/*floyed*/
void display(int i,int j)
{/*打印两个景点的路径及最短距离*/
int a,b;
a=i;
b=j;
printf("您要查询的两景点间最短路径是:\n\n");
else
printf("输入错误!不存在此路!\n\n");
printf("\n");
}/*display*/
八.调试结果
九.心得体会
通过使用C++语言设计程序代码,我们更能体会到C++语言较C语言在编程设计程序代码方面的优越性。
在编制过程中,我们将实际选取的景点抽象成一个带权的无向平面图并且使用了结构体类型,宏定义,全局变量,自定义函数及switch语句等内容。
printf("6:喷泉广场");
printf("7:行政楼");
printf("8:学生公寓");
校园导游咨询管理系统软件设计报告书
课程设计题目校园导游咨询管理系统软件设计学院计算机科学与技术学院专业计算机科学与技术班级计算机0804班姓名王成鹏指导教师杜薇2012 年 1 月9 日课程设计任务书学生姓名:王成鹏专业班级:计算机0804指导教师:杜薇工作单位:计算机学院题目:校园导游咨询管理系统软件设计初始条件:1.预备内容:数据结构(图),软件工程,面向对象程序设计,数据库技术,编译原理,可视化编程2.实践准备:掌握一种计算机高级语言等相关的使用。
要求完成的主要任务:基本功能要求:(1)设计你所在学校的校园平面图,所含景点不少于10个。
将校内各景点的数据(景点名称、代号、简介等信息)和图片以图结构表示并保存于数据库。
(2)为来访客人提供任意景点相关信息的查询。
(3)为来访客人提供任意景点的问路查询。
(4)测试数据:自定。
(5)涉及技术工具:软件工程技术、数据库技术、UML工具、Java语言或C#语言等设计报告内容应说明:1.课程设计目的与功能;2.需求分析,数据结构或模块说明(功能与框图);3.源程序的主要部分;4.运行结果与运行情况分析;5.自我评价与总结时间安排:本学期第17-19周:1.查阅、消化资料,系统调查2天2.系统分析(采用UML工具) 3天3.总体设计,实施计划(采用UML工具) 3天?4.系统开发与实现(用指定语言工具) 5天5.撰写报告2天指导教师签名:2011年12月25日系主任(或责任教师)签名:年月日校园导游咨询管理系统1.课程设计目的与功能1)设计目的:为游客设计一个校园导游咨询管理系统软件,帮助游客很好地了解校园景点位置,为观光带来方便。
作为导游就是指示景点之间的距离和方向,让游客很清楚所处的位置,并且能够很快地找到方向与目的地。
软件是为了简单、易用而设计的。
2)基本功能要求:1.设计你所在学校的校园平面图,所含景点不少于10个。
将校内各景点的数据(景点名称、代号、简介等信息)和图片以图结构表示并保存于数据库。
校园导游咨询
不过也通过这次课程设计,让我明白现实生活跟程序之间联系,同时也让我明白了数据结构这门课程的重要性,我以后会继续努力学习这门课程。
(1)建立模型(逻辑结构)
(2)建立模块之间的关系(存储结构)
(3)算法
四、源程序清单
五、测试结果
六、课程设计总结及心得体会
实验题目:校园导游咨询
一、课程目的
为用户提供路径咨询和景点查询,根据用户指定的始点和终点输出相应路径或者根据用户指定的景点输出景点的信息。
二、基本要求
(1)设计校园平面图,在校园景点选10个左右景点。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。
printf(" 8:篮球场\n");
printf(" 9:足球场\n");
printf(" 10:食堂\n");
printf("请选择服务:");
scanf("\n%c",&k);
switch(k)
{
case 'i':
printf("进入景点信息查询:");
introduce();
break;
case 's':
scanf("%d",&a);
printf("\n");
switch(a)
{
case 1:
printf("1:学校大门\n\n学校的正门,气势宏伟。\n\n");break;
校园导游咨询程序
实验三:校园导游咨询一、设计方案简介设计一个校园导游程序,为来访的客人提供各种信息查询服务。
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.功能函数的调用关系图2.各功能函数的数据流程图全局变量Graph G;int path[NUM][NUM];int D[NUM];3.重点设计及编码重点设计:求最短路径编码:void Shortpath(int num)//迪杰斯特拉算法最短路径{int v,w,i,t;//i、w和v为计数变量//t表示景点个数int final[NUM]; //标志数组、用来存放顶点的信息int min;//记录权值、最终输出路径for(v=0;v<NUM;v++){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;}}}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控制输出时的换行path[a][b]=0;d=b; //将b作为出发点进行下一次循环输出,如此反复if(q%14==0) printf("\n");goto gate;}}}printf("\n\n\t\t\t\t\t\t最短距离为%dm.\n\n\t",D[a]);}}五.测试数据及运行结果系统主界面学校平面图学校景点图最短路径信息查询异常信息三、设计评述:设计者对本设计的评述及通过设计的收获体会1.改进方案系统还有部分漏洞未能修复、不够绝对的稳定、还需改进!求最短路径时可以采用比较简单的哈密尔顿算法。
课程设计校园导游咨询
课程设计校园导游咨询一、教学目标本课程旨在让学生了解和掌握校园导游的基本知识,包括校园的历史、文化、建筑、景观等方面的内容。
通过本课程的学习,使学生能够熟练运用所学的知识,为游客提供专业的校园导游服务。
具体目标如下:1.知识目标:学生能够掌握校园的基本历史、文化、建筑和景观知识,了解校园的发展历程和特色。
2.技能目标:学生能够运用所学的知识,进行校园导游的讲解和服务,具备良好的沟通和应变能力。
3.情感态度价值观目标:学生能够培养对校园文化的认同感,增强爱护校园环境的责任心,提高服务他人的意识。
二、教学内容本课程的教学内容主要包括以下几个方面:1.校园历史:介绍校园的创建背景、发展历程和重要事件。
2.校园文化:阐述校园的文化传统、校训、校风等核心价值观。
3.校园建筑:解析校园主要建筑的风格、特点和背后的故事。
4.校园景观:介绍校园内的风景名胜、历史遗迹和生态景观。
5.导游技巧:教授导游的基本礼仪、沟通技巧、应急处理等实际操作能力。
三、教学方法为了提高教学效果,本课程将采用多种教学方法相结合的方式进行:1.讲授法:教师讲解校园历史、文化、建筑和景观等方面的知识。
2.讨论法:学生分组讨论校园导游的实际案例,分享心得体会。
3.案例分析法:分析校园导游的成功案例和存在的问题,提高学生的判断和分析能力。
4.实验法:学生进行校园导游的实践活动,锻炼学生的实际操作能力。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选用权威、实用的校园导游教材,为学生提供系统的理论知识。
2.参考书:提供相关的历史、文化、建筑等领域的参考书籍,丰富学生的知识储备。
3.多媒体资料:制作精美的课件、视频等多媒体资料,增强课堂教学的趣味性和生动性。
4.实验设备:配备必要的实验设备,如地图、模型等,帮助学生更好地理解校园景观。
5.实践活动:学生进行校园导游的实际操作,提高学生的实践能力。
五、教学评估为了全面、客观地评估学生的学习成果,本课程将采用多种评估方式相结合的方法:1.平时表现:评估学生在课堂上的参与度、发言积极性以及团队合作表现等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计设计题目:校园导游咨询学院:信息学院班级:计算机1008班姓名:学号: 20101221180 日期: 2012 年 3 月校园导航问题[问题描述]设计一个校园导游程序,为来访的客人提供各种信息查询服务。
[基本要求](1)设计所在学校的校园平面图,所含景点不少于十个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个顶点之间的一条最短的简单路径。
(4)校园导游图的景点和道路的修改扩充功能。
(5)扩充道路信息,如道路类别(车道、人行道),以致可按客人所需分别查询人行路径或车行路径。
(6)扩充每个景点的林洁景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
(7)实现校园导游的仿真界面。
一、概要设计 (4)二、详细设计 (6)三、调试分析 (12)四、调用关系 (12)五、用户操作指南 (13)[测试数据]一、概要设计1. 数据类型#define V_MAX 20#define E_MAX 200typedef struct {char name[10];//名字//char code[10];//代码char info[20];//信息,简介int x,y;//坐标}VType;//顶点类型typedef struct {int live;//标记是否存在,如果被删除则为0,存在为1char name[10];// 路名int length;//路的长度char ivex[10],jvex[10];//路(边)连接的两个顶点的名字int type;//表示道路类型,0表示两个都是,1表示人行道,2表示行车道}EdgeType;//边类型typedef struct AdjNode{int length;// 弧的长度char name[10];//关联的顶点的名字struct AdjNode *next;//下一条弧}AdjNode;//弧结点typedef struct {int live;//标记是否存在,如果被删除则为0,存在为1int flag;//标记是否被访问过VType data;//顶点的信息AdjNode *first_adj;//指向该顶点的第一条弧}VNode;//景点(顶点)结点typedef struct {VNode vex[V_MAX];//顶点数组EdgeType edge[E_MAX];//边的数组int v_num,e_num;}Graph;//图类型////////////////////////////////Graph G;AdjNode *p;2.基本函数////////////////////////////////void creatGraph(Graph &G);//创建校园图void load(Graph &G);//从文件中读取数据void save(Graph &G);//保存数据入文件int find_v(Graph G,char name[10]);//通过输入景点名字,返回该景点在vex数组里的下标void print_Graph(Graph G);//以邻接矩阵的形式输出图信息int direction(Graph G,char bname[10],char fname[10]);//用于判断并输出一个景点在另外一个景点的方位信息void search_view(Graph G);//查询并输出景点的所有信息void del_v(Graph &G);//删除景点void add_v(Graph &G);//增加景点void add_e(Graph &G)//增加道路void modify_v(Graph &G);//修改景点信息void del_e(Graph &G);//删除道路二、详细设计本程序由m.cpp、head.h、Menu.h、dijie.h4个文件构成。
1、m.cpp主要用于调用菜单函数#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#include "head.h"#include "dijie.h"#include "allpath.h"#include "Menu.h"void main(){load(G);// while(1)menu();}2.Menu.h存放用于显示系统仿真界面的函数void mobifyMenu(){while(1){system("cls");int choose;printf("------------------------------------------");printf("\n");printf(" 校园导游系统 ");printf("\n");printf("------------------------------------------");printf("\n");printf(" 景点或者道路信息的修改扩充 ");printf("\n");printf("\n");printf("------------------------------------------");printf("\n");printf("1. 增加新景点\n");printf("2. 删除景点\n");printf("3. 修改景点\n");printf("4. 增加新道路\n");printf("5. 重新构建校园景点和路径信息\n");printf("0. 返回上一个菜单\n");printf("请输入操作代码:");scanf("%d",&choose);getchar();system("cls");switch(choose){case 1:{add_v(G);break;}case 2:{del_v(G);break;}case 3:{modify_v(G);break;}case 4:{add_e(G);break;}case 5:{creatGraph(G);break;}case 0:return;}}}void menu(){int choose;printf("------------------------------------------");printf("\n");printf(" 校园导游系统 ");printf("\n");printf("------------------------------------------");printf("\n");printf(" 景点预览 ");printf("\n");for(int i=0;i<G.v_num;i++){printf(" %s ",G.vex[i]);if((i+1)%2==0) printf("\n");}printf("\n");// print_Graph(G);printf("------------------------------------------");printf("\n");printf("1. 景点或者道路信息的修改扩充\n");printf("2. 查询景点信息\n");printf("3. 查询最佳观光路径\n");printf("0. 退出系统\n");printf("请输入操作代码:");scanf("%d",&choose);getchar();system("cls");switch(choose){case 1:{mobifyMenu();break;}case 2:{search_view(G);getchar();break;}case 3:{FDijkstra(G);getchar();break;}case 0:{exit(0);break;}}system("cls");}3.head.h本文件用于存放基本操作函数,在此不做详细介绍4.dijie.h本文件用于查询并输出两个景点间的最佳路径并输出const int maxnum = 20;const int maxint = 10000;int c[maxnum][maxnum];//图的邻接矩阵int P[ maxnum][ maxnum];//标明最短路径经过哪个点bool final[maxnum];//标明从原点到某个点的最短路径已经找到int D[maxnum];//记录最短路径的长度int path[maxnum],jishu=0;//path用于按顺序存放已找到最短路径的顶点,path[1]为第二个已经找到的//需要注意的是,如果图中有9个顶点,其中有两个无法到达,则path的最后面3个就是重复的//要注意区分开// 用迪杰斯特拉算法找出最短路径void DIJ(Graph G,int v0,int P[ maxnum][ maxnum],int D[maxnum]){jishu=0;int min;for(int v=0;v<G.v_num;v++){final[v]=false; D[v]=c[v0][v];for(int w=0;w<G.v_num;++w) P[v][w]=0;if(D[v]<maxint) {P[v][v0]=1;P[v][v]=1;}}D[v0]=0;final[v0]=true;path[jishu]=v0;jishu++;for(int i=1;i<G.v_num;++i){min=maxint;for(int w=0;w<G.v_num;++w)if(!final[w])if (D[w]<min) {v=w;min=D[w];}final[v]=true;path[jishu]=v;jishu++;for(w=0;w<G.v_num;++w)if(!final[w]&&(min+c[v][w]<D[w])){D[w]=min+c[v][w];// P[w]=P[v];for(int j=0;j<G.v_num;j++)P[w][j]=P[v][j];P[w][w]=1;}}//纠正jishufor(jishu=1,i=1;i<G.v_num;i++)if(path[i]==path[i-1]) break;else jishu++;}// 输出最短路径void print_path(Graph G,int b_v,int f_v){if(D[f_v]>1000) {printf("没有能够到达的路径\n");return ;}int shortPath[V_MAX],count=0;//count指最短路径里到底有几个点// shortPath里面是正确连续的最短路径//若果shortPath={0,4,3,5},则最短路径为0->4->3->5shortPath[0]=b_v;for(int i=1;i<jishu;i++){if(P[f_v][path[i]]==1) // 问题出在path[i]上,由于有两个景点是无法到达的// 所以path[i]后面三个元素都是重复的,导致count数多了2个{count++;shortPath[count]=path[i];//puts(G.vex[path[i]]);}}// 通过shortPath输出路线信息int road[V_MAX];//road[0]记录的是从shortPath[0]到shortPath[1]要走的路for(i=0;i<count;i++) //i指向两个邻接点的起点,i+1表示终点for(int j=0;j<G.e_num;j++) //找连接这两个顶点的边,j指向边{if(strcmp(G.edge[j].ivex,G.vex[shortPath[i]])==0&&strcmp(G.edge[j].jv ex,G.vex[shortPath[i+1]])==0){ road[i]=j;break; }if(strcmp(G.edge[j].jvex,G.vex[shortPath[i]])==0&&strcmp(G.edge[j].iv ex,G.vex[shortPath[i+1]])==0){ road[i]=j;break; }}printf("从 ");for(i=0;i<count;i++){printf("%s\n",G.vex[shortPath[i]]);printf("往");direction(G,G.vex[shortPath[i]],G.vex[shortPath[i+1]]);printf(" 沿着%s路走%d 米到\n",G.edge[road[i]].name,G.edge[road[i]].length);}puts(G.vex[f_v]);}// 查询两个景点间最短路径函数void FDijkstra(Graph G){int vi,vj;char begin_p[10],final_p[10];int b_v,f_v;for(int g=0;g<G.v_num;g++)for(int h=0;h<G.v_num;h++)c[g][h]=maxint;for(int h=0;h<V_MAX;h++)for(g=0;g<V_MAX;g++)P[g][h]=0;for( h=0;h<V_MAX;h++)final[h]=false;for(h=0;h<V_MAX;h++)D[h]=10000;for(h=0;h<V_MAX;h++)path[h]=0;jishu=0;int t;printf("选择道路类型(人行道1/行车道2/两者都行0):"); scanf("%d",&t);getchar();// 构建邻接矩阵for(int i=0;i<G.e_num;i++){if(G.edge[i].type==t||G.edge[i].type==0){vi=find_v(G,G.edge[i].ivex);vj=find_v(G,G.edge[i].jvex);c[vi][vj]=G.edge[i].length;c[vj][vi]=G.edge[i].length;}}printf("请输入起点:");while(1){gets(begin_p);if(find_v(G,begin_p)==100){printf("不存在该景点,请重新输入:");continue;}break;}b_v=find_v(G,begin_p);printf("请输入终点:");while(1){gets(final_p);if(find_v(G,final_p)==100){printf("不存在该景点,请重新输入:");continue;}break;}f_v=find_v(G,final_p);DIJ(G,b_v,P,D);print_path(G,b_v,f_v);}三、调试分析数据结构书中的迪杰斯特拉算法只能求出最短路径中有哪个景点,但无法求出这几个景点的经过顺序,所以先利用迪杰斯特拉算法记录下某个顶点求出到最短路径的顺序,然后再比对哪几个景点是最短路径里所经过的得出最短路径及景点路过的顺序。