当前位置: 首页 > news >正文

基于C++实现广州地铁线路查询

♻️ 资源

大小:1.33MB

➡️资源下载:https://download.csdn.net/download/s1t16/87450323

广州地铁线路查询

一、实验目的

百度地图、高德地图等软件在导航时,如果选择出行方式为地铁,通常将提供从起点站到终点站的最短路径或者是多条规划路径的具体线路名称。本次实验旨在实现一个以广州地铁为基础数据的地铁线路查询程序,输入广州地铁中的起点站和终点站之后,输出从起点到终点的最优地铁乘坐路径,并根据实际统计数据给出一共经历的站点总数。

二、实验环境

本实验可基于 Visual Studio Code 等平台开发,参考主流的编码规范,如 Google C++StyleGuide(中文版)编程语言和开发工具

编程语言: ANSI C/C++

2.1 开发工具: Visual Studio Code、编译器 G++

2.1.1 编码规范

遵循良好的程序设计风格来设计和编写程序。基本编码规范:

标识符的命名要到达顾名思义的程度;

关键代码提供清晰、准确的注释;

程序版面要求:

不同功能块用空行分隔;

一般一个语句一行;

语句缩进整齐、层次分明。

三、实验要求

原则上两人一组完成,每人写一份报告。报告应该详实规范清晰,内容应该数据结构和

算法设计细节、程序测试、程序使用和总结。

你的程序应该解决实际问题,并给出正确答案。

程序输出信息可参照广州地铁线路查询、坐车网(zuoche.com)和百度地图线路规划

等给出有关信息,可以自行设计,最低要求给出一种最佳乘车方案。

我们将择时分组进行讲解演示,并根据完成情况打分。

实验内容

四、分析与设计

参考广州地铁线路查询和百度地图规划,得到如下广州市地铁线路图,本次实验数据以该图

为标准。

  • 广州市地铁线路图
  • 实验原理
  • 广度优先搜索(也称宽度优先搜索,缩写 BFS,以下采用广度来描述)是连通图的一种
  • 遍历算法这一算法也是很多重要的图的算法的原型。Dijkstra 单源最短路径算法和 Prim 最
  • 小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫 BFS,属于一种盲目搜寻法,
  • 目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能
  • 位置,彻底地搜索整张图,直到找到结果为止。基本过程,BFS 是从根节点开始,沿着树(图)
  • 的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。一般用队列数据结构来辅
  • 助实现 BFS 算法。
  • 广度优先搜索算法的搜索步骤一般是:
  • 从队列头取出一个结点,检查它按照扩展规则是否能够扩展,如果能则产生一个
  • 新结点。
  • 检查新生成的结点,看它是否已在队列中存在,如果新结点已经在队列中出现过,
  • 就放弃这个结点,然后回到第(1)步。否则,如果新结点未曾在队列中出现过,则将它加
  • 入到队列尾。
  • 检查新结点是否目标结点。如果新结点是目标结点,则搜索成功,程序结束;若
  • 新结点不是目标结点,则回到第(1)步,再从队列头取出结点进行扩展。
  • 最终可能产生两种结果:找到目标结点,或扩展完所有结点而没有找到目标结点。
  • 若找到目标结点,查询所经过的路径即最短路径。
  • 本系统共实现 3 个功能,除了实验要求所必实现的最短路径查询功能外,还包括线路信息查询和站点信息查询
  • 程序流程图

类的设计

4.1 Station 类

