基于QT实现的旅游路线查询系统

Schoolleave

发布日期: 2019-05-08 10:33:58 浏览量: 420
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、功能要求

  • 系统初始的城市总数不少于10个

  • 建立汽车、火车和飞机的时刻表(航班表),时刻表(航班表)中包含沿途到站及票价信息

  • 不能太简单(不能总只是1班车次相连),旅客的要求包括:起点、终点、途经某些城市和旅行策略

  • 旅行策略包括:

    • 最少费用策略:无时间限制,费用最少即可
    • 最少时间策略:无费用限制,时间最少即可
    • 限时最少费用策略:在规定的时间内所需费用最省
  • 旅行模拟查询系统以时间为轴向前推移,每10秒左右向前推进1个小时(非查询状态的请求不计时)

  • 不考虑城市内换乘交通工具所需时间,但是考虑因换乘交通工具产生的等待时间

  • 系统时间精确到小时,也就是正常时间的10秒钟

  • 建立日志文件,对旅客状态变化和键入等信息进行记录

  • 选做一:某旅客在旅行途中可更改旅行计划,系统应做相应的操作

  • 选做二:用图形绘制地图,并在地图上反映出旅客的旅行过程

二、需求分析

2.1 项目需求

本次旅行模拟系统查询项目的基本需求是实现一个模拟旅行系统查询的功能。

在基本功能上,如果是普通的旅行客户,需要实现用户信息的登录登出,对于没有注册过信息的新用户还需要提供进行旅客信息注册功能;用户输入旅行路线信息,包括起始站,终点站,以及旅客出发时间;旅客可以自行选择其中三种策略中的一种来定义出行方式;最后系统能够根据旅客输入路线信息以及选择的策略生成最佳的旅行路线,所给路线中需要包括出发地点,终止地点,出行时间,出行方式,以及途中的中间站,若需要更改出行交通工具,系统还必须要给出中间站的换乘方式;对于旅客当前的状态,系统需要能够每隔一定的实际输出当前旅客的状态信息,状态信息包括旅客的路线,旅客所乘坐的交通工具,旅行时间等等信息。

对于登录的管理员,除了能够实现以上所述的客户的功能之外,另外还有一个就是能够文件处理功能,包括查询用户登录的信息、用户输入的路线信息、系统事件信息等。

在模拟旅行查询系统的高阶需求方面,我们需要可视化的显示旅客当前的状态信息,比如如果旅客当前乘坐的是火车,并且正处于北京和上海之间,那么在图形化界面上就可以显示出一个正在运动的火车,而且火车的位置正处于北京和上海之间。图形化界面尽量做到简洁美观。

另外一个就是,实际生活中旅客可能会在中途旅行过程中更改旅行计划,如果可以实现中途修改计划同时系统相应的计算出新的路线方式,则更是符合现实要求。

2.2 项目业务要求

2.3 问题整理

  • 呈现三种交通工具:汽车、火车、飞机

  • 某旅客于某一时刻向系统提出旅行要求,系统根据该旅客的要求为其设计一条旅行线路并输出

  • 系统能查询当前时刻旅客所处的地点和状态,包括旅客所停留城市,以及所乘坐的交通工具

2.4 目标功能

  • 初始城市总数为11个

  • 分别建立汽车、火车和飞机的时刻表(航班表),通过文件读取信息初始化时刻表内容,有沿途到站、票价、路程等信息

  • 旅客的输入要求:起点、终点、途经城市,由用户自行选择旅行策略

  • 提供三种旅行策略:

    • 最少费用策略:无时间限制,费用最少即可
    • 最少时间策略:无费用限制,时间最少即可
    • 限时最少费用策略:在规定的时间内所需费用最省
  • 旅行模拟查询系统以时间为轴向前推移,打开可执行文件同时系统计时器开始工作,10秒代表1个小时向前推进(非查询状态的请求不计时);城市内换乘交通工具时间不予考虑,系统时间精确到小时

  • 建立日志文件,对旅客状态变化和键入等信息进行记录

  • 利用QT实现地图界面的可视化,在地图上实时反映出旅客当前的地理位置,交通工具,并且能够动态显示其行进过程

三、模块划分

3.1 主模块

模块功能

主模块负责接收键盘键入命令,包括用户的输入和管理员的输入,分析该命令并调用相应的子模块中的接口函数,并以系统时间为轴向前计时,推进运行。

