校园导游图系统数据结构实验报告

合集下载

校园导游数据结构实训报告

校园导游数据结构实训报告

一、引言随着信息技术的飞速发展,数据结构在计算机科学中的应用越来越广泛。

为了更好地理解和掌握数据结构的相关知识,我们开展了校园导游数据结构的实训项目。

本项目旨在通过设计一个校园导游系统,将数据结构的知识应用于实际场景,提高我们的编程能力和问题解决能力。

二、项目背景与目标1. 项目背景随着我国高等教育的快速发展,校园规模不断扩大,校园内景点繁多,对于新到校的学生或访客来说,了解校园景点和路线信息成为一个难题。

传统的校园导游方式,如人工导游,不仅效率低下,而且成本较高。

因此,设计一个校园导游系统,为访客提供便捷、高效的信息查询服务,具有重要的现实意义。

2. 项目目标本项目旨在设计并实现一个校园导游系统,实现以下功能:(1)展示校园平面图,以图形化的方式展示校园景点和路线信息。

(2)提供景点信息查询,包括景点名称、代号、简介等。

(3)提供路线查询,包括任意两个景点之间的最短路径、路径长度等。

(4)提供景点搜索,支持按名称或代号搜索景点信息。

三、系统设计1. 系统架构本项目采用分层架构,包括以下层次:(1)表示层:负责展示校园平面图和景点信息。

(2)业务逻辑层:负责处理用户请求,包括景点信息查询、路线查询等。

(3)数据访问层:负责与数据库进行交互,实现数据持久化。

2. 数据结构设计本项目采用以下数据结构:(1)图结构:用于表示校园平面图,其中顶点表示景点,边表示景点之间的路径。

(2)邻接矩阵:用于存储图结构中各景点之间的路径长度。

(3)链表:用于存储景点信息,包括景点名称、代号、简介等。

3. 算法设计本项目采用以下算法:(1)Dijkstra算法:用于求解任意两个景点之间的最短路径。

(2)BFS算法:用于实现景点搜索功能。

四、系统实现1. 界面设计系统界面采用简洁、美观的设计风格,主要包括以下部分:(1)校园平面图显示区域。

(2)景点信息显示区域。

(3)搜索框。

(4)功能按钮。

2. 功能实现(1)展示校园平面图:根据校园实际布局,绘制校园平面图,并将各景点以图形化的方式展示在界面上。

校园导游系统 实验报告

校园导游系统 实验报告

校园导游系统实验报告校园导游系统实验报告1. 引言在现代高校中,校园导游系统作为一种重要的信息化工具,被广泛应用于校园导览、活动推广等方面。

本实验旨在设计一个校园导游系统,通过实际操作和用户反馈,评估其功能和可用性。

2. 实验设计与方法2.1 系统设计本实验采用Web应用程序作为校园导游系统的开发平台,采用HTML、CSS、JavaScript等前端技术,以及PHP、MySQL等后端技术进行系统设计与开发。

2.2 实验对象实验对象为本校学生,共计50人。

实验过程中,将收集用户对系统功能、界面设计、易用性等方面的反馈。

2.3 实验步骤a) 系统功能测试:用户通过系统进行校园导览,测试系统的导航、搜索、展示等功能。

b) 界面设计评估:用户评估系统的界面设计是否美观、直观,并提出改进建议。

c) 易用性测试:用户完成一系列任务,评估系统的易用性和用户体验。

3. 实验结果与分析3.1 系统功能测试结果在系统功能测试中,用户普遍认为系统的导航功能准确、搜索功能便捷,展示内容详细且易于理解。

然而,部分用户反映系统在室内导航方面存在一定的不准确性。

3.2 界面设计评估结果用户对系统的界面设计普遍评价良好,认为界面美观、直观。

然而,少数用户认为系统的颜色搭配不够舒适,建议增加自定义主题功能。

3.3 易用性测试结果用户在易用性测试中完成任务的平均时间为10分钟,任务完成率达到90%以上。

用户普遍认为系统的操作流程清晰,易于上手。

然而,部分用户认为系统的某些功能按钮位置不够显眼,建议进行调整。

4. 结论与建议本实验设计的校园导游系统在功能、界面设计和易用性方面均获得了较好的评价。

然而,仍存在一些问题和改进空间。

针对室内导航不准确的问题,可以考虑引入更精确的定位技术。

针对界面设计的改进建议,可以增加自定义主题功能和调整按钮位置。

此外,还可以进一步完善系统的互动性,增加用户评论、分享等功能,提升用户参与度。

5. 实验总结通过本实验,我们深入了解了校园导游系统的设计与开发过程,并对其功能和可用性进行了评估。

数据结构试验报告校园导游

数据结构试验报告校园导游

