# UrbanHighwayNavigationSystem # 项目名称 城市公路导航系统 ``` 杨腾泽,刘鑫成,李培毅,孙英皓 ``` **摘要**:本项目针对什么问题,实现了哪些功能。为了有效地存储和处理何种数据,采用了何种数据结构。为了解决什么问题,采用了什么算法,算法效率如何。针对其他特定需求做了哪些工作。项目的整体效果如何,有何亮点和创新。 任务分工及完成情况。 | 任务 | 设计 | 开发 | 测试 | 文档 | | ---- | ---- | ---- | ---- | ---- | | 1. 系统分析 | 杨腾泽 | 杨腾泽 | 刘鑫成 | 杨腾泽 | | 2. 系统设计 | 团队 | 团队 | 孙英皓 | 杨腾泽 | 工作量占比。 | 杨腾泽 | 孙英皓 | 李培毅 | 刘鑫成 | |--------|-------|---------|-------| | 25 | 25 | 25 | 25 | # 1. 系统分析 ## 1.1 问题描述 设计一个城市公路导航系统,能够计算出省内及周边任意两个城市之间的导航路径及最短距离。选择一个合适的省份,省内及周边城市数量在 100 个左右(最少不低于 80 个)。查阅相关资料获取邻近城市之间的公路里程数据,建立导航地图。任意指定两个城市作为起点和终点,系统能够计算出两个城市之间的最短距离和导航路径。 (1)基于真实的公路地图数据建立导航地图模型,编制成格式简单的数据文件,包括城市名称,以及邻近城市之间的公路里程数。 (2)系统能够读取导航地图数据文件,建立地图模型,也能够将模型输出成地图数据文件,以便验证模型的正确性。 (3)通过人机交互的方式输入起点和终点城市名称,系统给出最短路径和导航路径上途径的城市名称。 (4)能够读取不同的导航地图进行功能测试。 要求系统运行正常、功能完整;数据结构使用得当,算法有较高的效率;代码规范、可读性高,结构清晰;具备一定的健壮性、可靠性和可维护性。 ## 1.2 可行性分析 地图可以用图结构建立模型,每个城市作为图中的一个顶点,城市之间的公路对应图中的边。给定起点和终点的条件下,可以利用最短路径算法求得导航路径。 真实的公路地图数据需要经过预先处理,编辑并保存成便于程序读取和处理的格式。在数据量比较大的情况下,要根据数据的特点采用合适的数据结构。 除了基于真实数据的测试,还可以采用小规模的模拟数据进行测试,以便验证算法的正确性。 明确解决问题的关键,核心数据结构,核心算法等。 确定解决问题的总体思路和方案。 ## 1.3 需求分析 ### (1)输入和输出 确定系统的主要输入和输出,如可以设定的参数,数据文件等,明确其主要作用。 ### (2)数据字典 地点 = 城市名 + 编号 + 地点介绍 + 弧边 ### (3)数据文件 系统中需要读取xx数据文件以获取xx数据,或者需要导出xx数据。举例说明xx数据文件的具体格式。 ### (4)参数设定 系统开始运行时,需要设置的参数。可以用户手册的形式给出设定参数的过程,如系统提示信息和用户输入等。 ### (5)XX功能 其他具体功能。 首先简要说明该功能的主要作用,可以用户手册的形式给出系统提示信息、用户输入和系统输出等。 ### (6)XX功能 其他功能逐项列出。 # 2. 系统设计 ## 2.1 概要设计 系统划分为几个模块,可以画模块图。 逐个说明每个模块的功能(输入、输出、做什么,这里不写怎么做)。 ## 2.2 数据结构设计 首先,分析对比几种可选的数据结构设计方案。如图可以采用邻接矩阵,也可以采用邻接表,表示集合可以用普通的查找表,还可以用不相交集。给出每一种设计方案的特点(优势、不足等)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 ### (1)xxx结构 给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。多个数据结构,逐一列出。 ### (2)xxx结构 给出核心数据结构的设计,包括文字描述和示意图。讲清楚数据是如何组织的。 ### ## 2.3 算法设计 首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 ### (1)XXX算法 给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。 ### (2)XXX算法 给出核心算法的设计,包括伪代码或流程图。 # 3. 系统实现 本次使用的程序语言为C++,开发工具为VScode。 介绍项目的文件结构,以及主要函数的功能。 ## 3.1 核心数据结构的实现 ```cpp typedef struct { int length;//边的长度,既两个地点之的长 int money; }ArcCell; //定义边的类型 typedef struct { int no; //顶点的编号 char sight[10]; //地点 char introduction[100]; //地点的介绍 }VertexType; //定义顶点的类型 typedef struct { int vexnum; //顶点数 int arcnum; //边数 VertexType vexs[NO]; //在图结构体中调用点的结构体 ArcCell arc[NO][NO]; //在图结构体中调用边的结构体 }MatGrath; ``` 对该数据结构的特点进行分析。 ## 3.2 核心算法的实现 ```cpp //Dijkstra算法 void Ppath(MatGrath &G,int path[],int w,int v) //前向递归查找路径上的顶点 { int k; k=path[w]; if (k==v) return; //找到了起点则返回 Ppath(G,path,k,v); //找顶点k的前一个顶点 printf("%s->",G.vexs[k].sight); //输出顶点k } int ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径 { int dist[MAXV],path[MAXV]; int s[MAXV]; int mindis,i,j,u; for (i=0; i",G.vexs[v].sight); //输出路径上的起点 Ppath(G,path,w,v); //输出路径上的中间点 printf("%s\n",G.vexs[w].sight); //输出路径上的终点 } if(s[w]==0) printf("从%d到%d不存在路径\n",v,w); } ``` 对该算法的时间和空间复杂度进行分析。 # 4. 系统测试 描述测试的思路和方法。比如,先用小数据量进行测试,再用真实数据进行测试。 测试应考虑到输入数据的特殊情况。 给出若干测试用例,包括输入、预期结果、运行结果或是否通过测试。运行结果和预期结果一致,为通过测试。 # 5. 总结 概况项目和完成情况。 遇到的问题和解决方法。 个人小结: 杨腾泽:通过这次数据结构课程设计,我对《数据结构》这门课程有了更深一步的了解,使我对《数据结构》这门课程掌握以及运用更加灵活·同时也让我发现了自已在这门课上的不足与缺陷,同时也明确了自己在以后的类似课程中的具体学习方法。 这次在应用中,我发现了自己的很多不足,在编写城市公路导航系统的过程中,自己C语言方面的只是掌握太少,很多功能需求只能退而求其次,一次又一 次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也 知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许 掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。 如此次对于邻接 矩阵的存储于读取,以及最短路算法的实现,两个及其重要的算法,狄克斯特算法和佛洛依德算法,在具体的应用上还是有很多不足 刘鑫成: 李培毅: 孙英皓: # 参考文献 [1] 严蔚敏, 吴伟民. 数据结构(C语言版). 北京: 清华大学出版社, 2007. [山东省国道里程表](http://www.onegreen.net/maps/HTML/50213.html)