C/C++数据结构课设? 校园导航 基于easyX可视化 项目分析与总结

目录

前言(重要,不要跳过!)

项目分析

基础需求分析

逻辑结构分析

存储结构分析

创建无向图

初始化无向图

最短路径算法的分析及选取

基于文件流的简单文件的读写

进阶需求分析

总结与反思


前言(重要,不要跳过!)

首先,为什么会有这篇文章?我用了前前后后三个月学完了数据结构、C++也大概学了些,但是仅仅只是停留在知道、会用的阶段,并没有深入思考和理解,这样的学习对我而言是不踏实的,于是我还是想去做点东西出来,先不管这个东西是大是小,它一定是要让我有收获的,所以我在网上找了到【校园导航】的主题项目,有些学校把它当作课程设计,所以事先说明:这篇文章中不会展示代码,只提供大概的流程和思路,想抄答案、完成作业的可以划走了!

当然,如果您是一名渴望技术的计算机爱好者,不妨再往下看看我在这个项目中收获的经验总结,也欢迎指出错误、一起探讨。

再者,这个项目的适用人群?

在开始之前,还是要提一下这个项目:虽说是C++与数据结构的项目,但是需要用到的C++或是数据结构的知识涉及并不难,那么说这个项目就没有意义了吗?如果您是有一定项目经验并且对C++和数据结构有进一步思考与体会,那么答案是:是的;

但作为像我一样的初学者,尤其是对于潦草学习应付考试、甚至考研数据结构的同学来说帮助很大(我曾经见过一个要考研了连数据结构代码都不会写的、甚至还有对C++的映象仅停留于C加面向对象的),或者说这个项目是用来巩固C++和数据结构的部分知识,并且具体体会数据结构在实际中的应用场景。您可能会说那我刷LeetCode或者PAT甲级不一样也能学会吗,我的建议是:两者同样重要!况且刷题可不能积累项目经验。

同时这个项目开发周期较短,适合快进快出。


接下来,我会尽可能带您体验一套完整的项目流程:

项目分析

项目要求:

C++数据结构项目——缺德导航助手(名字我起的( • ̀ω•́ )✧)

【问题描述】

设计一个某大学校园地图,为新生提供各种服务信息查询服务。

【基本要求】

  1. 地图所含地点不少于12个。以图中顶点表示校内地点、代号、简介等信息;以边表示路径、存放路径长度等信息。
  2. 设计地图逻辑结构,用C/C++语言表示这种结构。
  3. 请用C/C++语言编写程序,为新生提供图中任意地点相关信息的查询,以及为新生提供图中任意地点之间的问路查询,即两点之间的一条最短路径(注:南北校区仅可通过地下长廊连接)。
  4. 使用初阶数据结构和算法,给出相应的算法设计、实现、时间复杂度分析。

【进阶要求】

  1. 设计简单的UI界面,并实现简单的交互功能。
  2. 设计地图的物理结构,并用图形可视化这种结构。
  3. 可以通过某个信息查询相对应的地点的相关信息。(模糊搜索)

【测试数据】

作为开发者:

  1. 输入校园内各地点地名和相关信息;
  2. 输入两相邻地点之间的路径长度;

作为使用者:

  1. 查询大同大学的任一地点信息;
  2. 查询两地点之间最短路径长度。

【实现提示】一般情况下,校园内道路是双向通行的,可设置校园平网是一个无向图。顶点和边均含有信息。

基础需求分析

逻辑结构分析

用加权无向图构建逻辑地图,将各个地点看做顶点,地点之间的路径看做边,设定路的长度看做是边的权值;

存储结构分析

用邻接矩阵matrix是最为方便存储无向图的结构,便于访问顶点,并且判断点与点之间是否存在边,方便访问边的权值;

除此之外还要存储各个地点的编号、名称、简介等相关信息,所以将它们封装成一个结构体vex;vex中具有名称、标号和简介三个成员变量,用vex[vexsnum]结构体(或类)数组存储地图中所有地点的基本信息;

用graph封装vex和matrix;

创建无向图

选择了17个校园内地点,分别为:

(编号由0到16)

机器人实验室、图书馆、北大门、医学院、天健体育场、明理楼、南大门、奥宇厅、清和苑10号楼、夏威夷操场、校医院、洗浴园、四小园、地下长廊A1A2B1B2。

(编号由0到28)

设置共29条边(无向边/权值:单位 十米)

A0机器人实验室——图书馆 25

A1机器人实验室——北大门 50

A2机器人实验室——医学院 90

A3机器人实验室——天健体育场 100

A4图书馆——北大门 25

A5北大门——通道A2 1

A6通道A2——医学院 75

A7医学院——天健体育场 2

A8医学院——图书馆 90

