当前位置:文档之家› 校园导航系统 数据结构课程设计 C++开发

校园导航系统 数据结构课程设计 C++开发

分类号编号华北***大学North China Institute of Water Conservancy andHydroelectric Power课程设计题目校园导航院系信息工程学院专业计算机科学与技术姓名******学号201117000指导教师*****2012年7月6 日目录1.需求分析 (1)1.1问题描述 (1)1.2课程设计目的 (1)1.3设计要求 (1)2.概要设计 (2)2.1任务定义 (2)2.2数据结构 (2)2.3 校园平面图展示 (2)2.4系统功能图 (4)3.详细设计 (4)3.1各个模块名称和功能 (4)3.2具体函数模块详解 (5)3.2.1校园平面图展示 (5)3.2.2任意两点的所有路径 (5)3.2.3校园基础设施介绍 (6)3.2.4指定两点间最短路径 (6)3.2.5单点到其他左右顶点间最短路径 (6)3.2.6华北水利水电学院简介 (7)3.2.7访客留言 (7)3.2.8浏览访客留言 (7)3.3 主要算法思想描述 (7)3.4各函数之间的调用关系示意图 (7)4.测试与分析 (8)4.1测试显示 (8)4.2调试分析 (12)4.2.1调试过程中遇到的问题与解决方案 (12)4.2.2算法的时空复杂度分析 (12)5.用户使用说明 (12)6.实验总结 (14)7.参考文献 (14)8.附件 (15)校园导航系统1.需求分析1.1问题描述我们熟悉一个地方的地形情况通常是借助于一张地图,通常的地图包含的信息十分的有限,而且具体到某一个建筑物,你不能了解到它的进一步的详细的情况。

因此,导航系统就应运而生了。

具体到本系统,作为用户浏览校园时,只拿着学校的地图是能够游遍全校,但是各建筑内部的情况就必须实地考察才能了解,既费时又费力。

有了我们的校园的导航系统,用户可以根据自己的需要,迅速找到所关心的地点,并且可以看到它的详细的信息。

1.2课程设计目的本课程设计的目的就是要达到理论与实际应用相结合,使我们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,培养程序设计技能如下:(1)了解并掌握数据结构算法的设计方法,具备初步的独立分析和设计能力;(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(3) 独立完成,提高运用所学的理论知识和方法独立分析和解决问题的能力;1.3设计要求设计一个校园导航系统,为来访的客人提供导航服务,具体要求:(1) 设计学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。

(2)以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息(3) 为来访客人提供图中任意景点相关信息的查询。

(4) 提供途中任意景点问路查询,即求任意两个景点间的一条最短的简单路径以及任意景点到其他所有景点的最短路径查询。

(5) 列出所有校内无重复排列的景点,将所有景点的距离以邻接矩阵的方式呈现给使用者,提供使用者选择功能界面,按照提示进行操作。

2.概要设计2.1任务定义本系统包含一个文件,设计分有菜单、显示信息、弗洛伊德算法、迪杰斯特拉算法,其中弗洛伊德算法是求两个景点之间距离最短的算法,同时在本系统中又添加一些新的功能,这些在模块分析中将介绍到,本系统的基本任务有1)设计校园平面图,在校园景点选10个左右景点。

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

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

3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径2.2数据结构class CNode //留言功能建立的类{ public:CNode(char *strMessage1,char *strTime1,int visited1);char strMessage[ID_LEN];char strTime[30];int visited;CNode *next;};class CList //建立链表,并保存链表的内容(留言的内容){public:void Save();void Load(); void Show();void InsertToLast(char* strMessage,char* strTime,int visited);CNode* Tail();private:CNode m_head;};typedef struct edgenode //声明邻接表所定义的结构体{ int adjvex; int value;struct edgenode *next;}ArcNode;typedef struct vexnode{ char data[15];ArcNode * firstarc;}VHeadNode;typedef struct{ VHeadNode adjlist[n];}AdjList2.3 校园平面图展示本课程设计的内容为“校园导航”,校园平面图中取华北水利水电学院的17个常去地点,在图中已标出主要路线,各路线的长度如图中所示,本系统的基本任务是设计你的学校的平面图,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径,为来访客人提供图中任意景点相关信息的查询,同时为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径,其平面图如下:2.4系统功能图图2 系统功能图3.详细设计3.1各个模块名称和功能本系统可以分为9个模块,每个模块实现了一种功能,同时每个模块中又有若干个函数构成,即各个模块的名称和实现的功能如下表:表1 模块功能略图3.2具体函数模块详解3.2.1校园平面图展示平面图展示包含的函数有show ()和MatToList(Graph &t,AdjList *&G),在show ()函数中调用MatToList(Graph &t,AdjList *&G),将初始化的邻接矩阵转换为邻接表,然后将邻接表显示在程序中,比较笼统地展示了校园的平面图。

