基于QT(C++)实现旅游线路规划系统

♻️ 资源

大小: 28.7MB

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

旅游线路规划

一、设计任务的描述

系统目标: 本软件旨在根据旅客的要求设计出行路线并输出,同时系统能模拟旅所在的地点 和状态,目标是为旅客提供能完美出行的计划。处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途的时间尽可能短,出门旅游的游客则希望旅费尽可能省。编制一个全国城市间的交通咨询程序,为旅客提供最优决策的交通咨询。

二、功能需求说明及分析

功能需求: 设计最省钱和最少时间的算法及其需要信息的存储:最省钱和最少的算法利用迪 杰斯塔拉算法; 信息先是存储在一个文本文件中,程序可以从中读取并且存放在一个类中。 该程序所做的工作是模拟旅游交通查询,为旅客提供最有决策的交通查询。规定: 再输入城市名称时,直接输入城市的名称(汉字);输入时间时,需要输入一个 整型数据,选择功能时在界面上直接选择。程序的输出信息主要是:最快需要多 少时间才能到达,或者最少需要多少费用才能到达,以及在旅程途中临时改变目 的地时方案也相对发生变化和在规定时间内的最省钱方案。模拟旅游交通查询系 统,能实现现实生活中旅客的各种需求做出相应的程序,能实现选择功能。

  1. 城市总数不少于 10 个,即不能过于简单
  2. 建立汽车,火车,飞机的航班表 包含沿途到站、票价信息 并且要求两个城市之间不能只有一班车次
  3. 旅客的需求包含:起点、中点、途经城市、在某个城市的停留时间、 旅行策略(旅客可以中途改变旅行方案)
  4. 旅行策略包含:最少费用:不考虑时间,只需费用最少最少时间:不考虑费用,只需时间最短限时最少费用:在规定的时间内,让费用最少
  5. 旅行查询系统以 10s :1h 的速度推进时间轴(非查询状态不计时)
  6. 不考虑城市内换乘交通工具所需时间
  7. 系统的时间精确到小时
  8. 建立日志文件,对旅客状态变化和键入等信息进行记录
  9. 旅客在旅途中可更改旅行计划,系统做出相应的操作
  10. 用图形绘制地图,并在地图上反映出旅客的旅行过程

三、总体方案设计说明

开发环境:

版本库:Qt 5.12.2

IDE:Qt Creator 4.8.2

编译器:MinGW 64-bit

系统:Windows 10

概要设计:

本系统整体上分为存储系统,编辑列车城市信息以及求最小费用,最短时间,存 储系统运用到数组和类。存储系统分别存储火车,飞机,汽车列次,始发地和终 点站以及需要的费用。最短时间和最小费用使用迪杰斯塔拉算法编程。该算法主要分为三步:1,起始点(V0)与其相邻点的权值(即当前最短路径)。2,求出 当前最短路径中的最小值即是该起始点(V0)与另一点(Vi)的最短路径。3, V0 到 Vi 的距离加上 Vi 到 Vj 的距离小于 V0 到 Vj 则将 V0 到 Vi 的距离加上 Vi 到 Vj 的距离记为 V0 到 Vj 当前最短路径,循环第二,三步。如此得到 V0 到各点的最短路径,进而可以得到最想要的一条。时间复杂度为 O(n2),空间复杂度 O(n)。

总体结构:

软件结构包括软件模块和模块间的控制关系和模块组成关系。

|-----|------------|-----------|----------|
| 编 号 | 模 块 名 称 | 模 块 标 识 | 模块功能 |
| 1 | 输入模块 | Widget | 图形界面输入操作 |
| 2 | 算法以及旅客信息模块 | Traveler | 计算最优规划 |
| 3 | 绘图模块 | Mapwidget | 图形化输出 |
| 4 | 航班表模块 | Schedule | 读入并存储航班表 |
| 5 | 日志模块 | Log | 生成日志文件 |

四、数据结构说明和数据字典

数据结构说明:

Attribute 类包含了一个车次(或者航班)信息,其中有公有成员:

int from: 出发城市

int to: 目的城市

int cost: 花费

int vehicle: 类型(飞机、火车、汽车)

QString num: 车次号(或航班号)

QTime begin: 出发时间

QTime end: 到达时间

一个 Attribute 类的对象就是一个车次(或航班)信息

Schedule 类包含了一个 multimap 型的 存储城市之间交通工具时刻表的结构

multimap<int,Attribute> database: 所有城市之间交通工具时刻表