《数据结构》课程设计报告课程名称:《数据结构课程设计》;课程设计题目:校园导游查询;姓名:张晓艺;院系:计算机学院;专业:数字媒体技术;年级:大二;学号:10054220 ;指导教师:王立波;2011 年12 月17 日1 课程设计的目的 (x)2 需求分析 (x)3 课程设计报告内容 (x)1、概要设计 (x)2、详细设计 (x)3、调试分析 (x)4、用户手册 (x)5、测试结果 (x)6、程序清单 (x)4 小结5 参考文献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 )首先我画了学校主要几个景点的分布图以及自己定的一些距离,图如下:struct Date{int num; char n ame[50]; char in troduce[100]; };(3 )然后我定义了一个类,定义如下:class Travel {private:Date date[15]; int dista nce[15][15]; int Path[15][15];int ShortestDista nce[15][15]; void Floyd(); public:Travel(); ~Travel(){}void In troduce(i nt); void Sca nf();void ShortDista nce(i nt,i nt); }; (4)基本操作: void Floyd();8C2030202010⑦①④(2 )接着我定义了一个顶点结构体,定义如下:II 景点编号//景点名称 II 景点介绍IIFloyd 算法,计算最短路径和最短距离Travel 。

校园导游系统数据结构实习报告

校园导游系统数据结构实习报告

校园导游系统数据结构实习报告校园导游系统数据结构实习报告一、引言随着信息技术的快速发展,数字化校园已成为许多学校的重要建设目标。

其中,校园导游系统作为数字化校园的一部分,对于提高校园文化氛围,方便新生和游客游览校园,增强校园归属感起到了重要作用。

在这次实习中,我们的主要任务是设计和实现一个校园导游系统,采用数据结构技术对校园地图进行建模和优化,以提供高效、便捷的导游服务。

二、系统设计1、数据结构选择:考虑到校园地图的复杂性,我们采用了图(Graph)作为基础数据结构。

图是由节点(顶点)和边组成的集合,可以很好地表示校园中各个地点之间的连接关系。

2、地图表示:我们将校园地图转化为图,其中每个地点对应一个节点,地点之间的路径对应边。

为了更准确地表示实际环境,我们使用了带权重的边,权重表示路径的长度或美观度。

3、导游路径规划:我们使用了最短路径算法,如Dijkstra算法和A*算法,来规划最佳游览路径。

用户可以在系统中设定起点和终点,系统会根据图中的边和权重计算出最短路径。

4、语音导航:系统可以通过用户的手机实时获取位置信息,并使用TTS(Text-to-Speech)技术将规划的路径转化为语音提示,方便用户边听边走。

5、数据库设计:我们设计了一个关系型数据库,用于存储校园地图信息、用户信息等。

通过使用索引和查询优化技术,提高了系统性能。

三、系统实现1、环境配置:我们使用了Python语言和相关的数据结构库来实现系统。

开发环境为Windows 10操作系统,数据库采用了MySQL。

2、代码实现:我们对Python语言和相关库进行了深入学习,掌握了图算法的实现方法。

在实现过程中,我们遇到了一些问题,如最短路径算法的优化、语音导航的实时性等。

通过查阅资料、讨论和实践,我们成功解决了这些问题。

3、测试与调试:我们对系统进行了全面的测试,包括单元测试、集成测试和系统测试。

在测试过程中,我们发现并修复了一些bug,提高了系统的稳定性和可靠性。

校园导游实验报告

校园导游实验报告

一:设计目的1.进一步掌握图的存储,建立和遍历。

2.掌握弗洛伊德算法和迪杰斯特拉算法完成最短路径的有关问题。

3.文件的读写操作的练习与使用。

4.提供校园导游的实用地图。

二. 设计内容1.以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。

2.为来访客人提供图中任意景点相关信息的查询。

3.为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

三.概要设计1.功能模块图2.各个模块详细的功能描述。

1.CreateGraph()---从文件中读出景点的信息,并创建无向图。

2.graph()---显示校园平面图,方便游客进行查询。

3.find()---查询任意景点的详细信息。

4.BrowsePath()---迪杰斯特拉算法,用于实现目前所在点到任意一景点的最短路径。

5.ShortestPath()---弗洛伊德算法,用于实现任意两景点间最短路径。

6.main_menu(),secord_menu()---用于实现菜单的显示并接受输入选择。

显示地图及 主菜单任一景点信息的查询任意两点之间的最短路径从某一点到其余任一点的最短路径四.详细设计1.功能函数的调用关系图2.各功能函数的数据流程图main 函数CreateGraph()main_me nu()函数find()函数graph()函数ShortestPath()BrowsePath()secord_menu()函数文件中3.重点设计及编码<1>.查询功能的实现。

while(ch<0||ch>=G .vexnum) { printf("\n\t 你所输入的景点编号不存在!\n"); printf("请重新输入:"); scanf("%d",&ch); } for(i=0;i<G .vexnum;i++) { if(i==ch) printf("\n %s %s",G .vexs[i].name,G .vexs[i].introduction); } printf("\n\n 是否继续查询(Y/N)"); getchar();<2>.从文件中读取信息并储存到图的结构体数组中。

数据结构(C语言版)实验报告 (校园导游咨询)

数据结构(C语言版)实验报告 (校园导游咨询)

《数据结构与算法》实验报告一、需求分析【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】(1)设计你所在学校的校园平面图,所含景点不少于10个。

以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。

【测试数据】由读者根据实际情况指定。

【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。

顶点和边均含有相关信息。

