Tips:这个系统是学校《大数据应用开发语言》的大作业,本身想直接在网上copy一下,结果发现校园导航系统的c/java等版本很多很多,而python版本非常之少,于是只能自己写一个简单版本的了。包含三个模块:查询学校地图模块、查询两点最短路径、查询多路径信息。
文章目录
前言
随着社会经济的发展,政府对教育建设的投资越来越大。众多高校开始扩建工程,校园占地面积大,楼宇种类多。体现出国家对教育的重视程度逐年上升,科教兴国战略时首当其冲。面对越来越大的学校,“迷路”成为众多高校新生不得面临的话题,这便需要校园导航系统来解决师生如何查询楼宇、如何快速到达目的地问题。
本系统采取基于Floyd算法来完成查询两点最短路径、查询多路径信息等问题。
一、题目
功能描述:设计你的学校的校园景点,所含景点不少于10个.有景点名称,代号,简介等信息; 为来访客人提供图中任意景点相关信息的查询.测试数据:由读者根据实际情况指定.
二、需求分析
1.要求
(1)用Python语言实现程序设计;
(2)进行相关信息处理;
(3)画出查询模块的流程图;
(4)系统的各个功能模块要求用函数的形式实现;
(5)界面友好(良好的人机互交),程序要有注释。
2.运行环境
(1)MacOS Big Sur 11.6.2系统
(2)PyCharm CE 2021
3.开发语言
大数据开发语言(Python)
三、概要设计
1.系统流程图

2.函数流程图

四、详细设计
1.类的分析与设计
定义一个Attractions类来实现输入和存放景点编号、名称。
class Attractions:
num = 0 #景点编号
name = '' #景点名称
定义一个Campus类来存放校园无向图的边和节点,并给各结点定义名称。
class Campus:
att = ["","南大门","行政楼","三号楼","四号楼","图书馆","西大门","7号楼","八号楼","九号楼","操场","体育馆","大操场"] #景点
edges = [[INF] * M] * M #边
Nodes_Num = 0
edges_Num = 0 #总结点数,总边数
定义一个Passing类来存放路径栈、路径数、栈顶数
class passing():
pathStack = [[0]*M] ##路径栈
top = 0
count = 0 #栈顶位置,路径数
visited = [[False]*M] #判断是否已经经过
定义一个DIS类来存放path路径和distence目的地。
class DIS:
distence = [[0] * M] * M #距离向量
path = [[0] * M] * M
2.函数的分析与设计
定义函数getCampus()来读取本地map.txt地图信息,将读出来的数据放在Nodes_Num数组和edges二维数组中。
def getCampus(g):
file = r'./map.txt'
with open(file) as f:
i = 0
for line in f:
if i == 0:
tmp1,tmp2 = line.split(',')
g.Nodes_Num = int(tmp1)
g.edges_Num = int(tmp2)
i = 1
else:
x, y, w = line.split(',')
g.edges[int(x)][int(y)] = g.edges[int(y)][int(x)] = int(w)
定义check函数来判断输入字符是否合规,如果输入正确返回True,错误返回False。
def check(ch):
if ch < 0 or ch > 12:
print("\n您的输入有误,请输入0~12之间的数字!")
return False
else:
return True
定义getinf()函数来查询想要了解的景点信息
def getinf(g):
poi = int(input("请输入您想了解到景点,0结束:"))
while poi != 0:
print("以下是该景点信息:")
print(g.inf[poi])
poi = int(input("请输入您想了解到景点,0结束:"))
定义Search函数来实现查询景点功能
def Search(g):
number = 0
while True:
putMap()
print("请问您想查看哪个景点(请输入景点编号,输入0结束):")
input(number)
# system("cls") #清空屏幕
if(check(number)):
if(number == 0):
break
else:
print("景点编号:{}".format(g.att[number].num))
print("景点名称:{}".format(g.att[number]))
定义shrotPath最短路径函数中用三个for循环语句就能实现。
def shortPath(g,dis):
for i in range(1,g.Nodes_Num+1): #初始化距离向量矩阵与路径向量矩阵
for j in range(1,g.Nodes_Num+1):
dis.distence[i][j] = g.edges[i][j]
if i != j and dis.distence[i][j] != INF:
dis.path[i][j] = i #表示如果i和j相邻,i到j需要经过i
else:
dis.path[i][j] = -1 #否则用 -1代表当前两点不可达
for k in range(1,g.Nodes_Num+1): #递推求解每两景点的最短路径
for i in range(1,g.Nodes_Num+1):
for j in range(1,g.Nodes_Num+1):
if dis.distence[i][j] > (dis.distence[i][k] + dis.distence[k][j]): #如果发现引入k点可以使得路径更短
dis.distence[i][j] = dis.distence[i][k] + dis.distence[k][j] #更新最短路径长度
dis.path[i][j] = k
定义最佳路径函数bestPath来实现最佳路径功能
def bestPath(g,dis):
vNum = [0,0,0,0,0,0,0,0,0,0,0,0,0]
count = 1 #记录用户输入的编号信息
len = 0 #统计全程路径总长
vNum[count] = int(input(" 请输入你要游览的景点的编号(输入0结束输入):"))
while vNum[count] != 0 and count <= 12:
if vNum[count] == 0:
break
count += 1
vNum[count] = int(input(" 请输入你要游览的景点的编号(输入0结束输入):"))
print(" 已为您挑选最佳访问路径:")
i = 1
while vNum[i] > 0 and vNum[i + 1] > 0 : #遍历所有输入的景点
print("{}->".format( g.att[vNum[i]]),end='') #输出路径上的起点
Floyd_Print(g,dis, vNum[i],vNum[i + 1]) #利用Floyd算法得到这两点之间的最短路径
len += dis.distence[vNum[i]][vNum[i + 1]] #算出最短路长度
i += 1
print(g.att[vNum[count - 1]]) #输出路径上的终点
print(" 全程总长为:{}m".format(len))
用打印函数print_shortPath()和Floyd_Path()通过递归实现打印两点间的最短路径,并将结果显示到控制台上。
def Floyd_Print(g,dis,start,end):
#递归基:如果两点相邻或者两点不可达,结束递归
if dis.path[start][end] == -1 or dis.path[start][end] == end or dis.path[start][end] == start:
return
else:
Floyd_Print(g,dis, start, dis.path[start]

本文档详述了一个使用Python编程语言开发的校园导航系统,系统基于Floyd算法实现查询两点最短路径和多路径信息。系统包含查询学校地图、景点信息、最短路径等功能,界面友好且具有良好的人机交互。开发者在找不到Python版本的校园导航系统实例后,决定自己动手编写,实现了包括景点信息存储、最短路径计算等多个模块。
最低0.47元/天 解锁文章
2102

被折叠的 条评论
为什么被折叠?