Traveler 类包含了一个旅客的全部信息 私有成员:

bool isChecked 是否途经城市 int id 旅客 id

int strategy 旅行策略 int origin 出发城市 int destination 目的城市

QDateTime start_time 出发时间

QDateTime deadline_time 截止时间(策略三使用) QDateTime used_time 已经过时间

QDateTime total_time 总用时间

std::vector throughCity 途经城市 std::vector get_plan() 得到旅行计划 QDateTime get_city_arrival_datetime(int) 到达城市时间 QDateTime get_city_departure_datetime(int)

离开城市时间

std::vector change_plan(......) 改变旅行计划

公有成员:

std::vector plan 记录最优路径 std::vector time 记录每个城市的到达时间 std::vector dijkstra(......) 迪杰斯特拉算法求策略 一、二的最优路径

void deep_first(......) 递归查找路径

void make_plan(......) 生成旅行计划 void update_adjacents(......) 更新相邻节点的值 QDateTime calculate_time(......) 计算时间 QDateTime total_datetime() 总用时

int min 最小花费 QDateTime mintime 最短时间

Ps:最后增加了对旅客信息保存功能,下次打开将自动显示

将旅客信息保存在 traveler.txt 文件中,不要删除此文件,否则下次启动程 序将无法打开文件。

实现方法:在关闭程序之前将旅客信息保存在 traveler.txt 中,再次打开程 序先读文件 traveler.txt,并将旅客信息显示在屏幕上。

五、各模块设计说明

1. Schedule

实现功能:从文件中读入 并 存储 城市之间交通工具时间表 需要对文件中数据类型做处理(例如城市在文件中用中文存 储,读入时应转换为数字编号)

实现方法:读入文件函数如下,将文件中的车次信息逐条读入并存储,对数据的处理函数为 int Schedule::CityToNum(QString city),如下所示,实 现了 中文城市 与 城市编号 之间的转换

2. Traveler

实现功能:计算出不同策略下对应的最优路径,并将得出路径传递给 Mapwidget 模块。同时支持修改路径功能。

实现方法:通过函数 std::vector Dijkstra(......)得出策略 一、二的最优路径。 函数 void DFS(......)递归查找得出路径。

讨论迪杰斯特拉和 DFS

在时间最短和费用最少两种旅行策略中,可以使用迪杰斯特拉 算法,而在一定时间范围内花费最少经过讨论并没有算法可 用,只能穷举所有路径,但是在穷举过程中可以加入剪枝策略

如图所示

数据:

私有成员:

bool isChecked 是否途经城市 int id 旅客 id

int strategy 旅行策略 int origin 出发城市 int destination 目的城市

QDateTime start_time 出发时间

QDateTime deadline_time 截止时间(策略三使用) QDateTime used_time 已经过时间

QDateTime total_time 总用时间

std::vector throughCity 途经城市 std::vector get_plan() 得到旅行计划 QDateTime get_city_arrival_datetime(int) 到达城市时间 QDateTime get_city_departure_datetime(int)

离开城市时间

std::vector change_plan(......) 改变旅行计划

公有成员:

std::vector plan 记录最优路径 std::vector time 记录每个城市的到达时间 std::vector dijkstra(......) 迪杰斯特拉算法求策略 一、二的最优路径

void deep_first(......) 递归查找路径 void make_plan(......) 生成旅行计划

void update_adjacents(......) 更新相邻节点的值 QDateTime calculate_time(......) 计算时间 QDateTime total_datetime() 总用时

int min 最小花费 QDateTime mintime 最短时间

3. Widget

从图形化界面 读入 并 存储 旅客信息,包括旅客的 出发城市、目的城市、途经城市、出发时间、截止时间、选择策略通过调用 getplan()函数,将旅客信息传递到 Traveler 模块,通过 Traveler 模块计算得出最优路径传递会 Widget 模块

实现功能: 读入旅客信息

响应图形化界面按钮请求

添加旅客

从 Traveler 获取最优路径

请求 Traveler 更改方案

实现方法:QT 按钮响应逻辑,与 Traveler 模块进行数据交互

4. Mapwidget

实现功能:读入旅客最优路径,并图形化输出 图形化输出包含了不同类型交通工具选择不同的图标(飞机、火 车、汽车)

实现方法:通过 Widget 获取的最优路径,计算图标的坐标与时间的关系 确 定每一个时间 图标在图形化界面的位置 ,实现动态显示

5. Log

实现功能:将旅客信息(所选方案)以文本格式输出到文件中 实现方法:Debug 输出

