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

合集下载

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

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

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

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

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

二、项目背景与目标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');}。

  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为起始景点的编号
相关文档
最新文档