【选作内容】(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。

二、概要设计1)抽象数据类型定义描述#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)模块层次调用关系图三、详细设计//程序的头文件#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 nt a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};c har* b[]={"南门","实验楼","南图","大活","睿思楼","大礼堂","南4教","知行楼","国交楼","南3教","南2教","南1教","北图","北3教","北4教","北2教","北1教","北门"};c har* c[]={"南校区正门","物理实验楼","南校区图书馆","大学生活动中心","教师办公楼、医务室及留学生公寓","大礼堂,用于举办各种文艺演出","南校区第4教学楼","实习基地,计算机房等","国际交流中心,教职工餐厅","南校区第3教学楼","南校区第2教学楼","南校区第1教学楼","北校区图书馆","北校区第3教学楼","北校区第4教学楼","北校区第2教学楼","北校区第1教学楼","北校区正门"};i nt d[]={8,6,4,4,1,0,0,1,3,4,6,8,4,3,2,3,5,8};i nt e[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2};i nt i,j;v ertexNum=18;a rcNum=30;f or(i=0;i<vertexNum;i++){adjlist[i].vex=a[i];adjlist[i].vexname=b[i];adjlist[i].vexinf=c[i];adjlist[i].dir.ln=d[i];adjlist[i].dir.col=e[i];}f or (i=0; i<vertexNum; i++)//初始化邻接矩阵for (j=0; j<vertexNum; j++)arc[i][j]=arc[j][i]=s[(i*(i+1))/2+j]; //根据s[]的对称性,将一维数组中的数据赋给二维数组arc[][]}template<class T>void MGraph<T>::printvexname(){i nt i;f or(i=0;i<vertexNum;i++)cout<<adjlist[i].vex<<" "<<adjlist[i].vexname<<endl;;}template<class T>void MGraph<T>::printvexinf(int i){c out<<i<<" "<<adjlist[i].vexname<<":"<<adjlist[i].vexinf<<endl;}template<class T>void MGraph<T>::printdir(int i,int j){i nt dx,nb;//临时存放i与j之间的南北东西关系 j在i的哪边??d x=adjlist[j].dir.col-adjlist[i].dir.col;n b=adjlist[j].dir.ln-adjlist[i].dir.ln;i f(dx>0)//即j在i的东边cout<<"向东"<<dx*100<<"m,";e lsecout<<"向西"<<dx*(0-100)<<"m,";i f(nb>0)//即j在i的南边cout<<"向南"<<nb*100<<"m";e lsecout<<"向北"<<nb*(0-100)<<"m";}template<class T>void MGraph<T>::Root(int p,int q){i f (Path[p][q]>0){Root(p,Path[p][q]);Root(Path[p][q],q);}e lse{Line[kkk]=q;kkk++;}}template<class T>void MGraph<T>::printroad(int i,int j){i nt p,q,m,k,item1,item2;f or(p=0;p<vertexNum;p++)for(q=0;q<vertexNum;q++)Dist[p][q]=arc[p][q];//邻接矩阵赋值f or(k=0;k<vertexNum;k++)for(p=0;p<vertexNum;p++)if (Dist[p][k]>0)for(q=0;q<vertexNum;q++)if (Dist[k][q]>0)if (((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q)){Dist[p][q]=Dist[p][k]+Dist[k][q];Path[p][q]=k;}c out<<"\n=====================================================\n";c out<<"从"<<adjlist[i].vexname<<"到"<<adjlist[j].vexname<<"的最短路径为:"<<endl;c out<<adjlist[i].vexname;k kk=2;R oot(i,j);i tem2=Line[2];c out<<"-->";p rintdir(i,item2);c out<<"-->"<<adjlist[item2].vexname;f or(m=3;m<=kkk-1;m++){item1=Line[m];cout<<"-->";printdir(item1-1,item1);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;mg.printvexname();cout<<endl<<"请输入所要查询景点代号:";cin>>i;mg.printvexinf(i);}else if(fc==3){int i,j;mg.printvexname();cout<<"请输入两景点代号(我们将把最短路线反馈予您):";cin>>i>>j;mg.printroad(i,j);}else if(fc==4)break;elsecout<<"输入有误,请重新输入!"<<endl;}}if调试分析遇到的问题及解决的办法:在调试过程中,最常见到的问题有以下几种:1、忘记调用函数类模块template<class T>,有些类中或者函数中涉及函数类模块的调用,但忘记标注会导致编译错误。

西安邮电大学-(数据结构)校园导游系统课程教学设计报告

西安邮电大学-(数据结构)校园导游系统课程教学设计报告

西安郵電大學数据结构课程设计报告书崔斌专业名称 计算机科学与技术专业计科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()的''后面不加第一个空格也可以。

数据结构实验报告(校园导游咨询)

数据结构实验报告(校园导游咨询)

软件学院学生实验报告册实验课程名称:数据结构与算法实验项目名称:校园导游咨询实验类型(打√):(基础、综合、设计√)院系:信息工程学院计算机系专业:*****姓名:*** 学号:*****指导老师:***软件学院教务处编制一、实验预习报告内容二、实验原始(数据)记录实验时间: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');}。

校园导游系统数据结构图

校园导游系统数据结构图