class Station { public: string name;//站点名称 string prev;//从哪个站来 Station(){ name = "";} void set(const string &n) { name = n; } void setPrev(const string &p) { prev = p; } };

Station 用于记录路径信息,即记录广度优先搜索树的每个结点的前驱 name 为站点名,prev 记录从哪一站来,搜索到目标站点时根据 prev 回溯,将所经过站点的信息存入最短路径的容器中

4.2 SubwaySystem 类

class SubwaySystem { //邻接表记录地铁线路图 map< string, vector<string> > adj_table; //用于记录Station信息:来自哪里;key=站点名称 map<string, Station> stations; //用于记录线路信息:线路上的所有站点;key=线路名称 map<string, vector<string>> routes; //用于记录站点的线路信息:在哪些线路上;key=站点名称 map< string, set<string> > lines; //用于记录最短线路,包括起始站和终点站 list<string> theShortestPath; private: //根据线路符合打印线路名称 void print_line(const string &); //根据可换乘的线路数排序,在遍历时先遍历可换乘线路数较少的站点 void sort_by_lines(vector<string> &); //返回两个站点的相同的线路,用于记录换乘 string get_line(const string &, const string &); //处理文件信息 void Handle_File(const char* name); //广度优先搜得到以得到最短路径 void BFS_Dispose(map<string,bool> &vis_table, const string& from,co nst string& dest); //打印最短路径 void Print_ShortestPath(); //查询最短路径 void Find_Route(string& start,string& dest); public: SubwaySystem(string filename); //从文件读入地铁信息 void Line_Inquiry(); //线路信息查询 void Site_Inquiry(); //站点信息查询 void Route_Inquiry(); //查询最短路径 };

功能实现

线路信息查询

void SubwaySystem::Line_Inquiry() { cout << endl; string line; cout << "Line:" << endl; cin >> line; if (routes.find(line) != routes.end()) { cout << "Stations of "; print_line(line); cout << " :" << endl; for (int i = 0; i < routes[line].size(); ++i) { cout << routes[line][i]; if(i!=routes[line].size()-1) cout << " - "; } cout << endl; } } 线路信息存储在SubwaySystem类成员map< string, vector<string> > routes 中,

实现时根据用户输入的线路号打印输出该线路上的所有站点信息。

站点信息查询

void SubwaySystem::Site_Inquiry() { cout << endl; string site; cout << "Site:" << endl; getline(cin, site); if (lines.find(site) != lines.end()) { cout << "Line Information:" << endl;//打印所属线路 for(const auto&a:lines[site]){ print_line(a); cout << endl; } cout << "Adjacent station(s):" << endl;//打印相邻站点名称 for(const auto&a:adj_table[site]) cout << a << endl; } } 站点所属线路信息存储在 SubwaySystem 类成员 map< string, set<string> > lines

中,实现时根据用户输入的站点名称打印输出该站点的所属线路信息。

每个站的相邻站点信息存储在 SubwaySystem 类成员 map< string, vector > adj_table 中,实现时根据用户输入的站点名称打印

输出该站点的所属线路信息。

查询最短路径

void SubwaySystem::Find_Route(string& start,string& destination) { if(stations.find(start)!=stations.end()&&stations.find(destination) !=stations.end()&&start!=destination) { map<string, bool> vis_table; for(auto a:stations) vis_table[a.first] = false; BFS_Dispose(vis_table,start,destination); cout << endl; cout << "The shortest path:" << endl; Print_ShortestPath(); } else if(stations.find(start)==stations.end()) cout << "Missing departure station." << endl; else if(stations.find(destination)==stations.end()) cout << "Missing destination." << endl; else cout << "The departure station is the same as the destination." <<endl; }

实验结果:

线路信息查询

站点信息查询

五、实验心得

在这一次实验过程中,我对于图的构建以及 map、vector 等容器的构成有了更多的了解,对于遍历、搜索等算法的原理有更深刻的认识;此外,也让我更加熟悉了数据结构的设计流程和测试流程。

在这次实验中遇到更多的是一些问题和挑战。最大的障碍是如何合理的处理数据以及其线路站点信息,如何选择合适的算法计算出最短路径并输出等等,对于这些问题,在网络上查找相关资料、参考别人的做法必不可少,还需要比较不同做法在实现速度上、在代码可观性等方面的优劣,这种解决问题的方法在之后的学习过程中也会持续使用到。参考别人的方法,是相对比较高效的学习方法之一。对于许多之前不熟悉但通过学习别人的应用方法觉得巧妙的方式方法,也可以记录跟学习,扩充自己的知识。

除此之外,在本次实验中也遇到了许多大大小小的问题,比如 VScode 的输出框输出中文会出现乱码,经过网上的资料查找和搜索发现需要在全局变量中进行设置,考虑到效率等问题,选择放弃中文输出而采用英文的导语输出。同时本次的实验实现还有许多不完善的地方和许多可以进一步进行优化的内容,例如换乘方案的时间延迟没有考虑在内,还有应该如何进一步优化算法、如何减少程序的运行时间等,可以用自然语言等描述的算法逐步细致化、精确化、形式化,还有特别注意特殊情况、边界条件的考虑,尽可能地增强程序的容错性。这些问题都值得进行进一步的思考、处理。最后是具体的测试过程中,或许应该考虑增加一些输出让使用者了解整个程序的实现过程。

http://www.jsqmd.com/news/1195030/

相关文章:

  • 上海静安区彩礼返还律所:静安区彩礼返还律所成功案例参考要点? - 品牌深度评测
  • 警惕AI领域虚构技术名词与过度优化陷阱
  • TensorFlow 2深度实践:从tf.function到SavedModel的工业级训练闭环
  • Sqoop数据导入实战:从MySQL到HDFS与Hive的完整指南
  • gh_mirrors/co/color社区活动指南:参与meetup与线上讨论
  • BlockBlock故障排除:常见问题诊断与解决方案大全
  • 计算机毕业设计之基于SpringBoot的智能医疗系统的设计与实现
  • 合肥蜀山经开区深耕二奢回收15年,劳力士上门回收流程、全套配件溢价要点解析 - 逸程奢侈品回收中心
  • 如何在3分钟内完成macOS Big Sur完整安装包的图形化下载:告别复杂命令的终极解决方案
  • 校服订购小程序商城制作流程 - 码云数智
  • 如何在Windows上无需模拟器直接运行安卓应用:APK Installer架构深度解析与实战指南
  • PalEdit:你的幻兽帕鲁存档编辑器,打造完美伙伴阵容的终极方案
  • 厦门岛内批量婚嫁成套金银首饰上门回收能否当场结算转账 - 讯息早知道
  • 2023 Groovy生态现状:awesome-groovy告诉你哪些库值得关注
  • BlockBlock安全审计:如何验证监控覆盖范围与防护效果
  • 劳力士欧米茄怎么卖高价?南京正规名表回收门店推荐|合扬上门回收、当场报价秒结 - 小禾收名品
  • 重庆合扬本地做了十几年的老牌回收,25年积淀值得托付 - 全国奢侈品回收
  • 计算机毕业设计之基于SpringBoot的智能学习系统的设计与实现
  • 如何用Super Productivity实现300%效率提升:开源时间管理终极方案
  • Agents-A1-8bit:革命性视觉语言模型的终极入门指南 [特殊字符]
  • 平房爱马仕闲置包 TOP 连锁回收,中检资质大型连锁,全域透明上门出价猛! - 一站式奢品变现
  • STM32 I2C 驱动0.42寸OLED:从零构建高效驱动与字库优化
  • 仿真实战 | 基于HFSS的芯片封装近场EMI仿真与优化
  • 从ACL到ABAC:权限模型演进史与实战选型指南
  • 【2026 杭州纺织服装检测机构靠谱实力榜单】本地第三方实验室干货测评 + 商家避坑全攻略 - 品牌测评网
  • ROS Indigo实战部署指南:老旧机器人系统维护与工业现场避坑手册
  • 四川广安市送孩子学武术选哪家?别再乱报培训班!老牌正规武校才靠谱 - 全国文武学校招生
  • 2026上海钻石回收实地考察实测:哪家门店报价实在不压价?靠谱渠道汇总 - 奢品小当家
  • ccswitch:进程级环境切换工具原理与CI/CD实践
  • 小程序毕设选题推荐:基于 Android 的学生动态分享交流 APP 的设计与实现 基于 Android 的校园社群互动管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】