C++数据结构 交通咨询系统设计(一)
C++数据结构 交通咨询系统设计(一)
- 一、题目描述
- 二、文件读取
- 三、框架设计
- (一)画图部分的类设计
- 1. 结点类(MapPoint)
- 2. 线类(MapLine)
- 3. 路径类(MapLine)
- (二)画图部分的城市坐标设计
- 1. 转换 y 轴坐标
- 2. 坐标原点划定 & 求“标准坐标”
- 3. 确定原点实际坐标 & 调整偏移量 & 放大系数
记录一下自己做这个课程设计图论部分题目的一些流程思路
一、题目描述
设计一个交通咨询系统,通过读取全国城市距离图(http://pan.baidu.com/s/1jIauHSE,请在程序运行时动态加载到内存,可将excel转成csv方便读取),实现:
问题1:请验证全国其他省会城市(不包括港澳和两个宝岛台北和海口)到武汉中间不超过2个省(省会城市)是否成立?(正是因为武汉处于全国的中心位置,此次疫情才传播的如此广)
问题2:允许用户查询从任一个城市到另一个城市之间的最短路径(两种算法均要实现,界面上可自行选择)以及所有不重复的可行路径(可限制最多经过10个节点),并利用快速排序对所有路径方案依据总长度进行排序输出(输出到文件),每一条结果均需包含路径信息及总长度,试比较排序后的结果与迪杰斯特拉算法和费洛伊德算法输出的结果
问题3:假设在求解2个城市间最短路径时需要绕过某个特定的城市(用户输入或者选择,例如武汉),请问应该如何实现?
问题4:不基于功能2遍历的结果如何直接求解两个城市间的前第K短的路径,例如,武汉到北京之间第3短的路径。
二、文件读取
在网盘上下载的是一份包含了两个矩阵的Excel文件,将它们分成单独两份保存成csv文件。
文件1:省会城市距离矩阵.csv
(是一个三角矩阵, 里面记录了任意两个城市之间的距离,不管这两个城市之间是否邻接)
文件2:省会城市邻接矩阵.csv
(正儿八经的邻接矩阵,0 表示行城市和列城市不相邻,1 则表示它们相邻)
有了这两份csv文件之后,就可以分别去读取它们,从而建立两个关键的矩阵(二维数组)
① 省会城市距离矩阵,② 省会城市邻接矩阵
PS:题目中的城市数量是确定的(34个),也不用对这个矩阵做任何插入或者删除的操作,所以构建二维数组时图方便的话可以不用动态new方法去构建而是考虑直接 int Edge[34][34] 粗暴解决。
构建带权值的邻接矩阵Edge
① Edge[i][j] = 0 → i = j
② Edge[i][j] = ∞ → Vi 和 Vj 不相邻, 即 EdgeMatrix[i][j] = 0
③ Edge[i][j] = DistanceMatrix[i][j] → Vi 和 Vj 相邻, 即 EdgeMatrix[i][j] = 1注释:DistanceMatrix是读取文件1的距离矩阵,EdgeMatrix是读取文件2的邻接矩阵
先把刚刚读文件的部分整合成函数:
ReadCSV(string Filename, int Martix[34][34]);
分别调用两次填充制作得到城市距离矩阵 DistanceMatrix 和城市邻接矩阵 EdgeMatrix
然后读取这两个矩阵,汇总制作出真正用于后面题目的带权值的邻接矩阵 Edge读取文件这一部分可以说几乎完全是独立于后面要写的功能或者界面的,就是不管下面用啥界面做读取的思路应该和我自己整的这个差不了多少,如果想用非控制台来做界面的话,这一部分其实可以另外新开一个控制台去测试,测好了再把这部分移入到要做的界面当中。
三、框架设计
题目中要求做界面,我自己也只会用 MFC 和控制台两种,在这里就考虑用 MFC 来做框架了
(一)画图部分的类设计
想到图论的应用,特别是像这一题需要看城市之间的路径的题目,一般来说可视化要求是将整幅图展示在界面上面,同时对于每一个功能,都应该用不同的形式展示在刚刚画出的整幅图中(例如我把城市图用黑色画在对话框上,那么找到的路径就可以换一种颜色,如蓝色标记出来)
如图所示:
黑色是初始化图:
蓝色则标记处一条题目要求的路径(如寻找乌鲁木齐到长沙的最短路径):
(红色结点表示出起点城市和终点城市,那么绿色结点就可以用来表示绕过某个城市)
如在上图的基础上,强行绕过西宁之后,乌鲁木齐到长沙的最短路径变成:
(可以看到这样的可视化画图界面较为直观易懂)
为了比较容易地实现这样的作图效果,需要定义以下的内容:
① 结点类,必须内置单个结点的画图函数
② 线类,必须内置这一条线(两个邻接结点之间)的画图函数,同时还得标记出这两个结点之间的权值
③ 路径类,含有从起点到终点的所有连线,必须内置单条路径的画图函数
④ 画出初始化图的函数
下面就开始逐个解决这些部分的设计。
1. 结点类(MapPoint)
这道题中,每一个结点代表一个城市,数据成员肯定得有一个能够打印到界面的 CString 类变量CityName 来表示城市名称。为了画图,这个结点类必须包含有MFC点类 CPoint 的指针 ptr,同时为了方便城市名称与其对应下标关系(存在邻接矩阵 Edge[i][j] ,必须知道 i 行到底是啥城市),还需要一个 int 变量 Mark 来标记,再加上记录坐标的 double 型变量 x ,y,那么这一个MapPoint 类的数据成员就可以基本上确定下来了。
声明部分如下:
class MapPoint
{public://数据成员CString CityName; //城市名称int Mark; //标记,类似于下标,Vi 结点的 Mark 就是 idouble x, y; //x, y 坐标CPoint* ptr; //ptr 指针,用于画图//默认构造函数MapPoint() : CityName(_T("")),Mark(-1), x(0), y(0), ptr(NULL) {}//含参构造函数MapPoint(CString name, int mark, double xPoint, double yPoint) :CityName(name),Mark(mark),x(xPoint),y(yPoint){//根据输入的坐标写入到 CPoint 指针中ptr = new CPoint(x, y);}//画图函数bool DrawPoint(CDC* pDC, double Radius = 10);
};
结点的画图函数 DrawPoint ,只需要获取 CDC指针,和用户给定的半径就可以绘图。其中 CDC 指针 pDC 相当于控制着画笔的颜色,色号大小,笔头
C++数据结构 交通咨询系统设计(一)相关推荐
- 数据结构课设--交通咨询系统设计
一.问题描述: 交通咨询系统设计 设计目的: 熟练掌握迪杰斯特拉算法和费洛伊德算法,能够利用它们解决最短路径问题. 掌握图的深度,广度遍历算法. 掌握快速排序算法. 内容: 设计一个交通咨询系统,通过 ...
- 【数据结构课程设计】题目五:交通咨询系统设计(经典最短路问题)
题目五:交通咨询系统设计 设计要求: 设计一个咨询交通系统,能让旅客咨询从任一个城市到另一个城市之间的最短路径(里程).最低费用或者最少时间等问题.对于不同的咨询要求,可以输入城市间路程.所需时间或者 ...
- 数据结构编程回顾(五)交通咨询系统设计
题目五:交通咨询系统设计 设计要求:设计一个咨询交通系统,能让旅客咨询从任一个 城市到另一个城市之间的最短路径(里程).最低费用或者 最少时间等问题.对于不同的咨询要求,可以输入城市间路 程.所需时间 ...
- 用c语言设计交通咨询系统,交通咨询系统设计课程设计.doc
交通咨询系统设计课程设计 课 程 设 计 报 告 课程名称 数据结构 课题名称 交通咨询系统 专 业 班 级 学 号 姓 名 指导教师 2013 年 月 日 设计内容与设计要求 1设计内容 [问题描述 ...
- 数据结构课程设计之 交通咨询系统设计(c++)
题目 设计目的: 熟练掌握迪杰斯特拉算法和费洛伊德算法,能够利用它们解决最短路径问题. 掌握图的深度,广度遍历算法. 掌握快速排序算法. 内容: 设计一个交通咨询系统,通过读取全国城市距离图(在htt ...
- 数据结构与算法——课程设计报告(全国交通咨询模拟)
C++ 全国交通咨询模拟 源文件点击此处下载⏬ 1 要求 [问题描述] 全国交通咨询模拟** 处于对不同目的的旅客对交通工具有不同的要求.例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客 ...
- 全国交通咨询模拟系统
数据结构 严蔚敏 第六章 图6.6.2 简易版 具体实现修改vexs顶点表,a,b,c改为地点名 仅使用Dijkstra算法 如果是为了最少转站,对图使用广度优先即可 还有读入地图使用file之类的细 ...
- 南大通用精彩亮相第六届轨道交通AFC系统设计与规划发展研讨会
秋意满满,收获满满. 第六届轨道交通AFC系统设计与规划发展研讨会于2020年10月30日在苏州市召开,会议由中国信息产业商会自动收费系统专业委员会主办,中铁二院工程集团有限责任公司轮值主办,北京方卡 ...
- C语言课程设计 全国交通咨询模拟,全国交通咨询模拟系统C++实现(课程设计报告).doc...
全国交通咨询模拟系统C实现(课程设计报告) 全国交通咨询模拟 一.设计目的 掌握线性表.栈.图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储 ...
最新文章
- SAP ERP业务优化之非计划运输成本核算
- Nginx变身爆火神器,手把手教你在永洪BI中应用
- submit按钮html,html的两种提交按钮submit和button
- webview改变网页宽度
- 如何在ASP.NET服务器控件库中嵌入JavaScript脚本文件 [适用于.NET 2.0]
- HttpClientFactory的套路,你知多少?
- qdir 自动创建多级目录_Qt 判断文件或文件夹是否存在及创建文件夹
- mysql如何字符编码,如何修改MYSQL的字符编码
- Phpstorm-php在线手册配置
- VMWare虚拟机服务器设置固定ip,切换网络后不用重新设置服务器ip
- Lottie动画的使用
- 数学建模之matlab软件学习04——专题四MATLAB绘图
- 京东、搜狗“带狗”都好好的,为何司机对快狗打车不满意?
- 三星a5000刷Android原生,三星 A5000中文Recovery刷机教程
- android wear2.0 更新,又一批手表获得Android Wear 2.0更新
- 自媒体人必看,这些无版权背景音乐网站,免费下载
- 文件存储名片java_java做的名片管理系统
- 用DTM实现网页转化跟踪,广告投放效果实时监测
- 麦子学院深度学习视频SVM人脸识别课程代码修改及实现
- nyoj82(迷宫寻宝)
热门文章
- cmake Could NOT find Boost (missing: xxx 的问题 已解决
- 大数据开发的26个专业术语
- Windows远程桌面怎么使用,看完马上学会!
- 寒衣节的由来和习俗,你知道吗?
- 电脑无法连接wifi得解决方法
- DOS、DOS攻击、DDOS攻击、DRDOS攻击
- 关于常见的RuntimeException
- ABBYY FineReader 14创建PDF文档功能解析
- 《人月神话(The Mythical Man-Month)》2人和月可以互换吗?人月神话存在吗?
- An unexpected error prevented the server from fulfill your request.(HTTP500)