西安郵電學院数据结构实验报告题目:校园导游系统院系名称:计算机学院专业名称:计算机科学与技术班级:1006学生姓名: ****学号(8位):*****指导教师:******设计起止时间:2011年12月12日~2011年12月16日一. 题目要求1、设计学校的校园平面图,地点(地点名称、地点介绍)不少于10个。

2、提供图中任意地点相关信息的查询。

3、提供图中任意地点的问路查询:1)任意两个地点之间的一条最短(中转最少)的简单路径;2)任意两个景点的最佳访问路线(带权)查询;3)任意两个地点之间的所有路径。

4、地点和道路的扩充以及撤销;地点基本信息的文件存储。

(附加:加分题)二.概要设计1.功能模块的调用关系图2.各个模块详细的功能描述。

1.首先,main()函数调用loge()函数,输出欢迎界面,然后调用showmenu()函数来选择用户所要进行的操作。

其中showmenu()函数就是一个菜单供使用者来选择他所要进行的相关操作,比如信息的查询,最短路径查询之类。

2.browser()函数,用于输出校园平面图,给用户提供校园的景点分布状况,方便用户选择景点参观。

3.Search()函数,用于查询用户所选的景点信息,用户需要输入要查询的景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出该景点的相关信息,包括景点名字,景点的相关介绍,否则返回重新输入。

4.SearchAllpath()函数,用于查询用户所选的任意两个景点间的所有路径,用户需要输入要查询的起始景点编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的所有路径,否则返回重新输入。

函数使用深度遍历DeepFirstSeach()查找路径。

5.Wellway()函数,用于查询用户所选的任意两个景点间的最短路径,用户需要输入要查询的起始景点编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的最短路径,否则返回重新输入。

校园导游图系统数据结构实验报告

