一月份的数据结构课设完成后,我对Python的了解也更加深刻。现将课设报告及源码开源,不足之处希望大家指正。源码我放在博客主页的资源中,需要的话大家自行下载(用户信息保存在 users.json 文件中,地图信息保存在 campus_map.json 文件中,源码在 main.py 中。)。
一. 设计目的
本次课程设计旨在完善和拓展校园导航系统,使其更具实用性和用户友好性。通过该系统,用户能够轻松查询校园内地点信息、获取最短路径和相关路径信息,同时实现对校园平面图的灵活管理,包括地点和路径的增加、删除、查询等功能。在完善系统的同时,设计目的还包括强调对数据结构概念的深入理解和实际运用,培养学生在软件设计和实现方面的综合能力,尤其注重系统设计、用户体验和团队协作等方面的技能。
二. 设计内容
用户管理模块:
提供用户登录、注册、注销功能。
管理用户信息,包括用户名、密码、用户类型等。
用户友好的登录和注册界面,通过弹窗给予用户清晰的反馈。
地图管理模块:
管理校园平面图信息,包括地点和路径。
提供地点和路径的增加、删除、查询功能。
实现地图信息的存储和读取功能,支持从文件加载和保存到文件。
路径查询模块:
实现最短路径查询算法,包括最短简单路径和带权长度最短路径。
提供用户界面,让用户输入起始地点和目标地点,显示查询结果。
用户界面模块:
使用 tkinter 模块设计用户界面。
提供登录后的主菜单,包括查询地点信息、查询路径、相关路径查询、增加路线、撤销路线、增加新地点、撤销旧地点、查看地图、注销等功能。
系统运行模块:
利用主循环实现系统的运行逻辑。
管理用户登录状态,根据用户操作调用相应的功能模块。
异常处理模块:
在关键位置添加异常处理机制,确保系统对用户输入非法或操作无效时能够给予清晰的提示。
文件操作模块:
提供用户信息和地图信息的读取和保存功能,保证数据的持久性。
创新性和扩展性考虑:
在用户界面和功能上添加创新性设计,如图形界面、动态演示等。
在系统设计中考虑扩展性,使得今后可以轻松添加新的功能或模块。
三.概要设计
1.功能模块图;
系统运行模块 用户管理模块 菜单信息模块 地图管理模块 路径查询模块 文件操作模块
2.各个模块详细的功能描述。
系统运行模块:
功能: 管理整个系统的启动和运行,协调不同模块的交互。
详述: 负责初始化系统,处理用户登录和退出系统的流程,维护用户当前状态,确保系统能够在用户进行不同操作时正常切换状态。
用户管理模块:
功能: 处理用户相关的操作,包括用户登录、注册、注销和权限管理。
详述: 提供用户注册、登录和注销的功能,验证用户身份,管理用户权限,确保系统安全可靠。与权限相关的操作如管理员功能在此模块实现。
菜单信息模块:
功能: 维护用户可用功能列表,根据用户类型动态生成菜单。
详述: 存储并管理用户可用的功能菜单,不同用户类型可能有不同的菜单权限。该模块与用户管理模块协作,确保用户在登录后能够看到并选择系统提供的各项功能。
地图管理模块:
功能: 管理校园平面图的地点和路径信息,包括增加、删除、查询地点和路径。
详述: 提供添加、删除、查询地点和路径的接口,维护整个校园平面图的数据结构。负责地点的坐标信息、地点属性等的管理。
路径查询模块:
功能: 实现最短路径和相关路径查询算法,支持多种查询方式。
详述: 包括最短路径查询和相关路径查询功能,根据用户输入的起点和终点,计算并返回路径信息。支持不同查询方式,如最短简单路径、带权长度最短路径等。
文件操作模块:
功能: 处理用户信息和地图信息的文件读写操作,确保数据的持久性。
详述: 提供从文件加载用户信息和地图信息的功能,以及将用户信息和地图信息保存到文件的功能。在系统启动和退出时,负责加载和保存数据,保证数据的一致性和可恢复性。
四.详细设计
1.功能函数的调用关系图
2.各功能函数的数据流程图
1、用户登录过程:
函数: login(username, password)
输入: 用户名和密码
处理: 验证输入的用户名和密码是否匹配系统中保存的用户信息
输出: 登录成功或失败的消息
2、用户注册过程:
函数: register(username, password, user_type)
输入: 新用户的用户名、密码和用户类型
处理: 将新用户信息添加到系统中保存的用户信息中
输出: 注册成功或失败的消息
3、查询路径过程:
函数: query_route(start, end)
输入: 起点和终点
处理: 使用最短路径查询算法和排序算法获取路径信息
输出: 最短路径和排序的可通行路径信息
4、添加新地点过程:
函数: add_location(vertex_name, x, y, data)
输入: 新地点的名称、坐标和其他信息
处理: 将新地点信息添加到系统中保存的地点信息中
输出: 无明确输出
5、移除地点过程:
函数: remove_location(vertex_name)
输入: 地点名称
处理: 从系统中保存的地点信息中移除指定地点
输出: 无明确输出
6、增加路线过程:
函数: add_route(start, end, weight=None)
输入: 起点、终点和路径权重
处理: 将新路径信息添加到系统中保存的路径信息中
输出: 无明确输出
7、移除路线过程:
函数: remove_route(start, end)
输入: 起点和终点
处理: 从系统中保存的路径信息中移除指定路径
输出: 无明确输出
8、查看地图过程:
函数: view_map_ui()
输入: 无
处理: 创建并显示包含地点和路径信息的地图界面
输出: 无明确输出
9、注销过程:
函数: logout()
输入: 无
处理: 注销当前登录用户
输出: 注销成功的消息
3.重点设计及编码
1. 路径查询算法:
算法选择: 系统使用深度优先搜索(DFS)实现路径查询算法。在实现中,使用递归方式搜索所有可能的路径,找到最短路径和按带权值排序的路径列表。
函数: shortest_path(start, end, visited=None, path=None)
具体实现:
使用DFS递归搜索所有路径。
记录已访问过的节点,避免循环。
返回最短路径。
2. 用户管理逻辑:
用户信息存储: 用户信息以字典形式存储在self.users中,包括用户名、密码和用户类型。
登录: 通过验证输入的用户名和密码,确认用户身份。
注册: 将新用户信息添加到self.users中。
注销: 将当前用户置为None,完成注销过程。
3. 地图信息管理:
地点信息存储: 地点信息以字典形式存储在self.vertices中,包括位置坐标等信息。
路径信息存储: 路径信息以字典形式存储在self.edges中,每个地点对应一个包含邻居和权重的列表。
地图文件存储: 使用JSON格式将地图信息保存到文件,以便在系统启动时加载。
增加新地点: 将新地点信息添加到self.vertices中,保存到文件。
移除地点: 从self.vertices中移除指定地点,并更新所有包含该地点的路径,保存到文件。
增加路线: 将新路径信息添加到self.edges中,保存到文件。
移除路线: 从self.edges中移除指定路径,保存到文件。
五.测试数据及运行结果
1.正常测试数据和运行结果
第一组:查询路径
数据:逸夫——安悦
运行结果:给出最简路径,并给出所有可通行路径且按照权值大小排序
第二组:增加点,增加边
增加点:
数据:aaa、200、300
运行结果:地图上显示一个点并标注名称为aaa
增加边:
数据:aaa、东升、200
运行结果:地图上通过直线将aaa与东升相连并标注权值为200
第三组:相关路径查询
数据:图书馆
运行结果:显示图书馆能到的所有地点并表明权值
2.异常测试数据及运行结果
第一组:登录出错
数据:nihoa、111111
运行结果:由于没有注册这个账号,所以会显示账号或密码错误
第二组:查询没有的路径
数据:图书馆、西宛
运行结果:由于没有相关路径,所以会显示未找到相关路径
六.调试情况,设计技巧及体会
1. 改进方案
不足之处:
用户界面设计简陋: 界面以基本的文本和简单的弹窗为主,缺乏直观的图形用户界面(GUI),可能降低用户体验。
算法选择: 路径查询算法采用深度优先搜索,这在大型图中可能导致性能问题。可以考虑更高效的最短路径算法,如Dijkstra算法。
异常处理不完善: 目前的实现对于各种异常情况的处理较为简单,可以加强对用户输入、文件读写等方面的异常情况处理,提高系统的稳定性。
代码结构: 目前代码虽然进行了模块化,但在某些地方还可以进一步优化,例如将界面和逻辑代码更好地分离,提高代码的可读性和可维护性。
改进方案:
引入图形用户界面(GUI): 使用专业的GUI库设计直观友好的界面,提升用户体验。界面应该包括地图的可视化展示、用户交互等。
采用更高效的路径查询算法: 考虑替换深度优先搜索算法为更高效的算法,如Dijkstra算法,以提高路径查询的性能。
完善异常处理机制: 在关键操作中加入更多的异常处理机制,向用户提供清晰的错误信息,帮助用户理解并解决问题。
优化代码结构: 进一步优化代码结构,确保代码清晰、模块化,提高可读性和可维护性。可以考虑使用面向对象的设计思想,将不同功能划分为更独立的类。
2.体会
在设计和调试过程中,面对系统的复杂性和功能的丰富性,我深切体会到了设计的挑战。首先,确定合适的数据结构和算法对于实现一个校园导航系统至关重要。通过深入理解问题的本质,我选择了深度优先搜索算法来实现路径查询功能。这一选择的挑战在于确保算法的效率和准确性,需要细致考虑各种情况。
在设计时,用户体验成为我的首要考虑因素。我着重于确保系统界面的直观性和操作的简便性,以提高用户的满意度。模块化设计是我的另一个关注点,通过将系统划分为小模块,不仅提高了代码的可维护性,还有助于更好地理解系统的结构和功能。
在调试过程中,我采用了模块测试的策略。每完成一个功能模块的实现,我会对其进行单元测试,确保其功能的正确性。同时,我充分考虑了各种异常情况,实现了健壮的系统。给用户提供友好的错误提示是保障系统稳定性的一项重要工作。
总的来说,设计和调试过程是一个不断挑战和提高自己的过程。通过对系统进行模块化设计、注重用户体验、深入理解问题本质以及灵活运用调试方法,我逐渐克服了面临的挑战,为系统的顺利实现和优化奠定了基础。