六、范例执行结果及测试情况说明

主界面:

范例:首先添加旅客,策略选择选择策略二耗时最少,城市选择北京到香港。

结果: 点击开始,可以发现在解决方案那里已经出现了解决方案,左边的地图也会按照 时间做出相应的动画。

测试情况说明:当在当天晚上十一点半开始查询北京到香港的耗时最少方案时, 解决方案时先坐次日早上六点的 ZH1333 航班在次日早上八点到达重庆,花费 722 元,再从重庆做早上九点的 ZH4951 航班在次日上午十一点到达香港,花费 505 元。因为是在晚上十一点进行这个范例测试,所以花费时间十一个小时二十分钟(次日上午十一点到达),花费 1227 元。

七、评价和改进意见

首先,调试过程中遇到的问题主要是数据类型不匹配,参数没有声明,运行结果 与要求不一致等问题。解决方法:前两个就是不断调试找出错误;后面的主要是 查阅资料,书籍和老师知道,反复阅读实例文档。 本次课程设计,我分析和设计了旅游交通查询系统,此次设计让我对计算机和软 件有了更浓厚的兴趣,让我对迪杰斯特拉算法有了更深的理解,同时也对软件的 设计的各种分析和设计有了更深的理解,我觉得课程设计很接近实际,是锻炼我 们动手能力的好机会,为以后的工作打下基础。本次试验让我明白了软件设计的 思想和方法,1、需求分析,分析为什么需要这个软件,这个软件要实现什么; 2、概要设计,设计如何实现的软件功能,要实现结构化设计,把实现软件功能 的程序模块化;3、详细设计,编写各个模块的具体实现的程序;4、上机调试, 得到运行结果;5、对程序进行分析改进,重复 4 步骤。我也通过本次课程设计 查阅了不少资料,学到了不少知识,也学到了不少调试程序的方法,最重要的是 积累了不少经验。总的来说,虽然做的途中很痛苦很难受,也遇到了很多问题, 不过最后也都是解决了,而且最后的成品做出来的时候还是蛮有成就感的。

八,用户使用说明

1、主界面(有图标和标题),开始时除了【添加旅客】按钮其他都不可点。

2、点击【添加旅客】后。

3、选择【策略】,【始发地】和【目的地】,以及【起始时间】。只有策略三才能 更改【截止时间】。

策略一:

策略三:

还可以选择途经城市,只有点击【选择途经城市】后才能选择途经的城市。

4、点击【开始】后,该按钮变为【更改】。计算完计划,显示方案信息。在左侧 画图,图标会随时间移动。

5、点击【更改】,更改计划,显示新计划信息。

6、在该旅客运行时可以再添加一个旅客。

在【选择旅客】下拉框中可以选择 1 号旅客,界面会重新显示 1 号旅客信息。

7、生成的日志信息:

8、在退出程序时,程序会提示【是否保留旅客信息】

选择【Yes】则自动将这一次旅客的信息保存到以下文件(traveler.txt)中(该 文件不要删除,与 exe 在同一目录下)。

选择【No】则清空旅客信息文件。

9、每次启动程序时都会有如下提示

选择【Yes】则自动从以上文件(traveler.txt)中读取上一次运行的旅客信息, 并直接显示在屏幕上。

选择【No】则不读取任何信息。

相关推荐
郝学胜_神的一滴1 小时前
C++11 工程级应用 02:decltype与返回类型后置,让泛型代码告别类型玄学
c++·编程语言
≮傷£≯√1 小时前
音量调节弹窗 自定义组件qt
开发语言·qt
tudousisi2222 小时前
8.25第二题训练
c++
星星.7222 小时前
2026河南萌新联赛第六场(郑州大学)补题B、D、L、J、I
数据结构·c++·算法
witton2 小时前
xmake中将proto文件生成C/C++文件然后再编译链接进项目
c语言·c++·mingw·protobuf·xmake·protobuf-c·protoc-gen-c
牛油果子哥q2 小时前
C++异常处理万字详解:try-throw-catch机制、栈展开、标准异常体系、自定义异常、工程规范、内存泄漏避坑
开发语言·jvm·c++
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】C++日志体系与spdlog封装的理论部分
开发语言·c++·ide·人工智能·学习·面试·trae
IT毕设实战小研2 小时前
基于大数据的桂林热门旅游数据分析与可视化
大数据·python·机器学习·数据分析·django·课程设计·旅游
旖旎夜光3 小时前
LCR 173:在点名(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找