数据结构课程设计实验报告《校园导游咨询系统》内含程
校园导游咨询系统课程设计报告
![校园导游咨询系统课程设计报告](https://img.taocdn.com/s3/m/84f54ea5d4d8d15abf234e19.png)
目录一、需求分析 (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 学校八九十食堂都在这,不错蛮好吃的。
数据结构课程设计报告(校园导游系统)附有源代码
![数据结构课程设计报告(校园导游系统)附有源代码](https://img.taocdn.com/s3/m/17dde8b2524de518964b7d5d.png)
课程论文(设计)2011-2012学年第2学期课程名称:数据结构课程设计课程性质:实践课专业班级:考核方式:考查学生姓名:学号:学时:1周教师姓名:目录1. 作业内容 (1)2. 基本思路 (1)2.1 本校10个景点 (1)2.2 图的初始化 (2)2.3 图的遍历 (2)2.4 求最短路径 (3)3.系统流程 (4)3.1 系统的简单说明 (4)3.2 系统流程图 (5)4. 系统运行效果图 (5)4.1 校园导游界面 (5)4.2 华农校园地图 (6)4.3 景点的相关信息查询 (6)4.4 任意两个景点间的最短路径 (7)4.5 退出校园导游系统 (8)5.总结 (9)6.参考文献 (10)1. 作业内容设计一个校园导游程序,为来访客人提供各种信息查询任务。
基本要求:(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介信息,以边表示路权,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
2. 基本思路要完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。
有以下设计思路:(1).结合本校的实际情况,选出10个景点;(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);(3).根据选出来的10个景点用邻接矩阵存储校园图。
(4).依照景点的相关信息创建校园图。
(5).把纸质上的内容,利用C++编程语言编写查找景点相关信息的程序。
(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。
(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。
为此,可把系统分为以下几个核心:图的初始化、图的遍历、求最佳路线。
数据结构试验报告校园导游
![数据结构试验报告校园导游](https://img.taocdn.com/s3/m/c752144a302b3169a45177232f60ddccda38e6c8.png)
数据结构试验报告校园导游《数据结构》课程设计报告课程名称:《数据结构课程设计》;课程设计题⽬:校园导游查询;姓名:张晓艺;院系:计算机学院;专业:数字媒体技术;年级:⼤⼆;学号:10054220;指导教师:王⽴波;2011年12⽉17⽇1 课程设计的⽬的 (x)2 需求分析 (x)3 课程设计报告内容 (x)1、概要设计 (x)2、详细设计 (x)3、调试分析 (x)4、⽤户⼿册 (x)5、测试结果 (x)6、程序清单 (x)4 ⼩结 (x)5 参考⽂献 (x)1.课程设计的⽬的:(1)熟练运⽤C++编写程序;(2)会⽤Floyd算法查找最短路径;2.需求分析:1.题⽬:【校园导游咨询】[问题描述](1)设计你的学校的校园平⾯图,所含景点不少于10个。
以图中顶点表⽰学校各景点,存放景点名称、代号、简介等信息;以边表⽰路径,存放路径长度等相关信息。
(2)为来访客⼈提供图中任意景点的问路查询,即查询任意两个景点之间的⼀条最短的简单路径。
(3)为来访客⼈提供图中任意景点相关信息的查询。
[测试数据]由读者根据实际情况指定。
2.任务:通过此程序可实现以下功能:(1)⽤⼀维数组存放景点信息,⼆维数组存放景点间的距离,最短距离,最短路径;(2)Floyd算法计算最短距离和路径;(3)根据景点序号查询景点的⼀系列信息,及两景点间的最短路径和最短距离。
3.测试数据:查询类型:I(表⽰查询景点信息);景点编号:3;查询类型:D(表⽰查询景点间的最短路径和最短距离);景点编号:1 9;3. 课程设计报告内容:1. 概要设计:(1)⾸先我画了学校主要⼏个景点的分布图以及⾃⼰定的⼀些距离,图如下:(2)接着我定义了⼀个顶点结构体,定义如下:struct Date{int num; //景点编号char name[50]; //景点名称char introduce[100]; //景点介绍};(3)然后我定义了⼀个类,定义如下:class Travel{private:Date date[15];int distance[15][15];int Path[15][15];int ShortestDistance[15][15];void Floyd();public:Travel();~Travel(){}void Introduce(int);void Scanf();void ShortDistance(int,int);};(4)基本操作:void Floyd(); //Floyd算法,计算最短路径和最短距离Travel(); //构造函数~Travel(){} //析构函数void Introduce(int); //介绍景点函数void Scanf(); //外部输⼊函数void ShortDistance(int,int); //最短距离计算函数本程序分为2个模块:Int main(){初始化;Void Scanf();}函数调⽤关系基本结构图如下所⽰:2. 详细设计:(1)主函数初始化变量;(2)调⽤外部接⼝函数Scanf();(3)输⼊查询类型,如果为“I”,调⽤景点介绍函数,如果为“D”,调⽤最短距离和路径函数。
校园导游系统数据结构实习报告
![校园导游系统数据结构实习报告](https://img.taocdn.com/s3/m/a265ce589a6648d7c1c708a1284ac850ad0204a0.png)
校园导游系统数据结构实习报告校园导游系统数据结构实习报告一、引言随着信息技术的快速发展,数字化校园已成为许多学校的重要建设目标。
其中,校园导游系统作为数字化校园的一部分,对于提高校园文化氛围,方便新生和游客游览校园,增强校园归属感起到了重要作用。
在这次实习中,我们的主要任务是设计和实现一个校园导游系统,采用数据结构技术对校园地图进行建模和优化,以提供高效、便捷的导游服务。
二、系统设计1、数据结构选择:考虑到校园地图的复杂性,我们采用了图(Graph)作为基础数据结构。
图是由节点(顶点)和边组成的集合,可以很好地表示校园中各个地点之间的连接关系。
2、地图表示:我们将校园地图转化为图,其中每个地点对应一个节点,地点之间的路径对应边。
为了更准确地表示实际环境,我们使用了带权重的边,权重表示路径的长度或美观度。
3、导游路径规划:我们使用了最短路径算法,如Dijkstra算法和A*算法,来规划最佳游览路径。
用户可以在系统中设定起点和终点,系统会根据图中的边和权重计算出最短路径。
4、语音导航:系统可以通过用户的手机实时获取位置信息,并使用TTS(Text-to-Speech)技术将规划的路径转化为语音提示,方便用户边听边走。
5、数据库设计:我们设计了一个关系型数据库,用于存储校园地图信息、用户信息等。
通过使用索引和查询优化技术,提高了系统性能。
三、系统实现1、环境配置:我们使用了Python语言和相关的数据结构库来实现系统。
开发环境为Windows 10操作系统,数据库采用了MySQL。
2、代码实现:我们对Python语言和相关库进行了深入学习,掌握了图算法的实现方法。
在实现过程中,我们遇到了一些问题,如最短路径算法的优化、语音导航的实时性等。
通过查阅资料、讨论和实践,我们成功解决了这些问题。
3、测试与调试:我们对系统进行了全面的测试,包括单元测试、集成测试和系统测试。
在测试过程中,我们发现并修复了一些bug,提高了系统的稳定性和可靠性。
西安邮电大学-(数据结构)校园导游系统课程教学设计报告
![西安邮电大学-(数据结构)校园导游系统课程教学设计报告](https://img.taocdn.com/s3/m/e41d987c284ac850ac0242b2.png)
西安郵電大學数据结构课程设计报告书崔斌专业名称 计算机科学与技术专业计科1106系部名称计算机学院 学生姓名04111185指导教师2012年12月15日 至 间2012年12月21日实验题目:校园导游系统一、实验目的① :为了让非本校的同学们,家长们能够充分了解本校 ---西安邮电大学。
② :实践数据结构所学知识。
二、实验内容学校简易的俯视图。
各个景点的简单介绍。
任意两景点之间的所有路径。
任意两景点之间的最少中转景点路径。
任意两景点之间的带权路径长度。
三、需求分析①: ②: ③: ④: ⑤:Init();初始化两个顺序栈Menu();进行选择的模块函数;Intro();景点介绍函数;SearchO;判断是否有此编号的景点;Fin dall path();找路径函数;Fin dallway();找任意两个景点之间的所有路径;(存在栈里面) ShortestwayO;任意两个景点之间中转次数最少的路径;(从栈里面读取出来) NicewayO;任意两个景点之间总权值最小的路径;(从栈里面读取出来) Calculate();(从栈里面读取出来相关数据),进行分析运算;Byebye();你懂得!四、概要设计1、方案设计对系统进行分析,给出景区图+++++++++++牛++++++++¥++++占-I-ILnJ一戸IJ]一(一恃//思想;递归结合循环,然后,找到终点时还要回溯;两点之间的所有路径void findallway(adjlist *G,int m,int n)//int i,t,k;arcnode *p;p a_th rp;p ush(s,m);G->vertex[m-1].flag=1;if(m==n)rp .sumweight=k=calculate(G);rp .sum=s->t op;rp.num=(y+1);p ush1(&z,r p);printf(" 路径%3d 为(途径%2d 个景点,长度为%3d) : ",y+1,s->top,k);for(i=O;iv=s->t op ;i++)p rintf("->%d",s->elem[i]);p rintf("\n");G->vertex[m-1].flag=1;y++;//外部全局变量二for(p=G->vertex[m-1].firstarc ;p!=NULL ;p=p-> nextarc)t=p->num;if(G->vertex[t-1].flag==0)findallway(G,t,n);G->vertex[s->elem[s->to p]-1].flag=0;// pop s(s);}//从文件里读取数据;错误1 ;不知道此节点有几个邻接点,因为%s 的原因,就会只把第一个节点的相关数据读出来,从第二个节点的相关信息处,开始读出错误(即烫烫烫烫烫烫烫烫烫烫烫)不超过m;错误2 ;读文件时,因为有链表的部分,就按照单链表的创建些写,结果总是此节点的 最后一个邻接点没被读到内存里,究其原因,是最后一个 (不仅我把 p2->nextarc=NULL;还把 free(p1);)void readnet(adjlist *G) {int i,count,m;arcnode *head,* p2,* p1; FILE *fp;fp=fo pen(U,"rt"); if(fp==NULL) {printf(-文件打开失败! ! ");exit(0);}for(i=0;i<vnum;i++) {fscanf(fp,"%d %s %s %d %d",&G->vertex[i].num,G->vertex[i].name,G->vertex[i].introduce,&G->vertex[ i].sum,&G->vertex[i].flag);//fprintf()的''后面不加第一个空格也可以。
数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码 运行截图[方案]
![数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码 运行截图[方案]](https://img.taocdn.com/s3/m/23fddeb381c758f5f61f6787.png)
数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码运行截图[方案]C++题目: 校园导游咨询学生姓名: 学号: 院系: 专业年级:2011年7月1日一、设计题目校园导游咨询,1、实验目的,1,熟练掌握图的创建及遍历基本操作算法。
,2,熟练掌握最短路径算法。
,3,利用图的遍历和最短路径求解技术,设计一个校园导游程序,为来访的客人提供各种信息查询服务。
2、实验内容【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息,以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。
【测试数据】由读者根据实际情况指定。
【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。
顶点和边均含有相关信息。
【选作内容】(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
二、小组成员分工说明略三、需求分析1,运行环境,软、硬件环境,硬件环境,windows2000、windows XP、windows7 皆可,软件环境,Microsoft (R) Developer Studio (2)2,输入的形式和输入值的范围输入形式,整形数据,景点代号、路径长度、地图上的方位信息,,字符串,景点名称及简介,,输入值范围,景点代号为,整形0~17,共18个景点,路径长度为,整形1~10,两景点间距离,以近似1,:100m比例换算,最远1km,景点名称字符串长度,整形1~15,景点名称,字符串长度为,字符数组1~50,对景点进行简要介绍,景点在地图方位图上的位置,整形0~103,输出的形式描述景点代号、景点名称、信息的关联以cout形式输出,告知来访客人,以便查询,景点信息查询结果的输出形式为cout字符串,两景点间最短路径输出形式为cout字符串符号、以及嵌套的printroad,,函数以显示路径信息及方位信息,方便客人获取最佳路线,4,功能描述(1)设计学校的校园平面图,所含景点18个。
数据结构实验报告(校园导游咨询)
![数据结构实验报告(校园导游咨询)](https://img.taocdn.com/s3/m/def5fc2eed630b1c59eeb527.png)
软件学院学生实验报告册实验课程名称:数据结构与算法实验项目名称:校园导游咨询实验类型(打√):(基础、综合、设计√)院系:信息工程学院计算机系专业:*****姓名:*** 学号:*****指导老师:***软件学院教务处编制一、实验预习报告内容二、实验原始(数据)记录实验时间:2007 年 6 月20日(星期三第7,8 节)实验同组人:三、实验报告内容2010年6 月21日注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。
2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。
【源程序】#include<iostream.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include<stdio.h>#include<process.h>#define OK 1#define ERROR 0#define MAX_CHARSTRING 100#define MAX_NAME 30#define INFINITY 32767typedef bool Status;typedef int VRType;typedef FILE *PFILE;typedef char *Infotype;//模块一:用邻接矩阵存储校园的地图struct ArcCell//弧类型表示路径{VRType adj;//路径的权值Infotype info;//路径的相关信息};struct VertexType//顶点类型表示景点{char name[MAX_NAME],number[MAX_NAME]; //景点的名称name、代号numberInfotype info;//景点的简介};struct MGraph//图类型表示校园的地图{VertexType *Vexs;//顶点向量指针ArcCell *Arcs;//邻接矩阵指针int *Short_st_Path;//存放最短路径的三维数组指针int vexnum,arcnum;//图的顶点vexnum数和弧数arcnum};int CalTwoDimPos(int b,int i,int j)//把第一维为b的二维数组的下标为[i][j]的地址转换成一维数组的地址,并返回{return i*b+j;}int CalThreeDimPos(int b,int i,int j,int k)//把第一、二维为b的三维数组的下标为[i][j][k]的地址转换成一维数组的地址,并返回{return i*b*b+j*b+k;}Status OpenWriteFile(PFILE &fp,char string[MAX_NAME])//打开写的文件名为string的文件{if(!(fp=fopen(string,"wb"))){cout<<"文件打开失败"<<endl;cout<<"Press any key to exit"<<endl;getch();exit(ERROR);}return OK;}Status OpenReadFile(PFILE &fp,char string[MAX_NAME])//打开读的文件名为string的文件{if(!(fp=fopen(string,"rb "))){cout<<"文件打开失败"<<endl;cout<<"Press any key to exit"<<endl;getch();exit(ERROR);}return OK;}Status MakeString(Infotype &ch)//分配一个字符串成功则返回1,否则返回0{if(!(ch=new char[MAX_CHARSTRING])){cout<<"字符串存储空间分配失败"<<endl;return ERROR;}return OK;}Status GetVex(int &v,char string[MAX_NAME],MGraph M)//返回图string顶点的位置,如果找到则返回它的位置,否则返回-1{for(v=M.vexnum-1;v>=0;v--)if(!(strcmp(string,M.Vexs[v].name)))return OK; return ERROR;}Status InitMGraph(MGraph &M,int n)//初始化一个顶点数为n的图{int i,adr;if(!((M.Arcs=new ArcCell[n*n])&&(M.Vexs=new VertexType[n])&&(M.Short_st_Path=new int[n*n*n]))){cout<<"图的存储空间分配失败"<<endl;exit(ERROR);}for(i=0,adr=0;i<n*n;i++,adr++)//对表示弧的邻接矩阵进行初始化{M.Arcs[adr].adj=INFINITY;M.Arcs[adr].info=NULL;}for(i=0,adr=0;i<n*n*n;i++,adr++)M.Short_st_Path[adr]=-1;return OK;}Status DestroyGraph(MGraph &M){int i,adr;for(i=0;i<M.vexnum;i++){delete(M.Vexs[i].info);M.Vexs[i].info=NULL;}delete(M.Vexs);M.Vexs=NULL;for(i=0,adr=0;i<M.vexnum*M.vexnum;i++,adr++) {if(M.Arcs[adr].info!=NULL){delete(M.Arcs[adr].info);M.Arcs[adr].info=NULL;}}delete(M.Arcs);M.Arcs=NULL;delete(M.Short_st_Path);M.Short_st_Path=NULL;return OK;}Status PutMGrap(MGraph M,char string[MAX_NAME])//把内存中的图保存在string文件中{FILE *fp;int i,adr;OpenWriteFile(fp,string);fwrite(&M.vexnum,sizeof(int),1,fp);fwrite(&M.arcnum,sizeof(int),1,fp);fwrite(M.Vexs,sizeof(VertexType),M.vexnum,fp); for(i=0;i<M.vexnum;i++)fwrite(M.Vexs[i].info,sizeof(char),MAX_CHARSTRI NG,fp);fwrite(M.Arcs,sizeof(ArcCell),M.vexnum*M.vexnum ,fp);for(i=0,adr=0;i<M.vexnum*M.vexnum;i++,adr++)if(M.Arcs[adr].info!=NULL)fwrite(M.Arcs[adr].info,sizeof(char),MAX_CHARST RING,fp);fwrite(M.Short_st_Path,sizeof(int),M.vexnum*M.vex num*M.vexnum,fp);fclose(fp);return OK;}Status GetMGrap(MGraph &M,char string[MAX_NAME])//从文件中取出一个文件名为string的图调入内存{FILE *fp;int i,adr;OpenReadFile(fp,string);fread(&M.vexnum,sizeof(int),1,fp);InitMGraph(M,M.vexnum);fread(&M.arcnum,sizeof(int),1,fp);fread(M.Vexs,sizeof(VertexType),M.vexnum,fp);for(i=0;i<M.vexnum;i++){MakeString(M.Vexs[i].info);fread(M.Vexs[i].info,sizeof(char),MAX_CHARSTRI NG,fp);}fread(M.Arcs,sizeof(ArcCell),M.vexnum*M.vexnum, fp);for(i=0,adr=0;i<M.vexnum*M.vexnum;i++,adr++) if(M.Arcs[adr].info!=NULL){MakeString(M.Arcs[adr ].info);fread(M.Arcs[adr].info,sizeof(char),MAX_CHARST RING,fp); }fread(M.Short_st_Path,sizeof(int),M.vexnum*M.vexn um*M.vexnum,fp);fclose(fp);return OK;}Status CreateMGraph()//创建一个图,并保存在string文件中{MGraph M;int i,j,k,adr,adr1;charv1[MAX_NAME],v2[MAX_NAME],string[MAX_N AME];VRType w;cout<<"请输入图的景点数和路径数:";cin>>M.vexnum>>M.arcnum;InitMGraph(M,M.vexnum);cout<<"请输入图名称、代号、简介:"<<endl;for(i=0;i<M.vexnum;i++)//输入景点的名称、代号、简介{MakeString(M.Vexs[i].info);cin>>M.Vexs[i].name>>M.Vexs[i].number>>M.Vexs[ i].info; }cout<<"请输入路径的起点、终点、权值和相关信息"<<endl;for(k=0;k<M.arcnum;k++){LEAP:cin>>v1>>v2;GetVex(i,v1,M);GetVex(j,v2,M);while(i==-1||j==-1){cout<<"输入景点名错误,请重新输入"<<endl; goto LEAP;}cin>>w;adr=CalTwoDimPos(M.vexnum,i,j);M.Arcs[adr].adj=w;MakeString(M.Arcs[adr].info);cin>>M.Arcs[adr].info;adr1=CalTwoDimPos(M.vexnum,j,i);MakeString(M.Arcs[adr1].info);M.Arcs[adr1].adj=w;strcpy(M.Arcs[adr1].info,M.Arcs[adr].info); }cout<<"请输入图的保存路径\\名称:";cin>>string;PutMGrap(M,string);DestroyGraph(M);return OK;}Status Shortest_Path_FLOYD(char string[MAX_NAME])//对以文件名为string的地图求最短路径{MGraph M;int i,j,k,n,adr,adr1,adr2,*d;GetMGrap(M,string);if(!(d=new int[M.vexnum*M.vexnum])){cout<<"数组D[i][j]存储空间分配失败"<<endl;exit(ERROR); }for(i=0;i<M.vexnum;i++)for(j=0;j<M.vexnum;j++){adr=CalTwoDimPos(M.vexnum,i,j);d[adr]=M.Arcs[adr].adj;if(d[adr]<INFINITY){adr=CalThreeDimPos(M.vexnum,i,j,0);M.Short_st_Path[adr]=i;M.Short_st_Path[adr+1]=j;}}for(i=0;i<M.vexnum;i++)for(j=0;j<M.vexnum;j++)for(k=0;k<M.vexnum;k++)if(j!=k){adr=CalTwoDimPos(M.vexnum,j,k);adr1=CalTwoDimPos(M.vexnum,j,i);adr2=CalTwoDimPos(M.vexnum,i,k);if(d[adr1]+d[adr2]<d[adr]){d[adr]=d[adr1]+d[adr2]; adr=CalThreeDimPos(M.vexnum,j,k,0);for(n=0;n<M.vexnum;n++) M.Short_st_Path[adr+n]=-1;adr1=CalThreeDimPos(M.vexnum,j,i,0);adr2=CalThreeDimPos(M.vexnum,i,k,0);for(;M.Short_st_Path[adr1]!=-1;){M.Short_st_Path[adr++]=M.Short_st_Path[adr1++]; }adr--;for(;M.Short_st_Path[adr2]!=-1;){M.Short_st_Path[adr++]=M.Short_st_Path[adr2++]; }}}PutMGrap(M,string);DestroyGraph(M);return OK;}Status Search_Shortest_Path(char string[MAX_NAME])//查询地图文件名为string的最短路径{MGraph M;char v1[MAX_NAME],v2[MAX_NAME];int i,j,k,adr;GetMGrap(M,string);cout<<"请输入起始位置和终点位置名称:"; cin>>v1>>v2;GetV ex(i,v1,M);GetVex(j,v2,M);if(i==-1||j==-1){cout<<"输入景点名错误,请重新输入"<<endl;return ERROR;}adr=CalThreeDimPos(M.vexnum,i,j,0);if(M.Short_st_Path[adr]==-1){cout<<v1<<"到"<<v2<<"的路径:没有路径"<<endl;return OK;}cout<<v1<<"到"<<v2<<"的路径:";for(k=0;M.Short_st_Path[adr]!=-1&&k<M.vexnum;a dr++,k++)cout<<M.V exs[M.Short_st_Path[adr]].name<<"-->"; cout<<"\b\b\b "<<endl;cout<<v1<<"到"<<v2<<"途经路径的信息:"<<endl; adr=CalThreeDimPos(M.vexnum,i,j,0);for(k=0;M.Short_st_Path[adr+1]!=-1&&k<M.vexnum -1;k++){i=M.Short_st_Path[adr];j=M.Short_st_Path[++adr];cout<<M.V exs[i].name<<"-->"<<M.Vexs[j].name<<"路径信息:"<<M.Arcs[CalTwoDimPos(M.vexnum,i,j)].info<<end l; }DestroyGraph(M);return OK;}Status Search_Sight(char string[MAX_NAME])//查询地图文件名为string的景点{MGraph M;char v1[MAX_NAME];int i;GetMGrap(M,string);cout<<"请输入景点名称:";cin>>v1;GetV ex(i,v1,M);if(i==-1){cout<<"输入景点名错误,请重新输入"<<endl;return ERROR; }cout<<"代号:"<<M.Vexs[i].number<<";相关信息:"<<M.Vexs[i].info<<endl;DestroyGraph(M);return OK;}Status InsertArc(char string[MAX_NAME])//对保存在string的地图增加一条弧{MGraph M;char v1[MAX_NAME],v2[MAX_NAME];int i,j,adr,adr1,w;GetMGrap(M,string);cout<<"请输入路径的起点、终点、权值和相关信息:";cin>>v1>>v2;GetV ex(i,v1,M);GetVex(j,v2,M);if(i==-1||j==-1){cout<<"输入景点名错误,请重新输入"<<endl;return ERROR; }cin>>w;adr=CalTwoDimPos(M.vexnum,i,j);M.Arcs[adr].adj=w;MakeString(M.Arcs[adr].info);cin>>M.Arcs[adr].info;adr1=CalTwoDimPos(M.vexnum,j,i);MakeString(M.Arcs[adr1].info);M.Arcs[adr1].adj=w;strcpy(M.Arcs[adr1].info,M.Arcs[adr].info);M.arcnum++;PutMGrap(M,string);DestroyGraph(M);return OK;}Status DeleteArc(char string[MAX_NAME])//对保存在string的地图删除一条弧{MGraph M;char v1[MAX_NAME],v2[MAX_NAME];int i,j,adr;GetMGrap(M,string);cout<<"请输入景点的起点、终点:";cin>>v1>>v2;GetV ex(i,v1,M);GetVex(j,v2,M);if(i==-1||j==-1){cout<<"输入景点名错误,请重新输入"<<endl;return ERROR; }adr=CalTwoDimPos(M.vexnum,i,j);M.Arcs[adr].adj=INFINITY;if(M.Arcs[adr].info!=NULL)delete(M.Arcs[adr].info);M.Arcs[adr].info=NULL;adr=CalTwoDimPos(M.vexnum,j,i);M.Arcs[adr].adj=INFINITY;if(M.Arcs[adr].info!=NULL)delete(M.Arcs[adr].info);M.Arcs[adr].info=NULL;M.arcnum--;PutMGrap(M,string);DestroyGraph(M);return OK;}void PrintMGrap(char string[MAX_NAME]) {FILE *fp;char c;OpenReadFile(fp,string);while(!feof(fp)){c=getc(fp);cout<<c;}cout<<endl;}void main(){char string[MAX_NAME],str[MAX_NAME],c,c1; do{system("cls");cout<<"************************************* ******************************************" <<endl;cout<<" *主功能及主要命令:(1)建立及修改地图C;"<<endl;cout<<" *菜(2)导游咨询T."<<endl;cout<<" *单(3)退出程序Q"<<endl;cout<<"************************************* ******************************************" <<endl;cout<<"请输入命令(C,T,Q):";cin>>c;switch(c){case 'C':system("cls");cout<<"************************************* ******************************************" <<endl;cout<<" *子功能及主要命令:(1)创建地图C;"<<endl;cout<<" *菜(2)增加一条路径A;"<<endl;cout<<" *单(3)删除一条路径D;"<<endl;cout<<" (4)返回上一级菜单Q."<<endl;cout<<"************************************* ******************************************" <<endl;do{cout<<"请输入命令(C,A,D,Q):";cin>>c1;switch(c1){case 'C':CreateMGraph();break;case 'A':cout<<"请输入要修改的地图路径\\名称"; cin>>string;InsertArc(string);break;case 'D':cout<<"请输入要修改的地图路径\\名称"; cin>>string;DeleteArc(string);break;}}while(c1!='Q');break;case 'T':cout<<"请输入要查询的地区:";cin>>string;Shortest_Path_FLOYD(string);system("cls");cout<<"************************************* ******************************************" <<endl;cout<<" 功能及主要命令:(1)显示平面图O;"<<endl;cout<<" *子(2)查询任意景点的信息I;"<<endl;cout<<" *菜(3)查询任意景点的最短路径R;"<<endl;cout<<" *单(4)返回上一级菜单Q."<<endl;cout<<"************************************* ******************************************" <<endl;do{cout<<"请输入命令(O,I,R,Q):";cin>>c1;switch(c1) {case 'O':cout<<"请输入地图的路径\\名称";cin>>str;PrintMGrap(str);break;case 'I':Search_Sight(string);break;case 'R':Search_Shortest_Path(string);break;}}while(c1!='Q'); break;};cout<<"请输入任意键继续运行程序"<<endl;getch();}while(c!='Q');}。
校园导游咨询实验报告
![校园导游咨询实验报告](https://img.taocdn.com/s3/m/dff9900ef11dc281e53a580216fc700abb68522e.png)
本实验旨在通过设计并实现一个校园导游咨询系统,提高学生对数据结构在实际问题中的应用能力,培养编程实践能力和问题解决能力。
通过本次实验,学生能够深入了解图论在计算机科学中的应用,学会使用图论算法解决实际问题,并掌握Java编程语言在图形用户界面(GUI)设计中的应用。
二、实验内容1. 问题描述设计一个校园导游咨询系统,为来访客人提供以下服务:- 查询校园内景点的详细信息,包括名称、代号、简介等。
- 查询任意两个景点之间的最短路径。
- 提供从指定景点出发,游览所有景点的推荐路径。
2. 基本要求- 设计校园平面图,包含不少于10个景点。
- 以图中顶点表示校内各景点,存储景点名称、代号、简介等信息。
- 以边表示路径,存储路径长度等相关信息。
- 实现景点信息查询、景点间最短路径查询和推荐游览路径查询功能。
3. 数据结构- 采用邻接矩阵存储校园平面图,表示景点间的路径关系。
- 使用前趋结点数组辅助Floyd算法实现最短路径查询。
4. 算法- 使用Floyd算法计算任意两个景点之间的最短路径。
- 使用DFS算法结合贪心思想计算推荐游览路径。
5. 界面设计- 使用Java Swing实现图形用户界面,方便用户进行操作。
1. 需求分析- 与用户沟通,了解用户对校园导游咨询系统的需求。
- 确定系统功能,包括景点信息查询、景点间最短路径查询和推荐游览路径查询。
2. 系统设计- 设计系统架构,包括数据结构、算法和界面设计。
- 确定数据存储方式和算法实现方法。
3. 编码实现- 使用Java编程语言实现系统功能。
- 实现数据结构、算法和界面设计。
4. 测试与调试- 编写测试用例,验证系统功能。
- 调试系统,修复发现的问题。
四、实验结果1. 景点信息查询- 用户可以输入景点代号,查询景点详细信息,包括名称、代号、简介等。
2. 景点间最短路径查询- 用户可以输入两个景点的代号,查询它们之间的最短路径。
3. 推荐游览路径查询- 用户可以输入起始景点的代号,查询从该景点出发,游览所有景点的推荐路径。
校园导游系统实验报告
![校园导游系统实验报告](https://img.taocdn.com/s3/m/efe68d3deff9aef8951e0609.png)
竭诚为您提供优质文档/双击可除校园导游系统实验报告篇一:校园导游图系统数据结构实验报告一.设计目的通过布置具有一定难度的实际程序设计项目,使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;使学生掌握分析问题,求解问题的方法并提高学生设计编程实现的能力。
二.设计内容用无向网表示学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
游客通过终端可询问:(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
![数据结构校园导游咨询系统课程设计报告及课程总结.doc](https://img.taocdn.com/s3/m/e7adba55dd36a32d73758183.png)
姓名:班级:学号:指导教师: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、查询两景点最短路径:用户在选择此功能模块后,按照屏幕上方提示的景点名称及其对应的编号,要求用户输入起点和终点的编号,系统将在已存储的景点中进行匹配,若未找到所需查询的景点编号,系统将提示错误并要求用户再次输入。
校园导游系统 数据结构实习报告
![校园导游系统 数据结构实习报告](https://img.taocdn.com/s3/m/38bfa4d3daef5ef7ba0d3c88.png)
西安郵電學院数据结构设计报告题目:校园导游系统院系名称:计算机学院专业名称:计算机科学与技术班级:学生姓名:学号(8位):指导教师:设计起止时间:2011年12月12日~2011年12月16日一. 设计目的1 对自己学过的知识进一步巩固,对数据结构的算法思想要有更深的理解。
2 通过课程设计,学会通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。
3 学会综合运用数据结构课程中图类型数据结构,组建一个较为完整的系统。
二. 设计内容1 校园平面图2 选取有代表性的景点,用邻接链表存储相关信息3 查询图中任意景点的相关信息4 查询任意两个景点之间的一条最短的简单路径5 查询中转最少的路径6 查询两个景点间的全部路径三.概要设计1.功能模块图2.各个模块详细的功能描述ShortestPath_Floyd() 任意两个地点之间最短路径算法least() 两个地点之间中转最少算法main() 主函数xiaoyuantu() 校园概略图shuchu() 校园的全部信息输出CreatUDN() 创建图DFS_ path() 两个景点之间的全部路径四.详细设计2.各功能函数的数据流程图ShortestPath_Floyd()allpath()least()3.重点设计及编码两个景点之间的全部路径void DFS_path(AdjM g, int m,int n,int k){int s;if(pre[k]==n && k<11) //pre[k]存储路径顶点若pre[k]是终点,则输出该路径{ //递归出口,找到一条路径for(s=0;s<k;s++)printf("%s>>>>>",g.vertex[pre[s]].name); //输出该路径。
s=0 时为起点mprintf("%s",g.vertex[pre[s]].name); //输出最后一个景点名(即顶点n的名字,此时s==k)printf("\n\n");}else{s=0;while(s<g.vexnum) //从第m个顶点,试探至m到其他顶点是否有路径{if((g.arcs[pre[k]][s].adj<INFINITY) && (visited[s]==0)) //顶点k到顶点s有边,且未被访问{visited[s]=1;pre[k+1]=s; //存储顶点编号s至pre[k+1]中DFS_path(g,m,n,k+1); //求从下标为k+1的pre[k+1]个顶点开始的路径(递归调用),同时打印出一条m至n的路径visited[s]=0; //将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径}s++; //试探从下一个顶点s 开始是否有到终点的路径}}}void all_path(AdjM g){int i,m,n;printf("\n\n请输入你要查询的两个景点编号:\n\n");scanf("%d %d",&m,&n);printf("\n\n");pre[0]=m; //存储路径起点ufor(i=0;i<g.vexnum;i++) //全部顶点访问标志初值设为0visited[i]=0;visited[m]=1; //表示已经访问过DFS_path(g,m,n,0); //对应起点pre[0]==u}任意两个地点之间最短路径算法ShortestPath_Floyd(AdjM *g) //弗洛伊德算法{int i,k,j,l,flag=1,path[maxnum][maxnum][maxnum],dist[maxnum][maxnum];//path[][][]三维数组保存任意两个顶点之间的最短路径,如果P[i][j][l]为1,那么l是从i到j 的路径上的一个顶点//dist[][]二维数组保存任意两个顶点之间的最短路径的权值printf("景点编号如下:\n");for(i=0;i<g->vexnum;i++)printf(" %-4d %-15s\n",i,g->vertex[i].name);for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++){dist[i][j]=g->arcs[i][j].adj; //从i到j的直接路径为弧i--j的权值for(l=0;l<g->vexnum;l++)path[i][j][l]=0; //假设从i到j的最短路径没有经过其他顶点置值为0if(dist[i][j]<INFINITY) //判断最短路径是否包括i--j自身{path[i][j][i]=1;path[i][j][j]=1;}}for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++)for(l=0;l<g->vexnum;l++)if(dist[j][i]+dist[i][l]<dist[j][l]) //如果从j经过i到l的路径更小,调换值{dist[j][l]=dist[j][i]+dist[i][l];for(k=0;k<g->vexnum;k++)path[j][l][k]=path[j][i][k]+path[i][l][k];//从j到l的路径等于从v到i的路径加从i到l 的路径}while(flag==1) //标记量,无实际意义{printf("请输入出发地和目的地:");scanf("%d %d",&k,&j);if(k>=0&&k<g->vexnum&&j>=0&&j<g->vexnum) flag=0;}printf("%s",g->vertex[k].name);for(l=0;l<g->vexnum;l++)if(path[k][j][l]&&k!=l&&j!=l)printf(">>>>>%s",g->vertex[l].name);printf(">>>>>%s",g->vertex[j].name);printf(" 总路线长%d米\n",dist[k][j]);}五.测试数据及运行结果1.正常测试数据和运行结果最短路径全部路径中转最少路径六.调试情况,设计技巧及体会1.改进方案整个代码只是完成了基本的要求,并没用完成扩充的问题,对于文件没用完成,以及添加删除路径也没有进行编写,而且在查找方式中,只是进行了编号查询。
数据结构课程设计——校园导游咨询系统
![数据结构课程设计——校园导游咨询系统](https://img.taocdn.com/s3/m/79eaac8b77a20029bd64783e0912a21614797f95.png)
数据结构课程设计——校园导游咨询系统在当今数字化的时代,信息的高效获取和处理变得至关重要。
对于一个大型校园来说,拥有一个便捷的导游咨询系统能够极大地提升访客和新生的体验。
本次数据结构课程设计的目标就是创建一个实用的校园导游咨询系统。
一、系统需求分析首先,我们需要明确这个校园导游咨询系统的主要功能和用户需求。
对于访客和新生来说,他们可能希望了解校园内各个景点的位置、简介,以及如何从当前位置到达目标景点的最优路径。
系统应该能够提供清晰准确的地图信息、景点介绍和导航指引。
从学校管理的角度出发,系统需要易于更新和维护,能够及时添加新的景点或者修改已有景点的信息。
同时,为了保证系统的稳定性和安全性,需要有一定的权限管理机制,防止未经授权的修改和访问。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和管理校园的相关信息。
对于校园地图的表示,可以使用图(Graph)这种数据结构。
将校园中的各个景点看作图中的节点,景点之间的道路看作边,边的权重可以表示道路的长度或者行走所需的时间。
为了存储景点的详细信息,如名称、简介等,可以使用结构体或者类。
每个景点的结构体或类成员包含景点的标识符、名称、简介等属性。
对于路径搜索和导航,我们可以选择迪杰斯特拉(Dijkstra)算法或者 A算法来计算最短路径。
三、系统功能模块设计1、地图显示模块能够以直观的方式展示校园的地图,包括各个景点的位置和连接关系。
支持缩放、平移等操作,方便用户查看不同区域的细节。
2、景点信息查询模块用户可以输入景点名称或关键词,系统能够快速检索并显示相应景点的详细信息。
3、路径规划模块根据用户输入的起始景点和目标景点,计算并显示最优的行走路径。
能够提供多种路径选择,如最短路径、最少转弯路径等。
4、周边设施查询模块用户可以查询某个景点周边的餐厅、商店、卫生间等设施的位置。
5、用户管理模块只有授权的管理员能够对校园景点信息和地图进行修改和更新。
校园导游实验报告——数据结构
![校园导游实验报告——数据结构](https://img.taocdn.com/s3/m/3b99a5babdeb19e8b8f67c1cfad6195f312be8dd.png)
校园导游实验报告——数据结构校园导游实验报告——数据结构一、引言在校园导游系统中,数据结构起着至关重要的作用。
本实验报告旨在详细描述我们设计和实现校园导游系统时所采用的数据结构,并分析其在系统中的应用。
二、问题定义在校园导游系统中的问题定义如下:1·设计一个能够记录校园景点信息的数据库。
2·实现一个能够根据用户需求提供推荐路线的算法。
3·开发一个用户界面,方便用户进行导游操作。
三、数据结构设计1·数据库设计●景点信息表:包括景点名称、位置、介绍等字段。
●路线信息表:包括起点、终点、路径、长度等字段。
●用户信息表:包括用户ID、喜好景点等字段。
2·算法设计●图的表示:使用邻接矩阵或邻接表来表示校园景点之间的关系。
●最短路径算法:采用Dijkstra或Floyd-Warshall算法来计算两个景点之间的最短路径。
●推荐算法:根据用户喜好景点和景点之间的关系,应用基于用户的协同过滤算法或基于内容的推荐算法来为用户推荐最佳路线。
四、系统实现1·技术选型:选择合适的编程语言和开发框架。
2·数据库创建:根据设计的数据库结构,创建相应的表格。
3·数据导入:将校园景点信息导入数据库中。
4·界面设计:开发用户友好的界面,实现用户导游操作功能。
5·算法实现:根据设计的算法,编写相应的代码。
6·系统集成:将界面和算法进行整合,确保系统正常运行。
五、结果分析在我们的实验中,校园导游系统表现出了良好的性能和有效的导游功能。
用户可以根据自己的喜好景点,快速找到最佳的路线,并享受愉快的导游体验。
六、总结与展望通过本次实验,我们掌握了校园导游系统的设计与实现方法,熟悉了数据结构在系统中的重要性。
我们将继续改进和完善系统功能,提升用户体验。
附件:1·数据库表结构图2·系统界面截图3·算法实现代码法律名词及注释:1·数据库:指结构化数据的集合,按照一定规范组织、存储和管理的系统。
校园导游系统 数据结构实习报告
![校园导游系统 数据结构实习报告](https://img.taocdn.com/s3/m/bb1a3c1eb207e87101f69e3143323968011cf4c6.png)
校园导游系统数据结构实习报告在当今数字化的时代,校园导游系统对于提升校园的服务质量和访客体验具有重要意义。
本次数据结构实习,我致力于开发一个实用的校园导游系统,通过运用所学的数据结构知识,实现了系统的核心功能,并对整个开发过程进行了深入的总结和反思。
一、系统需求分析校园导游系统旨在为访客提供便捷的校园导航服务,帮助他们快速了解校园布局、建筑物位置以及相关设施信息。
具体需求包括:1、校园地图的构建与展示:能够清晰呈现校园的地理布局,包括建筑物、道路、绿地等。
2、地点查询功能:访客可以输入目标地点,系统能够快速定位并提供导航路径。
3、周边设施查询:如餐厅、图书馆、停车场等,方便访客了解周边服务设施。
二、数据结构选择为了实现上述功能,需要选择合适的数据结构来存储和管理校园信息。
经过分析,我选用了以下几种数据结构:1、图结构用图来表示校园的地理布局,将建筑物和道路视为图的顶点和边。
可以使用邻接矩阵或邻接表来存储图的关系,便于进行路径搜索和遍历。
2、哈希表用于快速查找地点和设施的信息,提高查询效率。
3、链表存储导航路径,方便进行路径的添加和删除操作。
三、系统功能实现1、地图构建首先,对校园进行实地考察,收集建筑物和道路的位置信息。
然后,将这些信息转化为图的顶点和边,并建立相应的邻接关系。
2、地点查询当访客输入地点名称时,通过哈希表快速定位到对应的顶点。
接着,使用图的搜索算法(如迪杰斯特拉算法)计算从当前位置到目标位置的最短路径。
3、周边设施查询为每个设施建立相应的标识,并在哈希表中存储设施的位置和相关信息。
根据访客的当前位置,搜索附近一定范围内的设施。
四、系统界面设计为了提供友好的用户体验,设计了简洁直观的系统界面。
界面主要包括以下几个部分:1、地图展示区以图形化的方式展示校园地图,标注出建筑物和道路。
2、查询输入框访客可以在此输入地点或设施名称进行查询。
3、结果显示区显示查询结果,包括目标地点的位置、导航路径以及周边设施信息。
数据结构课程设计——校园导游咨询系统
![数据结构课程设计——校园导游咨询系统](https://img.taocdn.com/s3/m/9621c5ffaf45b307e971972d.png)
数据结构课程设计——校园导游咨询系统1:需求分析:(1)任务:编制一个为来访客人进行最短路径导游的程序(2)要求:从学校的平面上选取n个有代表性的景点,根据用户指定的起点和终点输出相应路径。
2:概要设计:(1)1)a)AdjMGraph.h图操作的函数所放的头文件b) AdjMGraphCreate.h图的创建函数所放的头文件c) Dijkstra.h狄克斯特拉函数设计所放的头文件d) SeqList.h存放顺序表的头文件2)SchoolGuide.c文件包括以下三个函数void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j)函数,其功能是将源点到各个结点的最短距离和最短路径的结果输出;void Sgblueprint()函数,其功能是将校园平面图输出;void main(void)函数,主函数,功能是调用测试数据值,显示主菜单,根据用户输入的i进行不同功能操作,随后根据用户输入的ch值进行不同功能操作。
(2)该程序所使用的存储结构是顺序存储;(3)流程图:图1-1主函数main()流程图图1-2 SgPrint函数流程图3:详细设计:(1)/*顺序表头文件SeqList.h*/typedef struct{DataType list[MaxSize];int size;}SeqList;void ListInitiate(SeqList *L) /*初始化顺序表L*/ {L->size=0; /*定义初始化数据元素个数*/}int ListLength(SeqList L) /*返回顺序表L的当前数据元素个数*/{return L.size;}int ListInsert(SeqList *L,int i,DataType x)/*在顺序表L的第i(0≤i≤size)个位置前插入数据元素值x*//*插入成功返回1,插入失败返回0*/{int j;if(L->size>=MaxSize){printf("顺序表已满无法插入!\n");return 0;}else if(i<0||i>L->size){printf("参数i不合法!\n");return 0;}else{/*为插入做准备*/for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];L->list[i]=x;/*插入x*/L->size++;/*元素个数加1*/return 1;}}int ListDelete(SeqList *L,int i,DataType *x){/*删除顺序表L中位置为i(0≤i≤size-1)的数据元素并存放到x中*/ /*删除成功返回1,删除失败返回0*/int j;if(L->size<=0){printf("顺序表已空无数据元素可删!\n");return 0;}else if(i<0||i>L->size-1){printf("参数i不合法");return 0;}else{*x=L->list[i]; /*保存删除的元素到x中*//*依次前移*/for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];L->size--;return 1;}}int ListGet(SeqList L,int i,DataType *x)/*取顺序表L中第i个数据元素存于x中,成功返回1.失败返回0*/ {if(i<0||i>L.size-1){printf("参数i不合法!\n");return 0;}else{*x=L.list[i];return 1;}}(2)/*AdjMGraph.h图操作的函数所放的头文件*/#include"Seqlist.h"/*包含顺序表头文件*/typedef struct{SeqList Vertices;/*存放结点的顺序表*/int edge[MaxVertices][MaxVertices];/*存放边的邻接矩阵*/ int numOfEdges;/*边的条数*/}AdjMGraph;/*图的结构体定义*/void Initiate(AdjMGraph *G,int n)/*初始化*/{int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j) G->edge[i][j]=0;else G->edge[i][j]=MaxWeight;}G->numOfEdges=0;/*边的条数置为0*/ListInitiate(&G->Vertices);/*顺序表初始化*/}void InsertVertex(AdjMGraph *G,DataType vertex)/*在图G中插入结点vertex*/{ListInsert(&G->Vertices,G->Vertices.size,vertex);/*顺序表尾插入*/}void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/*在图G中插入边<v1,v2>,边<v1,v2>的权为weight*/if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=weight;G->numOfEdges++;}void DeleteEdge(AdjMGraph *G,int v1,int v2)/*在图G中删除边<v1,v2>*/{if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=MaxWeight;G->numOfEdges--;}void DeleteVerten(AdjMGraph *G,int v)/*删除结点V*/{int n=ListLength(G->Vertices),i,j;DataType x;for(i=0;i<n;i++)/*计算删除后的边数*/for(j=0;j<n;j++)if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight) G->numOfEdges--;/*计算被删除边*/for(i=v;i<n;i++) /*删除第v行*/for(j=0;j<n;j++)G->edge[i][j]=G->edge[i+1][j];for(i=0;i<n;i++) /*删除第v列*/for(j=v;j<n;j++)G->edge[i][j]=G->edge[i][j+1];ListDelete(&G->Vertices,v,&x);/*删除结点v*/}int GetFirstVex(AdjMGraph G,int v)/*在图G中寻找序号为v的结点的第一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*/int col;if(v<0||v>G.Vertices.size){printf("参数v越界出错\n");exit(1);}for(col=0;col<G.Vertices.size;col++)if(G.edge[v][col]>0&&G.edge[v][col]<MaxWeight)return col;return -1;}int GetNextVex(AdjMGraph G,int v1,int v2)/*在图G中寻找v1结点的邻接结点v2的下一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*//*v1和v2都是相应结点的序号*/{int col;if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}for(col=v2+1;col<G.Vertices.size;col++)if(G.edge[v1][col]>0&&G.edge[v1][col]<MaxWeight) return col;return -1;}(3)/*AdjMGraphCreate.h图的创建函数所放的头文件*/typedef struct{int row;/*行下标*/int col;/*列下标*/int weight;/*权值*/}RowColWeight;/*边信息结构体定义*/void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) /*在图G中插入n个结点信息V和e条边信息E*/{int i,k;Initiate(G,n);/*结点顺序表初始化*/for(i=0;i<n;i++)InsertVertex(G,V[i]);/*结点插入*/for(k=0;k<e;k++)InsertEdge(G,E[k].row,E[k].col,E[k].weight);/*边插入*/}(4)/* Dijkstra.h狄克斯特拉函数设计所放的头文件*/void Dijkstra(AdjMGraph G,int v0,int distance[],int path[])/*带权图G从下标v0结点到其他结点的最短距离distance*//*和最短路径下标path*/{int n=G.Vertices.size;int *s=(int *)malloc(sizeof(int)*n);int minDis,i,j,u;/*初始化*/for(i=0;i<n;i++){distance[i]=G.edge[v0][i];s[i]=0;if(i!=v0&&distance[i]<MaxWeight) path[i]=v0;else path[i]=-1;}s[v0]=1;/*标记结点v0已从集合T加入到集合S中*//*在当前还未到最短路径的结点集中选取具有最短距离的结点u*/for(i=1;i<n;i++){minDis=MaxWeight;for(j=0;j<n;j++)if(s[j]==0&&distance[j]<minDis){u=j;minDis=distance[j];}/*当已不再存在最短路径时算法结束;此语句对非连通图是必须的*/if(minDis==MaxWeight)return;s[u]=1;/*标记结点u已从集合T加入到集合S中*//*修改从v0到其他结点的最短距离和最短路径*/for(j=0;j<n;j++)if(s[j]==0&&G.edge[u][j]<MaxWeight&&distance[u]+G.edge[u][j]<distance[j]) {/*结点v0经结点u到其他结点的最短距离和最短路径*/distance[j]=distance[u]+G.edge[u][j];path[j]=u;}}}(5)/*SchoolGuide.c文件*/#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef char DataType;#define MaxSize 100#define MaxVertices 10#define MaxWeight 10000#include"AdjMGraph.h"#include"AdjMGraphCreate.h"#include"Dijkstra.h"void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j){ /*输出源点到其他各结点的最短距离和最短路径*/int i;/*从源结点到其他各结点的最短路径及其距离分别为:*/printf("从该结点%c到其他各结点的最短路径及其距离分别为:\n",g.Vertices.list[j]);printf("\n");//输出换行符for(i=0;i<n;i++){ /*从源结点到当前结点的最短路径为*/printf("从结点%c到结点%c的最短路径为:",g.Vertices.list[j],g.Vertices.list[i]);printf("(");//输出左括号if(path[i]!=-1)//源点到其他结点的最短路径的前一结点判断{ if(path[path[i]]!=-1)//该前一结点的前一结点进行判断{if(path[path[path[i]]]!=-1)//该前一结点的前一结点的前一结点进行判断{printf("%c,",g.Vertices.list[path[path[path[i]]]]);//输出相应存在的前一结点}printf("%c,",g.Vertices.list[path[path[i]]]);//输出应存在的前一结点}printf("%c,",g.Vertices.list[path[i]]);//输出应存在的前一结点}printf("%c",g.Vertices.list[i]);//输出当前结点printf(")");//输出换行符右括号printf(",其最短距离为%d;\n",distance[i]);//输出源点到其他结点的最短距离printf("\n");//输出换行符}}void Sgblueprint(){/*显示校园平面图*/printf(" ——————校园平面图——————\n");printf(" B(学生宿舍)———————————————————E(商业街)\n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf(" / \\(B到D) /| \n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf("A(校门口) ———————————————————D(学校食堂和 | \n");printf("| 学校田径场(学校田径场在学校食堂后面)) \\ | \n");printf("| \\(D到F)| \n");printf("| \\| \n");printf("C(第一、第二教学楼和校办) ———————————————————F(第三教学楼和实验楼)\n");}void main(void){AdjMGraph g;char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}};int i,j,n=6,e=9;//i为控制控制菜单项的数值,j为选取源点的数值char ch;int distance[6],path[6];printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i); //输入控制控制菜单项的数值i的值CreatGraph(&g,a,n,rcw,e);//创建图switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}while(3)//判断程序是否继续运行{printf("\n您是否还想进行其他操作(y/n):\n");//提示用户是否还需继续进行其他操作scanf("%s",&ch);//用户输入y/n以选择是否仍需进行其他操作if(ch=='Y'||ch=='y')//判断用户所输入的ch值是否为y/Y,以判断用户是否进行其他操作{system("cls");printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i);switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}}else return;//退出程序}}4:调试分析:(1)a)测试数据:char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}}; int n=6,e=9;b)测试结果:(2)所遇到的问题:1)SgPrint函数中的形参如何设置,通过仔细分析图的操作等头文件和主函数,最终分析函数SgPrint中应加入形参AdjMGraph g,int n,int distance[],int path[],int j;2)Sgblueprint函数中输出语句中想输出’\’,直接键入’\’发现不能输出’\’,最终查看消息窗口的提示信息和联系C语言中有关转义字符的相关知识,知道了如果相输出转义字符’\’本身就必须书写成’\\这样的格式;3)在进行菜单项操作时,如何做到清除原有屏幕的操作,通过上网查资料了解到,只需加入“system(“cls”);”该语句即可;4)SgPrint函数中如何实现输出如“从结点A到结点B的最短路径为:(A,C,B),其最短距离为20;”格式,通过分析Dijkstra.h和主函数,最终想到只需添加“if(path[i]!=-1){ if(path[path[i]]!=-1){if(path[path[path[i]]]!=-1){printf("%c,",g.Vertices.list[path[path[path[i]]]]);}printf("%c,",g.Vertices.list[path[path[i]]]);}printf("%c,",g.Vertices.list[path[i]]);}”这些代码,对源点到其他结点的最短路径的前一结点以及该前一结点的前一结点进行判断,并将这些结点输出,就能够解决上述问题。
校园导游实验报告——数据结构
![校园导游实验报告——数据结构](https://img.taocdn.com/s3/m/05b214d576eeaeaad1f33053.png)
数据结构实验报告——实验六简单校园导游程序的设计与实现本实验的目的是通过对校园导游程序的设计与实现来熟练掌握图型结构在实际问题中的应用。
一、【问题描述】当人们到一个陌生的地方去旅游的时候可能会找一个导游为自己在游玩的过程中提供方便。
导游可以提供很多服务,比如介绍参观景点的历史背景等相关信息,推荐到下一个景点的最佳路径,以及解答旅游者所提出的关于旅游经典的相关问询等等。
对于新生刚刚来到校园,对校园环境不熟悉的情况也如此,一般都是高年级的学生充当了“校园导游员”的角色,如果能够提供一个程序让新生或来访的客人自主的通过与机器的“对话”来获得相关的信息的话,将会节省大量的人力和时间。
而且所提供的信息也能够做到尽可能的准确、详尽。
一个成功的校园导游程序可以替代现实生活中这些“校园导游员”,更方便了大家查询校园相关的信息。
本次实验需要开发一个简单的校园导游程序,程序的主体功能为:1、显示校园平面图,方便用户直观的看到校园的全景示意图,并确定自己的位置。
2、为用户提供对平面图中任意场所的相关信息的查询。
3、为用户提供对平面图中任意场所的问路查询。
二、【数据结构设计】由于各个场所通过校园中的道路相连,各个场所和连接它们的道路构成了整个校园的地理环境,所以使用图这种数据结构对他们去进行描述。
以图中的顶点表示校园内各个场所,应包含场所名称、代号、简介等信息;以边表示连接各个场所的道路,应包含道路的代号、路径的长度等信息。
顶点和边均使用结构体定义,整个图的数据结构可以采用教材中介绍的各种表示方法,例如带权的邻接矩阵。
三、【功能(函数)设计】1、显示校园平面图的功能模块。
通过读文件的方式将各个地点的信息读入程序中.平面图中应醒目的标识出场所的准确名称以备用户查询。
河北大学校园导游的基本地点信息。
***************欢迎进入河北大学校园导游系统!************** -----------------------景点名称---------------------------主楼多功能馆毓秀园图书馆操场留学生楼七教八教九教成教南大门北大门一教逸夫楼博物馆物理楼电信楼化学楼生科楼建工楼北院食堂南院食堂竹园梅园桂园菊园易百超市北院生活园区---------------------------------------------------------- 地点的存储typedef struct Vertex//顶点结构体{int No;//地点编号char name[20];//地点名称char info[1000];//地点简介}Vertex;typedef struct //无向图结构体{Vertex view[Max_Vertex];int edges[Max_Vertex][Max_Vertex];//边的邻接矩阵int vnum,anum;//顶点和边的个数}Graph;2、查询任意场所的相关信息查询的功能模块。
校园导游系统实验报告(3篇)
![校园导游系统实验报告(3篇)](https://img.taocdn.com/s3/m/7cd42563eef9aef8941ea76e58fafab068dc4419.png)
第1篇一、实验背景随着科技的发展,信息化、智能化已成为现代社会的重要特征。
为了更好地服务广大师生和游客,提高校园游览体验,本实验旨在设计并实现一个校园导游系统。
该系统将利用现代信息技术,为游客提供便捷、高效的校园游览服务。
二、实验目的1. 熟悉并掌握面向对象编程技术,提高编程能力;2. 了解和掌握图数据结构及其应用;3. 熟悉并掌握弗洛伊德算法,实现最短路径求解;4. 培养团队协作和沟通能力。
三、实验内容1. 系统需求分析本系统主要面向校园游客,提供以下功能:(1)查询景点信息:包括景点名称、代号、简介等;(2)查询景点间最短路径:支持任意两个景点间的最短路径查询;(3)添加、删除景点:允许管理员添加或删除景点;(4)修改景点信息:允许管理员修改景点名称、代号、简介等;(5)校园平面图展示:以图形化方式展示校园平面图,方便游客了解校园布局。
2. 系统设计(1)系统架构设计本系统采用分层架构,包括以下层次:- 表示层:负责用户界面展示,包括主界面、景点信息查询界面、路径查询界面等;- 业务逻辑层:负责实现系统功能,包括景点信息管理、路径查询等;- 数据访问层:负责数据存储和访问,包括景点信息表、路径信息表等;- 数据库层:负责存储系统数据,包括景点信息、路径信息等。
(2)数据结构设计本系统采用图数据结构表示校园平面图,包括以下数据结构:- 图结构(Graph):表示校园平面图,包括顶点集合和边集合;- 顶点(Vertex):表示校园内的景点,包含景点名称、代号、简介等信息;- 边(Edge):表示景点间的路径,包含起点、终点、路径长度等信息。
(3)算法设计本系统采用弗洛伊德算法实现最短路径查询。
弗洛伊德算法是一种求解图中所有顶点对之间最短路径的算法,其基本思想是通过逐步增加路径长度,找出所有顶点对之间的最短路径。
3. 系统实现(1)主界面设计主界面采用菜单栏、工具栏和状态栏等布局,方便用户操作。
菜单栏包括景点信息查询、路径查询、添加景点、删除景点等功能;工具栏提供快速访问常用功能;状态栏显示系统状态信息。
校园导游实验报告——数据结构
![校园导游实验报告——数据结构](https://img.taocdn.com/s3/m/7b7c1f54001ca300a6c30c22590102020740f2db.png)
校园导游实验报告——数据结构
校园导游实验报告——数据结构
1.引言
- 简要介绍实验的目的和背景
- 阐述校园导游系统的重要性和应用价值
2.需求分析
- 分析校园导游系统的功能需求和性能要求
- 确定系统的基本模块,如地图显示、导航功能等
3.系统设计
3.1 数据结构设计
- 介绍选择的数据结构,如图、树、队列等的原因和优劣势
- 描述数据结构的组织方式和关键操作
3.2 界面设计
- 展示校园导游系统的用户界面设计
- 解释界面设计的考虑因素,如易用性、用户体验等
4.算法设计与实现
4.1 寻路算法设计
- 探讨常见的寻路算法,如Dijkstra算法、A算法等 - 选择适合校园导游系统的寻路算法,并解释原因
4.2 数据存储与交互
- 描述数据的存储方式,如数据库、文件等
- 分析数据的交互方式,如文件读写、网络传输等5.实验结果与分析
- 展示校园导游系统的功能演示和性能测试结果
- 对实验结果进行详细分析和解释
6.总结与展望
- 总结实验的目标是否达到,解决了哪些问题
- 展望校园导游系统的未来发展方向和改进空间
附件:
附件1:校园导游系统源代码
附件2:校园地图数据文件
附件3:实验中使用的测试数据集
法律名词及注释:
1.版权:指对作品享有的法律保护,包括复制权、发行权等。
2.私下使用:指在非商业、非公开场合下个人使用作品。
3.公共领域:指没有版权保护的作品,可供任何人使用。
4.许可证:指被授权人可以在指定条件下使用作品的文件或证明。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上海电力学院数据结构C++课程设计题目: 校园导游咨询学生姓名:学号:院系:专业年级:2011年7月1日一、设计题目校园导游咨询;1、实验目的(1)熟练掌握图的创建及遍历基本操作算法。
(2)熟练掌握最短路径算法。
(3)利用图的遍历和最短路径求解技术,设计一个校园导游程序,为来访的客人提供各种信息查询服务。
2、实验内容【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。
【测试数据】由读者根据实际情况指定。
【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。
顶点和边均含有相关信息。
【选作内容】(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
二、小组成员分工说明略三、需求分析1)运行环境(软、硬件环境)硬件环境:windows2000、windows XP、windows7 皆可;软件环境:Microsoft (R) Developer Studio (2)2)输入的形式和输入值的范围输入形式:整形数据(景点代号、路径长度、地图上的方位信息),字符串(景点名称及简介);输入值范围:景点代号为:整形0~17(共18个景点)路径长度为:整形1~10(两景点间距离,以近似1::100m比例换算,最远1km)景点名称字符串长度:整形1~15(景点名称)字符串长度为:字符数组1~50(对景点进行简要介绍)景点在地图方位图上的位置:整形0~103)输出的形式描述景点代号、景点名称、信息的关联以cout形式输出,告知来访客人,以便查询;景点信息查询结果的输出形式为cout字符串;两景点间最短路径输出形式为cout字符串符号、以及嵌套的printroad()函数以显示路径信息及方位信息,方便客人获取最佳路线;4)功能描述(1)设计学校的校园平面图,所含景点18个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径,并提示出各景点之间的方位关系,行走方向。
5)测试数据输入功能选择号码,进入各项功能界面;根据功能界面的提示输入所要查询的内容:如,在查询景点功能界面需要根据提示输入所需查询的景点代号;在问路查询功能界面需要根据提示输入起点终点的景点代号。
四、概要设计1)抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或ppt及实验)#include<iostream>using namespace std;const int MaxSize=18;const int INFINITY=65535;//最大值无穷class direction;template <class T> class MGraph;template <class T>class VertexNode//定义景点结点,存储景点信息{friend class MGraph<T>;public:int vex;//景点名称T vexname;//景点名称T vexinf;//景点信息direction dir;//存放景点方位信息的direction类的dir。
};class direction{public:int ln;//存放在方向图中的横坐标,表示东西int col;//存放在方向图中的纵坐标,表示南北};template <class T>class MGraph//定义无向图的邻接矩阵{public:MGraph();//构造函数,初始化具有n个顶点的图void printvexname();//显示所有景点及景点代号void printvexinf(int i);//显示代号为i景点的名称及信息void printroad(int i,int j);//显示景点i~j 的最短路径方案信息void printdir(int i,int j);//显示景点i到j 的方向信息,如“向东100m,向南200m”VertexNode<T> adjlist[MaxSize]; //存放景点全部信息的景点类数组int vertexNum,arcNum; //图的顶点数和边数void Root(int p,int q);//递归寻找pq间的最短路径int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//创建Path和Dist分别存放两点间最短路径的前驱节点,两点间最短路径长度int Line[MaxSize];//Line存放路径int kkk;//在floyed算法中,做Line[]数组的标记private:T vertex[MaxSize]; //存放图中顶点的数组int arc[MaxSize][MaxSize];//存放图中边的数组};2)功能模块设计(如主程序模块设计)int funcchoice()//系统功能选择页面{int choice;cout<<"=============================================================="<<endl;cout<<" 欢迎进入校园导游咨询平台"<<endl;cout<<" 1--显示校园所有景点信息"<<endl;cout<<" 2--查询校园景点信息"<<endl;cout<<" 3--问路查询系统"<<endl;cout<<" 4--退出导游资讯平台"<<endl;cout<<"=============================================================="<<endl;cout<<"请输入要选择的功能号:";cin>>choice;return choice;}3)模块层次调用关系图五、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
==============以下为guide.cpp文件中对guide.h文件中类的所有成员函数的定义等==============#include<iostream>#include<iomanip>#include"guide.h"using namespace std;template <class T>MGraph<T>::MGraph()//a[]为景点代号,b[]为景点名称,c[]为景点信息,d[]为景点方位信息的横坐标,e[]为景点方位信息的纵坐标,s[]为存放景点邻接矩阵信息的一维数组,根据其对称性可以用公式赋值给二维数组arc[][]{i nt s[]={0,1,0,0,2,0,0,0,2,0,0,0,2,3,0,0,0,0,4,2,0,0,0,0,0,2,3,0,0,0,0,0,2,3,1,0,0,0,2,0,2,0,0,2,0,4,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,2,0};i nta[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17};c har* b[]={"南门","实验楼","南图","大活","cout<<"-->"<<adjlist[item1].vexname;}c out<<endl;c out<<"\n=====================================================\n";}========================以下为main.cpp文件中主函数的实现========================== #include<iostream>#include"guide.cpp"using namespace std;int funcchoice()//系统功能选择页面{i nt choice;c out<<"=============================================================="<<endl;c out<<" 欢迎进入校园导游咨询平台"<<endl;c out<<" 1--显示校园所有景点信息"<<endl;c out<<" 2--查询校园景点信息"<<endl;c out<<" 3--问路查询系统"<<endl;c out<<" 4--退出导游资讯平台"<<endl;c out<<"=============================================================="<<endl;c out<<"请输入要选择的功能号:";c in>>choice;r eturn choice;}void main(){M Graph<char*> mg;i nt funcchoice();i nt fc;w hile(1) {fc=funcchoice();if(fc==1){int i;for(i=0;i<mg.vertexNum;i++)mg.printvexinf(i);}else if(fc==2){int i;六、调试分析遇到的问题及解决的办法:在调试过程中,最常见到的问题有以下几种:1、忘记调用函数类模块template<class T>,有些类中或者函数中涉及函数类模块的调用,但忘记标注会导致编译错误。