3.2 线路查找模块

模块功能

该模块主要负责根据用户输入的起止城市、旅行策略,生成符合条件的旅游线路,该模块是整个系统的核心功能模块。

主要算法

  • Dijkstra算法:求一个城市到其他所有城市的最短路径

  • Floyd算法:求任意两个城市之间的最短路径

算法思路

根据初始化的文本数据,将读取文件每一个城市抽象为一个节点,生成一个交通路线图,抽象边长为票价/路程的值,前两种策略则根据Floyd算法计算出最短路径生成,第三种策略则是先以时间为权重求得所有路径,然后计算每一条路径的费用,有路径满足,输出,否则,返回“无法满足需求”。

3.3 数据初始化模块

模块功能

该模块负责初始化载入已有的数据,包括交通工具的时刻表 / 航班表中的数据和登录账户的数据,便于系统的运行。

编写思路

建立时刻表、账户表的txt,通过行读取文件中的内容,初始化结构中的数据。

3.4 状态记录模块

模块功能

该模块是系统负责对当前旅客的乘车状态(包括所选交通工具、乘车时间、票价)以及系统所键入信息的记录,便于管理员进行管理。

编写思路

计时器每十秒钟(代表系统一个小时)刷新一次记录,实时保存当前系统的所有运行数据。

3.5 日志文件处理模块

模块功能

能够完成相应的对日志文件进行静态写入和查询结果输出操作的功能,方便管理员进行管理操作。

编写思路

打开状态记录日志文件,可以直接在日志上增添内容。

3.6 图形化界面生成模块

模块功能

利用Qt开发框架编写可视化的界面地图,实时显示用户当前的乘车信息,动态的展示旅客的行进路线。

编写思路

参考相关Qt应用程序开发框架的专业书籍。

四、结构定义

4.1 枚举相关变量

  1. enum Vehicle
  2. {Bus = 1,Train = 2,Flight = 3};//枚举交通工具变量值
  3. enum Travel_Strategy
  4. {MinCost = 1, MinTime = 2, Min_Cost_Time = 3};//枚举旅行策略变量值
  5. enum Action
  6. {T_Login = 1, A_Login = 2, Travel = 3, Search = 4};//枚举发生事件行为变量值

4.2 数据结构定义

  1. // 旅行计划表结构
  2. typedef struct{
  3. int mean; //交通方式
  4. int money; //该车次所需价格
  5. int StartTime;//该车次起始时间
  6. int EndTime; //该车次到达时间
  7. int Time; //该车运行时间
  8. }TIME;
  9. // 城市结点结构
  10. typedef struct {
  11. TIME Time[30];//一天最多一条路线十趟车,包含起始时间与到达时间
  12. int i; //路线个数
  13. }Path;
  14. // 交通图数据结构
  15. typedef struct {
  16. Path P[NN][NN];
  17. }Graph;
  18. // 交通图边的结构
  19. typedef pair <int,TIME> Road;
  20. // 旅行路线结构
  21. typedef struct{
  22. int z;
  23. string s;
  24. vector<Road> r;
  25. }Travel;

4.3 配置文件定义

4.3.1 时间表(航班表)

从左到右数据依次表示:

起始城市、终点城市、路线价格、出发时间、到达时间

(为了简便表示,我们在读取数据时用字母代替城市)哈尔滨(A) 北京(B) 上海(C) 广州(D) 武汉(E) 成都(F) 拉萨(G) 乌鲁木齐(H) 西宁(I) 福州(J) 重庆(K)

4.3.2 密码文本(航班表)

第一行代表数据库中存入的用户信息的账号,第二行是账户密码,第三行是用户的身份信息,user代表是普通旅客,admin代表是管理员。

4.3.3 日志文件

日志文件中包括事件发生的系统时间,余下一行是时间的类型,比如截图所示有“用户到来”、“管理员到来”、“用户注册”、“管理员注册”以及输出旅客查询的信息输出等。

五、接口函数以及类定义

Jmlog.h

  1. void searchlog(string a,string b,int c);
  2. void jmclear();
  3. void usercome(string a,int c,int b);

add.h

  1. class add;
  2. }
  3. class add : public QDialog
  4. {
  5. Q_OBJECT
  6. public:
  7. explicit add(QWidget *parent = 0);
  8. ~add();
  9. private slots:
  10. void on_pushButton_clicked();
  11. void on_pushButton_2_clicked();
  12. private:
  13. Ui::add *ui;
  14. };

