1.1 题目
上海的地铁交通网络已经基本成型,建成的地铁线十多条,站点上百个,现需建立一个换乘指南打印系统,通过输入起点和终点站,打印出地铁换乘指南,指南内容包括起点站、换乘站、终点站。
图形化显示地铁网络结构,能动态添加地铁线路和地铁站点
根据输入起点和终点站,显示地铁换乘指南
通过图形界面显示乘除路径
1.2 软件功能
功能主要功能包含地铁网络线路的查看,地铁换乘指南查询,动态添加线路站点等。
线路图查看
查看上海地铁网络线路图,包括通过键盘、鼠标拖放、放大缩小等简易查看操作
查看地铁线路信息,包括线路段、包含站点等
查看地铁站的详细信息,包括站点地理坐标、所属线路等
换乘指南查询
提供地铁换乘查询,可通过视图方便的查看乘坐路线和换乘路线
提供最小出行时间的换乘策略指南
提供最小换乘次数的换乘策略指南
动态添加线路
动态添加线路,可根据需要新增线路
动态添加站点,可根据需要新增站点
动态添加连接,可根据需要新增站点连接
文本方式简易添加,方便快捷
帮助
提供软件使用帮助和说明
关于
提供软件制作信息
上述所有功能采用面向对象的方法通过C++语言程序结合QT框架实现,后面会详细介绍。
1.3 设计思想系统分析,明确功能要求
在做应用程序之前都会先明确软件的需求是什么,知道了要实现那些功能才能去细化用什么方法实现,实现的系统架构是什么,初步规划程序的基本流程和核心算法。在认真读题后,明确功能要求后,开始下一步操作。
MVC模式系统架构
MVC模式即为模型-视图-控制器结构模式,这种软件架构模式是一种常用的设计。在本次系统结构中,大致采用此种模式,前后端实现分离,前端主要考虑与用户的交互,例如设计怎样的视图,地铁网络线路图如何展现等,后端主要是数据和算法的处理,将复杂的功能和数据交由后端处理,前后端实现函数接口,从而完成整个软件系统的架构设计。
设计后端数据结构和接口
本次综合应用程序,基本上的数据结构都有涉及,例如网络线路的连接情况需用图结构、算法实现有队列,静态存储有线性表,名字到存储位置有哈希映射,分析好数据结构之后,根据需要将后端系统的接口进行设计,例如最短路径的查询、添加线路站点等均需接口。
分块实现,逐步求精
系统结构和数据结构、算法等相应设计好后,就开始逐步实施了,从前端开始,对每个功能要求的前端界面和交互进行细化,实现前端代码,对每个功能的前端实现后,完善后端接口函数,完成所有前端后,后端也基本同步完成,从而完成整个程序的实现。
数据结构分析
本次程序设计站点、线路及其关系的存储表示和相应的算法,所有线路和站点名字是唯一的,表示线路的网络关系时,每个站点可看做一个节点,站点的联系看做一条边,网络结构显然用图结构存储,对每个站点和线路来讲,不会有删除操作,会有添加要求,最频繁的是查询需求,所以用顺序表存放最为合适,将站点和线路名和存储位置的下标值进行哈希关联,可方便访问。
核心算法流程
迪杰斯特拉算法求短距离换乘:
1.4 逻辑结构与物理结构
1.4.1 站点
1.4.2 线路
1.4.3 后端实现类
1.5 开发平台
开发平台
计算机型号:惠普Pavilion M4
计算机内存:4.00GB
CPU:Intel Core i5 2.6GHz
操作系统:Windows 10 家庭版
开发语言:C++(C++11标准以上)
开发框架:QT
集成开发环境:Qt Version 5.9.1
编译器:MinGW 32bit
运行环境
可在上述集成环境下运行;
通过windeployqt.exe及Enigma Virtual Box进行整合压缩为发布为了一个LinkListVisualizer.exe文件,可在普通Windows机型下运行
1.6 系统的运行结果分析说明
1.6.1 调试及开发过程
1.6.1.1 调试
本次开发采用的是新技术框架Qt,同时也是跨平台的,在Qt Creator中开发调试,Qt中包含了大量的库类,类似于java开发简便,Qt有较好的调试器,但是在本次开发中没有用到,偶尔遇到一些小麻烦或者小bug,我们只需在控制台中输出一些数据便可分析定位错误原因。
例如:
输出:
1.6.1.2 开发
有了前面Qt数据结构算法实现设计题的基础,对Qt的了解也由浅入深了,开发也相对熟练。开发时,遵循将后端系统和前端用户交互分开,先思考后端系统的核心数据结构的表示和存储,如何实现题目所要求的相应功能,设计核心算法,然后设计了前端和后端的程序接口,搭建好整个综合应用程序的主体框架,最后是分布实施,将各个模块由大化小,逐步求精,完成整个程序的开发。
1.6.2 成果分析
1.6.2.1 正确性
经过多次不同角度的验证,程序表现的十分优秀,与预期没有任何差错。
换乘查询和最短时间查询
例如选择“上海汽车城”到“同济大学”,线路如下:
视图显示线路
最少换乘查询
例如选择“上海汽车城”到“同济大学”,线路如下:
换乘显示
添加新线路成功
添加新站点成功
地图显示新加站点
添加新连接成功
地图显示
换乘检验
文本添加
添加后显示
1.6.2.2 稳定性无论是在放大窗口或是小窗口程序都未有任何异常,视图和右侧栏会随窗口大小自动调节
运行速度非常快,所有操作都是在1s之内响应和得出结果
所有操作都会及时更新,例如:添加新的线路和站点后,所有用户接口界面中的数据都会进行立马更新,视图也会立马显示新加线路和站点
经过多次调试和反复测试,程序没有任何异常情况
1.6.2.3 容错能力
本应用程序做了很多针对用户输入和非法操作的容错处理,无论用户怎样操作,很难出现一些非法情况,即使有,也会被程序处理,固有非常好的容错能力,一些样例如下:
非法操作均有提示
输入利用控件保证输入的正确性;
输入的合理性通过输入控件保证,例如输入经纬度时,输入其它非法字符将不会处理,输入范围被确定,其它范围是无法输入的。
添加或选择只能从指定数据中选择:
1.7 操作说明
按照题目的要求,本应用程序主要包含两大功能,换乘查询和动态添加线路。通过前面介绍的运行环境下进行程序的运行。
1.7.1 视图查看
视图放大
点击工具栏中放大按钮
或选择“视图”下“放大”
或按下快捷键“Ctrl+L”
或直接在视图区域进行鼠标滚轮放大操作
可进行视图的放大,方便查看。
视图缩小
点击工具栏中缩小按钮
或选择“视图”下“缩小”
或按下快捷键“Ctrl+S”
或直接在视图区域进行鼠标滚轮缩小操作
可进行视图的缩小,方便查看。
鼠标操作
鼠标除能直接放大和缩小视图外,在查看视图信息有重要作用:
鼠标滚轮直接放大缩小视图
通过鼠标点击后拖动,可直接进行视图移动
将鼠标悬停在站点上,会提示站点的详细信息,如悬停在“曹杨路”站上,会有曹杨路地铁站的详细信息
将鼠标悬停在线路上,会提示线路的详细信息,如悬停在“曹杨路”站和“镇坪路”之间线路上,会有线路的详细信息;
1.7.2 换乘查询
选择起始和目标站点,直接选择即可,如下:
最小时间换乘查询
选择“起点站”、“终点站”、“换乘策略”为“所需时间最短”后,点击换乘,可得相应线路。
换乘后文本栏会有相应线路,视图区有详细路径,通过前面所述视图查看操作可方便查看。
换乘次数最少查询
选择“起点站”、“终点站”、“换乘策略”为“换乘次数最少”后,点击换乘,可得相应线路。
换乘后文本栏会有相应线路换乘方法,视图区绘制出,通过前面所述视图查看操作可方便查看。
换乘查询后,点击下图按钮,或选择“视图”下“地铁图”,或按下快捷键“Ctrl+M”可重新查看网络线路图。
1.7.3 动态添加
动态添加主要包含添加线路,添加站点,添加连接,文本简易添加,在工具栏中如下:
添加线路点击工具栏中如下;或选择“工具”下“添加”中“线路”;或快捷键“Ctrl+Shift+L”可添加线路
上述操作后弹出添加对话框,按相应操作可添加线路。
添加站点点击工具栏中如下;或选择“工具”下“添加”中“站点”;或快捷键“Ctrl+Shift+S”;可添加站点
上述操作后弹出添加对话框,按相应操作可添加站点。
添加连接,点击工具栏中如下;或选择“工具”下“添加”中“连接”;或快捷键“Ctrl+Shift+C”;可添加连接
上述操作后弹出添加对话框,按相应操作可添加连接。(其中站点可直接输入快捷查找)
添加连接,点击工具栏中如下;或选择“工具”下“添加”中“文本方式”;或快捷键“Ctrl+Shift+T”;可文本添加
上述操作后弹出添加框,按提示输入即可。
1.7.4 工具栏和状态栏
选择“查看”,弹出“工具栏”和“状态栏”选项,通过点击其前选择框,可选择是否显示。
无工具栏,如下:
状态栏,如下:
2.1 所做的工作学习和运用了Qt5的编程架构和相关知识
独立完成课程设计中的综合应用题目的所有设计、编程实现、测试等工作
完成课程设计报告一份
2.2 总结和收获
2.2.1 能力提升
完成数据结构课程设计后,感觉自身的自学能力有了很大提升。在课程设计以前,基本上所有的编程知识都是由老师言传身受、一点一滴的对我们进行指导,我们自学的东西较少,自学能力也锻炼的少。但是这次的课程设计的所有工作,都是由我们自己去选择相应的技术学习实现,仅仅掌握基本编程语言的我们通过自学来完成这次课程设计。在这个过程中,大学生尤其是计算机专业的大学生所需要的自学能力得到了必须的锻炼,对以后所有的技术和知识的自学,这将是一个有意义的开端,现在我们已经掌握了如何快速学习一门技术的能力,对以后学习和工作中的所有挑战做好了准备。
2.2.2 收获
虽然课程设计只有看似算法设计和综合应用实现两个题目,但是从布置课程设计题目到完成的整个过程中,不仅仅是学习到了以前未曾接触过的标准用户交互程序,从简陋的控制台程序提升到界面友好、美观、人性化的应用程序,打开了编程的一扇大门,同时也从心态、自学能力、解决未知问题能力等内在的综合实力有了全新的提升。
具体来说,学习了Qt的编程框架,包括元对象机制、基本控件的掌握、绘图框架、模型编程、文件操作等相关知识;
学习到了openstreetmap等开源地图数据的获取和提炼等知识,自身技术能力又上了一个台阶。
在软实力上,打开了用户界面编程的大门,激发自身对编程的热情和后面学习的动力;通过自学实现了课程设计,自身的学习能力得到了有效锻炼;开发的过程中,无论是设计还是编程,都会遇到各种各样的问题,通过独立解决这些疑难杂症,在独立解决问题的能力方面也得到了很大提升;最重要的是,树立不惧所有未知知识、解决疑难问题、接受各种挑战的信心。
2.2.3 个人体会
在学习和实现的过程中体会和领悟还是比较的多,这里挑出感触最深的几点吧。
第一,做事情一定要找最重要的事情先做,这样做事情才有效率,不拖拉。由于个人比较追求完美,对程序的用户界面和一些细节很是用心,但是这样就好浪费很多时间,效率不高,应该先做好最重要的事情,例如最不可缺少的功能实现,主体实现然后细节修改,而不是本末倒置。
第二,学到的东西不一定都用的到,所以开发还是有一些功利心较好,用到什么然后去学习相应的知识并用到实处,这样才能学以致用,恰到好处。在一开始的学习中,每天看书看教程,发现过去了几天还是什么都不会,然后边学边做,才领悟到学习方法和要点。