B9通道A2——通道A1 5

B10通道A1——明理楼 2

B11通道A1——南大门 35

B12通道A1——四小园 20

B13通道A1——夏威夷操场 20

B14明理楼——四小园 19

B15四小园——夏威夷操场 4

B16四小园——洗浴园 5

B17四小园——校医院 6

B18校医院——洗浴园 3

B19校医院——清和 50

B20清和——奥宇厅 3

B21清和—南大门 30

B22清和——夏威夷操场 40

B23夏威夷操场——南大门 18

B24夏威夷操场——校医院 4

B25奥宇厅——通道B1 10

B26通道B1——南大门 3

B27通道B1——通道B2 5

B28通道B2——医学院 3

初始化无向图

因为导航的范围只是在学校的两个校区内,可能的数据量并不大,所以可以直接将常用的地点等相关数据直接保存在项目中,或者以文件形式保存在本地,或者数据库中...只有当用户想要添加一个未被记录的地点信息时才执行新的图的构建,然后再更新保存,而不需要每一次都输入新的数据,这样做提升用户体验。

至于如何实现上述功能,这里用了一个最简单的方法,直接将地点的信息以数组的形式存储,并在初始化的时候遍历赋值。

最短路径算法的分析及选取

最短路径算法有Dijkstra和Floyd两种,其中Dijkstra的时间复杂度是O(N^2),是计算某一点到其他各点之间的最短路径;Floyd的时间复杂度是O(N^3),空间复杂度是O(N^2)。通常的方法是在用户查询某两点之间的最短路径时(导航),用Dijkstra算法计算,但是考虑到面向的对象是新生,大频率的操作是查找或者导航,也就是计算最短路径,如果当用户第一次计算最短路径时,将Floyd生成的Path数组和Dist数组保存在本地,而之后的每一次找最短路径只需要直接访问数组下标,这样时间复杂度就降到了 O(1),且大部分时间是O(1),只需要在用户添加或者修改图的时候再更新,就大幅减少了重复的计算次数和时间复杂度。

当然除了查询操作,还是要给用户提供一个可供增加或者删除数据的接口,这里的想法和上面一样,直接在本地文件中读写,也是优化用户体验。

基于文件流的简单文件的读写

文件的读写是本次项目的灵魂所在,因为只有将文件保存在本地并且实现读入和写入操作,才能将查找最短路径的时间复杂度降至O(1),并且优化了用户体验,使得用户可以在【开发者模式】下,自由的增删查改数据,并且保证在下一次启动项目时保留了之前的操作。

进阶需求分析

进阶要求实现简单的图像显示,这里用了基于EasyX的图形库。对于EasyX的入门,在论坛上有很多详细的教程了,所以也不赘述了,如果之前的过程中把基础需求的接口封装好,这一步也不算难点,至于文字显示问题我推荐重载运算符,可以减少过多的重复步骤。 

当然可视化的窗口要在项目分析阶段就要完成设计,可以用工具(如processOn)绘制出大概的设定思路,它决定了你所定制的接口参数、想要实现的效果,这在之后写代码的时候很重要。(教训)


展示部分效果:

 

至于模糊搜索,一开始我打算把某一信息按照固定步长切割,再用map去存每一个关键字、用set去存对应的下标,然而在网上冲浪时发现用strstr函数可以实现(仿)模糊搜索的功能,考虑到这个项目中数据量并不大,用这个函数实现更加方便。

搜索关键字【物电】得到的结果:

总结与反思

我的收获:

在这次项目中,给我最大的收获还是体验了一套较为完整的项目流程,也给予了我不少项目经验,可谓是真正体会了最短路径算法的分析和应用,达到了巩固数据结构的效果。再者对C++语言特性体会不深,没能尽可能多地去用C++的诸如面向对象和STL的相关知识去实现功能,需要通过刷题加深对STL的应用。而且在写建图的函数中我为了偷懒,定义了些全局变量,本以为不是在嵌入式机器上空间不是问题,可还是造成了栈溢出,以后还是要把数据开辟在堆里;

同时这次项目虽小,但还是有些进阶的想法没能实现,如在地图中直观的显示出最短路径的动画,一方面是我太菜了,对easyX的学习和应用程度不深,不管怎么样要学点QT之类的基础操作,也就是前端和后端的知识多多少少也要了解一些,不能只注重我所在的技术栈,这对未来工作也不占优势;另一方面是在项目起草阶段没有深入的思考往后的接口,一上来就开始写,前期想到什么加什么,完全没有考虑后期封装和扩展的问题,导致在写项目的过程一直在更改形参,这也是我在架构方面没有任何经验导致的。

猜你喜欢

转载自blog.csdn.net/ZER00000001/article/details/126294000