Administrators.h

  1. namespace Ui {
  2. class administrators;
  3. }
  4. class administrators : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit administrators(QWidget *parent = 0);
  9. ~administrators();
  10. void MIMA(QString,QString);
  11. void Open();
  12. private slots:
  13. void on_pushButton_clicked();
  14. void on_pushButton_2_clicked();
  15. private:
  16. Ui::administrators *ui;
  17. };

Chenggong.h

  1. namespace Ui {
  2. class chenggong;
  3. }
  4. class chenggong : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit chenggong(QWidget *parent = 0);
  9. ~chenggong();
  10. private:
  11. Ui::chenggong *ui;
  12. };

Global.h

  1. extern Graph g;
  2. extern vector<Travel> TR;

Graph.h

  1. typedef struct{
  2. int mean;//交通方式
  3. int money;//该车次所需价格
  4. int StartTime;//该车次起始时间
  5. int EndTime;//该车次到达时间
  6. int Time;//该车运行时间
  7. }TIME;
  8. typedef struct {
  9. TIME Time[30];//一天最多一条路线十趟车,包含起始时间与到达时间
  10. int i;//路线个数
  11. }Path;
  12. typedef struct {
  13. Path P[NN][NN];
  14. }Graph;
  15. typedef pair <int,TIME> Road;
  16. typedef pair <int,string> TB;
  17. typedef pair <TB,vector<Road> > Travel;

Init.h

  1. int ToInt(char s[10]);
  2. void Print(Graph g);
  3. void Add(void);
  4. Graph Read(void);

Login.h

  1. namespace Ui {
  2. class login;
  3. }
  4. class login : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit login(QWidget *parent = 0);
  9. ~login();
  10. protected:
  11. void timerEvent(QTimerEvent * event);
  12. private slots:
  13. void on_denglu_clicked();
  14. void on_close_clicked();
  15. void on_zhuce_clicked();
  16. private:
  17. Ui::login *ui;
  18. int id1;
  19. };

Luxian.h

  1. namespace Ui {
  2. class luxian;
  3. }
  4. class luxian : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit luxian(QWidget *parent = 0);
  9. ~luxian();
  10. void Print(QString s);
  11. private:
  12. Ui::luxian *ui;
  13. };

Plan.h

  1. extern int t;
  2. extern int t1;
  3. bool fn(TIME a, TIME b);
  4. int minDistance(int dist[], bool sptSet[]);
  5. int Low_T(vector<Road> line);
  6. TIME my_min(Path p, int preT);
  7. TIME my_min_lim(Path p, int preT, int limit);
  8. vector<Road> dijkstraCost(Graph graph, int src, int dst);
  9. Travel pivot_inT(Graph graph, vector<int>p, int T,string &s);
  10. vector<Road> dijkstraTime(Graph graph, int src, int dst, int T);
  11. vector<Road> dijkstraCost_T(Graph graph,int src,int dst,int T,int L);
  12. Travel pivot_inW(Graph graph, vector<int>p,string &s);
  13. Travel pivot_in_limit(Graph graph,vector<int>p,int T,int L,string&s);
  14. string Changecity(int a);
  15. string Changetime(int m);
  16. int Backcity(QString s);
  17. int Backtime(QString s);

Search.h

  1. namespace Ui {
  2. class searcha;
  3. }
  4. extern int t;
  5. class searcha : public QDialog
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit searcha(QWidget *parent = 0);
  10. ~searcha();
  11. private slots:
  12. void on_pushButton_2_clicked();
  13. void on_pushButton_clicked();
  14. void on_pushButton_3_clicked();
  15. private:
  16. Ui::searcha *ui;
  17. };

Users.h

  1. namespace Ui {
  2. class Users;
  3. }
  4. class Users : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit Users(QWidget *parent = 0);
  9. ~Users();
  10. void MIMA(QString,QString);
  11. private slots:
  12. void on_pushButton_clicked();
  13. void on_queding_clicked();
  14. protected:
  15. void timerEvent(QTimerEvent *event);
  16. private:
  17. Ui::Users *ui;
  18. int id1;
  19. };