校园导游图系统数据结构实验报告
3.选择出发点和目的地:用户输入一个出发点和一个目的地编号,采用弗洛伊德算法求出发点到目的地的最短路径
4.查看景点信息:直接用编号进行单个景点查询。
四.详细设计
重点设计及编码
在求最短路径时采用迪杰斯特拉算法
//迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点
void ShortestPath_DIJ(MGraph * G)
(1)将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,
边上的权值表示距离.为此图选择适当的数据结构。
(2)把各种路径都显示给游客,由游客自己选择浏览路线。
(3)画出景点分布图于屏幕上。
[实现提示]
(1)构造一个无向图G并用邻接矩阵来存储。
(2)利用迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径用二维数组p[i][]来记录,
if(D[v]<INFINITY)
{p[v][v0]=1;p[v][v]=1;} //v0到v有边相连,修改p[v][v0]的值为1
}//各顶点自己到自己要连通
D[v0]=0; //自己到自己的权值设为0
final[v0]=1; //v0的访问标志设为1,v属于s集
for(i=1;i<G->vexnum;i++) //对其余g.vexnum-1个顶点w,依次求v到w的最短路径
}
for(v=0;v<G->vexnum;v++)
{
final[v]=0;//初始化各顶点访问标志
D[v]=G->arcs[v0][v].adj; //v0到各顶点v的权值赋值给d[v]
for(w=0;w<G->vexnum;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0

校园导游系统 数据结构实习报告

校园导游系统 数据结构实习报告

西安郵電學院数据结构设计报告题目:校园导游系统院系名称:计算机学院专业名称:计算机科学与技术班级:学生姓名:学号(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.改进方案整个代码只是完成了基本的要求,并没用完成扩充的问题,对于文件没用完成,以及添加删除路径也没有进行编写,而且在查找方式中,只是进行了编号查询。

校园导游实验报告——数据结构

校园导游实验报告——数据结构

校园导游实验报告——数据结构校园导游实验报告——数据结构一、引言在校园导游系统中,数据结构起着至关重要的作用。

本实验报告旨在详细描述我们设计和实现校园导游系统时所采用的数据结构,并分析其在系统中的应用。

二、问题定义在校园导游系统中的问题定义如下:1·设计一个能够记录校园景点信息的数据库。

2·实现一个能够根据用户需求提供推荐路线的算法。

3·开发一个用户界面,方便用户进行导游操作。

三、数据结构设计1·数据库设计●景点信息表:包括景点名称、位置、介绍等字段。

●路线信息表:包括起点、终点、路径、长度等字段。

●用户信息表:包括用户ID、喜好景点等字段。

2·算法设计●图的表示:使用邻接矩阵或邻接表来表示校园景点之间的关系。

●最短路径算法:采用Dijkstra或Floyd-Warshall算法来计算两个景点之间的最短路径。

●推荐算法:根据用户喜好景点和景点之间的关系,应用基于用户的协同过滤算法或基于内容的推荐算法来为用户推荐最佳路线。

四、系统实现1·技术选型:选择合适的编程语言和开发框架。

2·数据库创建:根据设计的数据库结构,创建相应的表格。

3·数据导入:将校园景点信息导入数据库中。

4·界面设计:开发用户友好的界面,实现用户导游操作功能。

5·算法实现:根据设计的算法,编写相应的代码。

6·系统集成:将界面和算法进行整合,确保系统正常运行。

五、结果分析在我们的实验中,校园导游系统表现出了良好的性能和有效的导游功能。

用户可以根据自己的喜好景点,快速找到最佳的路线,并享受愉快的导游体验。

六、总结与展望通过本次实验,我们掌握了校园导游系统的设计与实现方法,熟悉了数据结构在系统中的重要性。

我们将继续改进和完善系统功能,提升用户体验。

附件:1·数据库表结构图2·系统界面截图3·算法实现代码法律名词及注释:1·数据库:指结构化数据的集合,按照一定规范组织、存储和管理的系统。

校园导游系统 数据结构实习报告

校园导游系统 数据结构实习报告

校园导游系统数据结构实习报告在当今数字化的时代,校园导游系统对于提升校园的服务质量和访客体验具有重要意义。

本次数据结构实习,我致力于开发一个实用的校园导游系统,通过运用所学的数据结构知识,实现了系统的核心功能,并对整个开发过程进行了深入的总结和反思。

一、系统需求分析校园导游系统旨在为访客提供便捷的校园导航服务,帮助他们快速了解校园布局、建筑物位置以及相关设施信息。

具体需求包括:1、校园地图的构建与展示:能够清晰呈现校园的地理布局,包括建筑物、道路、绿地等。

2、地点查询功能:访客可以输入目标地点,系统能够快速定位并提供导航路径。

3、周边设施查询:如餐厅、图书馆、停车场等,方便访客了解周边服务设施。

二、数据结构选择为了实现上述功能,需要选择合适的数据结构来存储和管理校园信息。

经过分析,我选用了以下几种数据结构:1、图结构用图来表示校园的地理布局,将建筑物和道路视为图的顶点和边。

可以使用邻接矩阵或邻接表来存储图的关系,便于进行路径搜索和遍历。

2、哈希表用于快速查找地点和设施的信息,提高查询效率。

3、链表存储导航路径,方便进行路径的添加和删除操作。

三、系统功能实现1、地图构建首先,对校园进行实地考察,收集建筑物和道路的位置信息。

然后,将这些信息转化为图的顶点和边,并建立相应的邻接关系。

2、地点查询当访客输入地点名称时,通过哈希表快速定位到对应的顶点。

接着,使用图的搜索算法(如迪杰斯特拉算法)计算从当前位置到目标位置的最短路径。

3、周边设施查询为每个设施建立相应的标识,并在哈希表中存储设施的位置和相关信息。

根据访客的当前位置,搜索附近一定范围内的设施。

四、系统界面设计为了提供友好的用户体验,设计了简洁直观的系统界面。

界面主要包括以下几个部分:1、地图展示区以图形化的方式展示校园地图,标注出建筑物和道路。

2、查询输入框访客可以在此输入地点或设施名称进行查询。

3、结果显示区显示查询结果,包括目标地点的位置、导航路径以及周边设施信息。

数据结构试验报告—导游图

数据结构试验报告—导游图

实验报告:导游图姓名:石栋伟班级:计师一班学号:222013321081006一、需求分析:1.从全国选取各个省份的省份城市作为旅游景点,抽象成为一个无向带权图。

以途中的顶点作为旅游景点,边上的权值表示两地之间的距离。

同时,本程序还可以为用户提供旅游景点的信息。

2.本程序的目的是为用户提供路径咨询。

根据用户指定的起点和终点输出相应的路径已经之间的距离。

3.为用户提供图中任意景点的路径查询,即查询任意两个景点之间的最短简单路径。

当用户输入正确时,为用户输出任意两景点的最短路径;当用户输入不合法时,提示用户输入有误并返回让用户重新输入。

4.测试数据(附后)二、概要设计:1.抽象数据类型图的定义如下:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。

数据关系R:R={VR}VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在路径}基本操作P:CreatGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中边的集合。

操作结果:按V和VR的定义构造图G。

DestroyGraph(&G)初始条件:图G存在。

操作结果:销毁图G。

LocateVex(G,u)初始条件:图G存在,u和G中顶点有相同特征。

操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其他信息。

GetVex(G,v)初始条件:图G存在,v是G中某个顶点。

操作结果:返回v的信息。

FirstEdge(G,v)初始条件:图G存在,v是G中某个顶点。

操作结果:返回依附于v的第一条边。

若该顶点在G中没有邻接点,则返回“空”。

NextEdge(G,v,w)初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。

操作结果:返回依附于v的(相对于w的)下一条边。

若不存在,则返回“空”。

InsertVex7(&G,v) 初始条件:图G存在,v和图中顶点有相同特征。

操作结果:在图中增添新顶点v。

数据结构实验四图的应用-校园导游

数据结构实验四图的应用-校园导游

栅格地图
将校园地图划分为若干个栅格,每个 栅格表示一定的地理范围,可以快速 进行地图的渲染和展示。
04
实现校园导游系统
系统架构设计
架构概述
本系统采用客户端-服务器架构, 分为前端和后端两部分。前端负 责展示校园地图和导航信息,后 端负责处理用户请求、路径搜索
和地图数据存储。
前后端交互
前后端通过API进行数据交换, 前端发送用户请求(起点和终 点),后端返回路径信息和导航
提示。
数据存储
使用关系型数据库存储校园地图 数据、路径信息和用户信息。
路径搜索算法实现
算法选择
采用Dijkstra算法实现路径搜索,该算法能够在加权图中找到从起点到终点的最短路径。
算法流程
初始化距离数组,将起点到各节点的距离设为0,其他节点距离设为无穷大;遍历未访问节点, 找到距离最小的节点,更新其相邻节点的距离;重复上述步骤直到所有节点都被访问。
图的应用
通过构建图的数据结构,可以方便地实现校园导航、路径查询、最短路径计算 等功能,提高校园内人员流动的效率和便利性。
实验目的
1 2
掌握图的基本概念和数据结构
通过实验,学生将深入了解图的基本概念、表示 方法和相关数据结构,如邻接矩阵和邻接表。
实现校园导航系统
学生将利用所学知识,构建一个校园导航系统, 实现地点查询、路径规划和最短路径计算等功能。
错误处理
测试了系统在异常情况下的表现,如输入错误、网络中断等,并优 化了错误处理机制。
性能评估
响应时间
评估了系统在不同负载下的响应时间,确保系统 能够快速响应用户操作。
稳定性
测试了系统在高负载下的稳定性,确保系统在高 并发情况下不会崩溃。

校园导游实验报告——数据结构(2023最新版)

校园导游实验报告——数据结构(2023最新版)

校园导游实验报告——数据结构校园导游实验报告——数据结构⒈引言本实验旨在通过设计和实现一个校园导游系统,运用数据结构的相关知识,解决校园导游中的路径规划和信息查询等问题。

通过该实验,掌握数据结构在实际问题中的应用,并提高对数据结构的理解和运用能力。

⒉实验目的⑴理解和掌握树结构的概念和基本操作。

⑵掌握图的存储结构和常用算法。

⑶学习使用数据结构解决实际问题。

⑷提高编程能力和团队合作能力。

⒊实验任务⑴设计一个数据结构,用于表示校园地图的各个景点和路径关系。

⑵实现校园导游系统,包括路径规划和信息查询功能。

⑶对系统进行测试和性能优化。

⒋实验步骤⑴根据校园地图,设计合适的数据结构,包括景点、路径和导游系统等。

⒋⑴景点:定义景点的属性,包括名称、位置、介绍等。

⒋⑵路径:定义路径的属性,包括起始点、终点、距离等。

⒋⑶导游系统:定义导游系统的功能,包括路径规划和景点信息查询等。

⑵实现校园导游系统的核心功能。

⒋⑴路径规划:根据用户输入的起始点和终点,使用图的遍历算法,寻找最短路径。

⒋⑵景点信息查询:根据用户输入的景点名称,查询并展示景点的详细信息。

⑶对导游系统进行完整性测试和性能优化。

⒋⑴测试导游系统的各个功能模块,确保无误。

⒋⑵针对导游系统的性能瓶颈,进行分析和优化,提高系统响应速度和稳定性。

⒌实验结果与分析⑴校园导游系统实现了路径规划和景点信息查询的功能。

⑵经过完整性测试,系统的各个功能模块均正常运行,没有明显的错误。

⑶对导游系统的性能进行优化后,系统响应速度明显提升,用户体验更加良好。

⒍实验总结通过本次实验,我们深入理解了数据结构的应用,并成功设计和实现了一个校园导游系统。

在实验过程中,我们不仅提高了编程能力,还增强了团队合作意识。

通过测试和优化,我们不断完善系统,使其达到了预期目标。

附件:⒈校园地图⒉系统设计文档⒊测试报告法律名词及注释:⒈数据结构:指描述数据元素之间相关关系的一种方式,包括逻辑结构和物理结构。

数据结构课程设计报告(校园导游系统)附有源代码(20191123003227)

数据结构课程设计报告(校园导游系统)附有源代码(20191123003227)

图 4.3.1 景点 2 红满堂信息查询
图 4.3.2 景点 7 竹园信息查询 4.4 任意两个景点间地最短路径
根据用户地需求 , 在用户输入了起点和终点后计算出最短路径是哪一条路径 . 以下举两个例子 . 第一个例子地起点是 5 东区运动场 , 终点是 1 校史馆 . 第二个例 子地起点是 2 红满堂 , 终点是 10 黑山运动场 . 运行结果如图 4.4.1 和图 4.4.2 所 示 . 83lcPA59W9
图 4.1 校园导游节目图 4.2 华农校园地图
校园地图地查看是通过抽象化 10 个景点来用 printf( > 输入选择 1 之后弹出地界面 , 运行结果如图 4.2. HbmVN777sL
函数输出地图 , 在
图 4.2 抽象化地华南农业大学校园导游地图 4.3 景点地相关信息查询
景点地相关信息查询是通过 information( > 函数来调用输出地 , 在主菜单 那输入 2 之后 , 拿第 2 个景点红满堂和第 7 个景点竹园来当例子 , 第运行结果如 图 4.3.1 和图 4.3.2. V7l4jRB8Hs
2.2 输出 dist[j] 和 path[j] ;
2.3 修改数组 dist 和 path 。
2.4 将顶点 vk 添加到数组 s 中;
3. 系统流程
3.1 系统地简单说明 1. 创建校园图: <1)先手工画好华农地 10 个景点地草图 , 再用 C++语言输出抽象化地校园
地图 . <2)再用 C++语言定义节点个数 N,编写函数 name( >为景点赋值各类信息
为空串 . 1nowfTG4KI
数组 s[n] :存放源点和已经生成地终点 <即集合 S), 初态为只有一个源点 v.

校园导游系统实验报告(3篇)

校园导游系统实验报告(3篇)

第1篇一、实验背景随着科技的发展,信息化、智能化已成为现代社会的重要特征。

为了更好地服务广大师生和游客,提高校园游览体验,本实验旨在设计并实现一个校园导游系统。

该系统将利用现代信息技术,为游客提供便捷、高效的校园游览服务。

二、实验目的1. 熟悉并掌握面向对象编程技术,提高编程能力;2. 了解和掌握图数据结构及其应用;3. 熟悉并掌握弗洛伊德算法,实现最短路径求解;4. 培养团队协作和沟通能力。

三、实验内容1. 系统需求分析本系统主要面向校园游客,提供以下功能:(1)查询景点信息:包括景点名称、代号、简介等;(2)查询景点间最短路径:支持任意两个景点间的最短路径查询;(3)添加、删除景点:允许管理员添加或删除景点;(4)修改景点信息:允许管理员修改景点名称、代号、简介等;(5)校园平面图展示:以图形化方式展示校园平面图,方便游客了解校园布局。

2. 系统设计(1)系统架构设计本系统采用分层架构,包括以下层次:- 表示层:负责用户界面展示,包括主界面、景点信息查询界面、路径查询界面等;- 业务逻辑层:负责实现系统功能,包括景点信息管理、路径查询等;- 数据访问层:负责数据存储和访问,包括景点信息表、路径信息表等;- 数据库层:负责存储系统数据,包括景点信息、路径信息等。

(2)数据结构设计本系统采用图数据结构表示校园平面图,包括以下数据结构:- 图结构(Graph):表示校园平面图,包括顶点集合和边集合;- 顶点(Vertex):表示校园内的景点,包含景点名称、代号、简介等信息;- 边(Edge):表示景点间的路径,包含起点、终点、路径长度等信息。

(3)算法设计本系统采用弗洛伊德算法实现最短路径查询。

弗洛伊德算法是一种求解图中所有顶点对之间最短路径的算法,其基本思想是通过逐步增加路径长度,找出所有顶点对之间的最短路径。

3. 系统实现(1)主界面设计主界面采用菜单栏、工具栏和状态栏等布局,方便用户操作。

菜单栏包括景点信息查询、路径查询、添加景点、删除景点等功能;工具栏提供快速访问常用功能;状态栏显示系统状态信息。

校园导游实验报告——数据结构

校园导游实验报告——数据结构

校园导游实验报告——数据结构
校园导游实验报告——数据结构
1.引言
- 简要介绍实验的目的和背景
- 阐述校园导游系统的重要性和应用价值
2.需求分析
- 分析校园导游系统的功能需求和性能要求
- 确定系统的基本模块,如地图显示、导航功能等
3.系统设计
3.1 数据结构设计
- 介绍选择的数据结构,如图、树、队列等的原因和优劣势
- 描述数据结构的组织方式和关键操作
3.2 界面设计
- 展示校园导游系统的用户界面设计
- 解释界面设计的考虑因素,如易用性、用户体验等
4.算法设计与实现
4.1 寻路算法设计
- 探讨常见的寻路算法,如Dijkstra算法、A算法等 - 选择适合校园导游系统的寻路算法,并解释原因
4.2 数据存储与交互
- 描述数据的存储方式,如数据库、文件等
- 分析数据的交互方式,如文件读写、网络传输等5.实验结果与分析
- 展示校园导游系统的功能演示和性能测试结果
- 对实验结果进行详细分析和解释
6.总结与展望
- 总结实验的目标是否达到,解决了哪些问题
- 展望校园导游系统的未来发展方向和改进空间
附件:
附件1:校园导游系统源代码
附件2:校园地图数据文件
附件3:实验中使用的测试数据集
法律名词及注释:
1.版权:指对作品享有的法律保护,包括复制权、发行权等。

2.私下使用:指在非商业、非公开场合下个人使用作品。

3.公共领域:指没有版权保护的作品,可供任何人使用。

4.许可证:指被授权人可以在指定条件下使用作品的文件或证明。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.改进方案
程序设计的不是很复杂,有的Bug没有修复,譬如,当输入景点编号为-1时,程序没有任何提示,也退不出系统;还有在功能方面,应该增加一项:路径的修改,这样就更便于管理改系统了,也就更方便用户使用。
2.体会
经过几周的课程设计,我学到了很多东西:巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。够按要求编写课程设计报告书,能正确阐述设计和实验结果,正确绘制系统和程序框图。通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。同时,通过这次课程设计我发现,我的数据结构基础不够扎实,有很多地方还需要继续努力。
2.查看景点信息:
3.输出两个景点间的最短路径:
2.异常测试数据及运行结果
1.当输出错误编号时程序没有反映,继续输入直到输入正确:
2.当查询两景点编号相同时的最短路径时,结果如下:
六.调试情况,设计技巧及体会
每当写完一个函数的时候,一编译会出现很多错误,当时的信息一下就没了,但怎么样还得继续做下去,就这样坚持着改错误,慢慢的发现其实很多是由于自己粗心造成的,别的错误改多了就习惯了。
{
min=INFINITY;
for(w=0;w<G->vexnum;w++)//在未被访问的顶点中,查找与v0最近的顶点v
if(!final[w])
if(D[w]<min)//v0到w (有边)的权值<min
{v=w;min=D[w];}
final[v]=1; //v的访问标志设置为1,v属于s集
for(w=0;w<G->vexnum;w++)//修改v0到其余各顶点w的最短路径权值d[w]
最短路径长度就用一维数组d[i]存放;i的范围:0~20。
(3)一维数组have[]是用来记录最短路径出现顶点的顺序。
(4)根据起点和终点输出最短路径和路径长度。
三.概要设计
1.功能模块图;
2.
1.浏览校园全景:采用深度遍历遍历图进行所有景点浏览,将遍历景点信息输出
2.查看所有游览路线:用户输入一个景点,采用迪杰斯特拉算法将从该景点起所有路径查出并输出在屏幕上
(1)将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,
边上的权值表示距离.为此图选择适当的数据结构。
(2)把各种路径都显示给游客,由游客自己选择浏览路线。
(3)画出景点分布图于屏幕上。
[实现提示]
(1)构造一个无向图G并用邻接矩阵来存储。
(2)利用迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径用二维数组p[i][]来记录,
if(D[v]<INFINITY)
{p[v][v0]=1;p[v][v]=1;} //v0到v有边相连,修改p[v][v0]的值为1
}//各顶点自己到自己要连通
D[v0]=0; //自己到自己的权值设为0
final[v0]=1; //v0的访问标志设为1,v属于s集
for(i=1;i<G->vexnum;i++) //对其余g.vexnum-1个顶点w,依次求v到w的最短路径
一. 设计目的
通过布置具有一定难度的实际程序设计项目,使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;使学生掌握分析问题,求解问题的方法并提高学生设计编程实现的能力。
二. 设计内容
用无向网表示学校的校园景点平面图,图中顶点表示主要景点,
}
for(v=0;v<G->vexnum;v++)
{
final[v]=0;//初始化各顶点访问标志
D[v]=G->arcs[v0][v].adj; //v0到各顶点v的权值赋值给d[v]
for(w=0;w<G->vexnum;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0
p[v][w]=0;
3.选择出发点和目的地:用户输入一个出发点和一个目的地编号,采用弗洛伊德算法求出发点到目的地的最短路径
4.查看景点信息:直接用编号进行单个景点查询。
四.详细设计
重点设计及编码
在求最短路径时采用迪杰斯特拉算法
//迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点
void ShortestPath_DIJ(MGraph * G)
课程设计是把我们所学的理论知识进行系统的总结并应用于实践的良好机会,有利于加强我们用知识理论来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良好的基础。
{
if(p[v][w]&&w!=v0) //若w是且w不等于v0,则输出该景点
printf("-->%s",G->vexs[w].name);
t++;
}
if(t>G->vexnum-1&&v0!=v)printf("总路线长%dm\n\n",D[v]);
}
}
五.测试数据及运行结果
1.正常测试数据
1.浏览校园全部景点信息:
while(flag)
{
printf("请输入一个起始景点编号:");
scanf("%d",&v0);
if(v0<0||v0>G->vexnቤተ መጻሕፍቲ ባይዱm)
{
printf("景点编号不存在!请重新输入景点编号:");
scanf("%d",&v0);
}
if(v0>=0&&v0<G->vexnum)
flag=0;
存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够回答有关景点介绍、游览路径等问题。游客通过终端可询问:
(1)从某一景点到另一景点的最短路径。
(2)游客从公园进入,选取一条最佳路线。
(3)使游客可以不重复地浏览各景点,最后回到出口(出口就在入口旁边)。
[基本要求]
if(!final[w]&&(min+G->arcs[v][w].adj<D[w])) //若w不属于s,且v到w有边相连
{
D[w]=min+G->arcs[v][w].adj; //修改v0到w的权值d[w]
for(x=0;x<G->vexnum;x++) //所有v0到v的最短路径上的顶点x,都是v0到w的最短路径上的顶点
p[w][x]=p[v][x];
p[w][w]=1;
}
}
for(v=0;v<G->vexnum;v++) //输出v0到其它顶点v的最短路径
{if(v0!=v)
printf("%s",G->vexs[v0].name); //输出景点v0的景点名
for(w=0;w<G->vexnum;w++) //对图中每个顶点w,试探w是否是v0到v的最短路径上的顶点
{ //迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]
//若p[v][w]为1,则w是从v0到v的最短路经上的顶点
//final[v]类型用于设置访问标志
int v,w,i,min, final[20], D[20], p[20][20],t=0,x,flag=1,v0; //vo为起始景点的编号
相关文档
最新文档