3.2.2任意两点的所有路径该模块是新添的功能,在任意两点的所有路径模块中包含的函数有PathAll() , MatToList(Graph &t,AdjList *&G)和T_PathAll(AdjList *G,int u,int v,int l,int path[],int d),其中PathAll()是调用T_PathAll(AdjList *G,int u,int v,int l,int path[],int d),然后返回给主函数bool值,判断程序的下一步的操作,MatToList(Graph &t,AdjList *&G)是将邻接矩阵转化为邻接表,而本模块中最重要的函数是T_PathAll(AdjList *G,int u,int v,int l,int path[],int d)。

该函数核心代码是利用回溯的深度优先搜索方法,从定点u开始,进行深度优先搜索。

由于在搜索过程中,每个顶点只访问一次,所以这条路径必定是一条简单路径。

因此,只要在搜索过程中,需要把当前的搜索线路记录下来。

为了记录当前的搜索线路,设立一个数组path保存走过的路径,用d记录走过的长度。

若当前扫描到的结点u到结点v的长度不大于l,表示找到了一条路径,则输出路径path.3.2.3校园基础设施介绍该模块中的核心函数是Search(),其核心代码是此函数用于为用户提供相关信息的查询服务,本函数提供华北水利水电学院相关基础设施的查询服务。

用户只需输入相关的设施名称就能查询到相关的华北水利水电学院基础设施的相关信息。

3.2.4指定两点间最短路径本模块中包含的函数有shuangdian()和pointpath(Graph &t1,char cstart[],char cend[]),此函数为一辅助函数,该函数体中调用了pointpath(Graph &t1,char cstart[],char cend[]),实际上该函数的功能就是求出起始点到终点的最小路径,只不过为了更好在函数调用过程中理清各函数间的关系同时也是为了使界面设计过程中避免各基础函数代码冗余,从而引进该函数做辅助用。

本模块色核心函数是pointpath(Graph &t1,char cstart[],char cend[]),该函数核心代码为迪杰斯特拉算法,用以求任意两景点之间最短路径。

具体思想为设置并逐步扩充集合path,存放以求出的最短路劲的顶点,尚未确定最短路径的顶点放置在另一集合V中,按最短路径长度的递增顺序将V中的顶点加到path中,直到path中包含所有顶点。

实现过程中引入了一个辅助数组distance,它的每一个分量distance[i]表示当前找到的从原点到终点的最短路径的长度。

3.2.5单点到其他左右顶点间最短路径本模块在以狄克斯特拉为原型的基础上稍加改变,在采用狄克斯特拉算法时新增一个终点参数,在输出最小路径时不需要使用for循环将所有原点与其他顶点的路径信息输出,只需输出起点和终点两点间的最短距离即可。

本模块中包含的函数有dandian()和shortest_path(Graph &t,char csource[]),此函数为一辅助函数,该函数体中调用了shortest_path(Graph &t,char csource[]),实际上该函数的功能就是求出一点到其他所有点的最小路径,只不过为了更好在函数调用过程中理清各函数间的关系同时也是为了使界面设计过程中避免各基础函数代码冗余,从而引进该函数做辅助用。

单源最短路径采用狄克斯特拉算法,在集合s的初态只表包含顶点,当是s[i]为0时表示未找到源点到顶点的最短路径,当s[i]为1时表示已找到源点到顶点的最短距离,数组distance记录从源点到其他各顶点当前的最短距离,起初值为distance[i]=t.arcs[b][i](b为源顶点),从s之外的顶点集合中选择一个顶点,使distance[u]的值最小,于是从源点到达v只通过s中的顶点,把u加入集合s中调整distance中的记录从源点到每个顶点的距离:从原点的distance[j]和distance[u]+ t.arcs[u][j]中选择较小的值作为新的distance[j],重复上述过程,直到s 中包含其余各顶点的最短路径。

另外设置一个数组path[]用于保存最短路径长度,其中path[i]保存从源点到终点当前最短路径中的前一个顶点的景点名称,3.2.6华北水利水电学院简介该模块是新添的功能,在该模块中的核心函数是Intro(),其核心代码是输出华北水利水电学院的办学历史和发展状况,该模块比较简单,就不在这里赘述了!3.2.7访客留言该模块是新添的功能,在该模块中的核心函数是W(),在该函数中应用了文件,其目的是将历史记录保存下来,以供访客浏览,在该函数中遇到的问题是留言条数变量intV,如何让它真实的显示出来留言条数,我解决的办法是把变量intV也写入到文件中,在每次保存留言时读出该变量,使该变量加1,把留言写入到文件后,将重新把该变量写入到文件中,依次进行,这样就把留言写入到文件中,而留言记录也是正确的数值,同时留言时间是调用系统函数ctime(),这样访客留言就完成了。

相关主题