Watch.h

  1. extern int t;//系统时间
  2. extern string name;//用户名
  3. namespace Ui {
  4. class watch;
  5. }
  6. class watch : public QDialog
  7. {
  8. Q_OBJECT
  9. public:
  10. explicit watch(QWidget *parent = 0);
  11. ~watch();
  12. protected:
  13. void timerEvent(QTimerEvent * event);
  14. void paintEvent(QPaintEvent * event);
  15. void mousePressEvent(QMouseEvent *e);
  16. private:
  17. Ui::watch *ui;
  18. int id2;
  19. QPixmap *pix;
  20. };
  21. void coordinate(int t,int &m,int &n);
  22. void change(int a,int &m,int &n);

Wrong.h

  1. namespace Ui {
  2. class wrong;
  3. }
  4. class wrong : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit wrong(QWidget *parent = 0);
  9. ~wrong();
  10. private:
  11. Ui::wrong *ui;
  12. };

Zhanghu.h

  1. extern int t;
  2. void write(string a,string b,string c);
  3. int judge(string a,string b,string c);

Zhuce.h

  1. namespace Ui {
  2. class zhuce;
  3. }
  4. class zhuce : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit zhuce(QWidget *parent = 0);
  9. ~zhuce();
  10. private:
  11. Ui::zhuce *ui;
  12. };

六、核心算法描述

6.1 程序流程图

6.2 费用最少策略

以费用为权值,使用dijkstra算法寻找从出发点到其余点的最短路径,并在寻找过程中保存每一点的前驱,寻找完成后,通过前驱记录,构建出由源点到终点的路径。

6.3 时间最少策略

以时间为权值,使用dijkstra算法寻找从出发点到其余点的最短路径,并在寻找过程中保存每一点的前驱,寻找完成后,通过前驱记录,构建出由源点到终点的路径。

6.4 限时费用最少

基于时间最短策略求得的最短时间T,先对限制时间t进行判断,若满足T <= t,则以时间和费用为权值,分段寻找最短短路径,否则给出给出时间最少策略的路径。

七、测试

7.1 范例信息

  • 旅客信息

    • 账号:12345678
    • 密码:12345678
    • 路线:北京——广州
    • 旅客出发时间:1点
    • 途径城市:上海、武汉
    • 策略:最短时间策略
  • 管理员信息

    • 账号:12345678
    • 密码:12345678
    • 执行操作:查看日志信息、观察用户状态、添加路线信息,检查添加路线信息
    • 路线添加详细信息:
      • 起始地点:重庆——福州
      • 交通方式:火车(用“1”代替)
      • 起始时间:2点
      • 终止时间:23点
      • 价格:876元

7.2 测试截图

7.2.1 普通旅客登录

注册用户信息,注册成功,点击登录按钮,登录成功。

输入路线信息,北京作为起始站,终止站为广州,设置武汉、上海为途径城市,选择最短时间策略。

路线信息中包含中转信息,包括中转站点,交通方式,起始时间和终止时间,路线保存在日志文件中。

如下图所示,用火车图案代表乘火车,飞机图案代表乘飞机,汽车图案代表乘坐汽车,将路线结果展示在图形界面中。

7.2.2 管理员登录

管理员直接注册账号后进行登录。

右边的文本框显示旅客操作的信息,包括登录信息、旅行计划信息等,用下拉可以看清所有结果。

观察用户状态和之前截图所示的一样,动态显示出当前用户的旅行计划状态,在图形化界面上显示。

在输入框中输入需要添加的路线信息,包括起止时间,起止站点,交通方式,以及旅行价格,点击确认后提示成功。

添加信息结构位于数据中的最后一排,根据如图所示,添加路线信息成功,如有不合适,可以直接删除。

7.3 结果分析

根据以上的程序执行结果的截图,整个程序执行期间没有出现停机状态,说明健壮性良好;根据用户的输入结果,程序可以输出相应的路线信息,经过线下按照实际录入信息的数据计算比对,策略吻合程度较高,基本满足算法正确性的要求;程序可以准确的记录下程序运行期间所发生的事件,通过添加路线的功能,管理员能够实时更新路线信息,更加符合实际程序运行的需要;图形界面显示方面,虽然没有能够实现很完美的表现用户状态很清晰的实时显示,不过基本的动态效果可以实现,能够将文字化的路线信息转成图形化表示。

上传的附件 cloud_download 基于QT实现的旅游路线查询系统.7z ( 13.27mb, 4次下载 )
error_outline 下载需要15点积分

发送私信

人生就像马拉松,获胜的关键不在于瞬间的爆发

8
文章数
18
评论数
最近文章
eject