求一个计算城市公交单源最短路径算法法,要求计算换乘和拥堵。最好是简单点的,做毕设用

君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
最短路径算法的研究毕业设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口dijkstra算法:寻找到全图各点的最短路径 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了8572字,被4人关注,获得了7个喜欢
dijkstra算法:寻找到全图各点的最短路径
dijkstra算法介绍:即迪杰斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先的搜索方法。dijkstra算法原理:最优子路径存在。假设从S→E存在一条最短路径SE,且该路径经过点A,那么可以确定SA子路径一定是S→A的最短路径。证明:反证法。如果子路径SA不是最短的,那么就必然存在一条更短的'SA,从而SE路径也就不是最短,与原假设矛盾。dijkstra算法缺点:与此前说过的viterbi不同,此算法能够求出从起点到其余每个结点的最短路径,所以需要遍历所有的路径和结点,计算复杂度比较大。dijkstra算法例子:求从结点0到各个结点的最短路径。
step1:首先建立两个集合S={}:表示已经找到最短路径的结点;U={}:表示尚未找到最短路径的结点。显然,S与U互为补集,S U U=所有结点组成的集合,当U为空的时候算法结束,所有结点最短路径均已找到。step2:建立一个数组dist[i],用于存放起点0到该结点i的最短路径(可能需要更新,接下来会解释)。然后再建立一个布尔数组s[i](初值均为0),用于表示该结点是否已经找到最短路径,如已经找到便不再遍历。step3:具体执行部分:A:初始点设定。对于结点0,首先将其纳入到S集合中,然后寻找并计算与结点0直接相连路径的长度,即dist[1]=100,dist[30]=2,dist[4]=10(这时dist[0]=0)。而不能直接到达的结点距离为无限大∞。这里使用dist[3]=99999,方便程序比较大小。然后使s[0]=1,表示已经遍历过该结点。B:选取最小dist[i]。比较dist[1],dist[3],dist[4]的长度,选择长度最短的dist[4],并将结点4纳入到S集合中,令s[4]=1,表明0到4的最短路径已经找到,且值为10。原因:最优子路径存在原理。由于dist[1],dist[3]均大于dist[4],所以若选择走经过结点1、3到达结点4路径,无论如何也不可能找到一条小于直接从结点0到结点4的路径!这个结论非常非常非常重要,是理解这个算法的关键!后面会反复用到,每一轮循环都要比较并选取最小的dist[i]。C:更新dist[i]。现在,我们开始以结点4为中心向外扩展(广度优先)。现在,结点4可以到达结点3了,也表明从结点0可以通过结点4到达结点3了。至于要更新dist[i]的原因如下图:在第一次选择中,我们纳入了起点A,然后由于dist[C]=6&dist[B]=20,我们又纳入了C点。这时,我们发现我们还可以通过C点到达B点,所以我们必须比较dist[B]与dist[C]+|CB|的大小。这以下这个例子中,显然6+7=13&20,所以dist[B]需要从20更新成13。所以,我们不难发现:每纳入一个新的结点,我们都需要比较由这个结点新扩展出来结点所生成路径与原来路径的长度。
step4:重复上述步骤B、C,直到U集合清空,s[i]中所有值均为1。这就表明图中所有点都找到了最短路径。
下面放出以上例子的步骤表,如果能理解就表明基本了解dijkstra算法的思想了。
最后,从结点0到各个点的最短路径就都算出来了。dijkstra算法重点:理解为何需要选取最小的dist[i];理解为何需要更新dist[i]。
以下是具体C++代码实现,这里还加入了最短路径经过结点的记录。
#include &iostream&
const int maxnum = 100;
const int maxint = 999999;
void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])
bool s[maxnum];
// 判断是否已存入该点到S集合中
// 确认起始节点并设置相关参数
for(int i=1; i&=n; ++i)
dist[i] = c[v][i];
// 将邻接矩阵中数据传入dist[]中
// 初始所有点都未纳入S中
if(dist[i] == maxint)
prev[i] = 0;
// 该点暂时没找到前驱结点
// 该点的前驱结点为起始点v
dist[v] = 0;
// 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
for(int i=2; i&=n; ++i)
// 找出当前未使用的点j的dist[j]最小值
for(int j=1; j&=n; ++j)
if((!s[j]) && dist[j]&tmp)
// u保存当前邻接点中距离最小的点的号码
tmp = dist[j];
// 表示u点已存入S集合中
// 更新dist,用更小的值代替原先的值
for(int j=1; j&=n; ++j)
if((!s[j]) && c[u][j]&maxint)
int newdist = dist[u] + c[u][j];
if(newdist & dist[j])
// 记录下这条最短路径的路线(经过的结点)
void searchPath(int *prev,int v, int u)
int que[maxnum];
int tot = 1;
que[tot] =
int tmp = prev[u];
while(tmp != v)
que[tot] =
tmp = prev[tmp];
que[tot] =
for(int i= i&=1; --i)
if(i != 1)
cout && que[i] && " -& ";
cout && que[i] &&
int main()
// 各数组都从下标1开始
int dist[maxnum];
// 表示当前点到源点的最短路径长度
int prev[maxnum];
// 记录当前点的前一个结点
int c[maxnum][maxnum];
// 记录图的两点间路径长度
// 图的结点数和路径数
// 输入结点数
// 输入路径数
// 输入p, q两点及其路径长度
// 初始化c[][]为maxint
for(int i=1; i&=n; ++i)
for(int j=1; j&=n; ++j)
for(int i=1; i&= ++i)
cin && p && q &&
if(len & c[p][q])
// q指向p,这样表示无向图
for(int i=1; i&=n; ++i)
for(int i=1; i&=n; ++i)
for(int j=1; j&=n; ++j)
printf("%8d", c[i][j]);
printf("\n");
// 假定起点为结点1
Dijkstra(n, 1, dist, prev, c);
// 最短路径长度
cout && "源点到最后一个顶点的最短路径长度: " && dist[n] &&
cout && "源点到最后一个顶点的路径为: ";
// 假定起点为结点1
searchPath(prev, 1, n);
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:3498人阅读
基于J2EE的公交查询系统的设计与实现
1.1 选题背景
20多年来,我国经济得到了持续、快速、稳定、健康地发展。经济的快速增长,带动了汽车工业的蓬勃发展,并使交通状况显著改善。据统计,中国公路通车总里程已达130余万公里,其中高速公路约1.5万公里。居民收入普遍提高,到2000年年底,人均GDP已超过800美元,沿海地区已达美元。按国际发展惯例,当人均GDP超出1000美元,汽车消费市场就将进入快速增长期。我国城市人口约有2亿,略低于美国人口。东部沿海地区大部分居民已经具备了汽车消费实力。据中国消费者协会2000年对20个大城市调查显示,有32%的消费准备在未来5年内购买家用轿车,其中30.6%的无车消费者已经有驾驶执照。随着个人信贷制度的启动和日渐完善,家庭轿车的快速增长势头必将开掘出巨大的中国汽车市场。
城市经济发展,城市规模越来越大,相应的城市公交系统也越来越庞大。许多新建小区大量出现,公交线路也日渐增多,给人们的出行带来了极大便利,但是由于城市规模的不断发展,给人们选择出行乘车线路造成了一定的困难。即使一个在城市生活多年的人,给他任意两个地点,要他说出这两个地点之间的乘车方案,他往往也是很难说出来的。但是如果给他一张交通地图之后,他可以很快地找出图上的任意两点之间的乘车方案,所找出的方案即使不是最优的,也是一条可供参考的备选方案。但是这样的查询效率是相当低的,所以需要提供一个高效的查询系统,才是问题更本所在。而基于J2EE的公交查询系统,就是利用B/S结构开发出来的查询系统,它通过利用数据结构当中的最短路径算法,可以查出任意两个地点之间最短的乘车方案。它不仅可以用于公交公司管理系统中,也可以单独作为公交管理系统的一个模块存在,并可以制作成公交信息系统查询网,放置于城市的主要场所。这样不仅可以体现出一个城市的智能公交系统的水平,更显示出城市的数字化,信息化水平。
目前,我国众多大城市普遍存在交通拥挤,延误人们平时上班时间。甚至影响了城市旅游业经济的可持续发展。所以为了切实的改善公交车内拥挤状况,适当增加发车次数以缩短乘客等车时间,但是能够准确为人们提供最短的乘车线路才是得到解决的最好办法,这样大大的缩短了人们的乘车时间。
本项目研究的基于J2EE的公交查询系统,让人们通过互联网很快的查出该城市任意两站点之间的最短乘车路线。
1.2 项目的主要研究工作
本系统是从城市交通现状出发,根据人们的出行规律,设计了一个完整的基于J2EE体系的公交车查询系统。该系统可以根据商厦名称,公交车号,日常站点和站点之间为查询条件分别进行查询,解决了市民出行乘坐公交车时经常遇到的困难。
本系统模型构架分为下面四层结构,如下。
(1)J2EE应用程序组件
J2EE应用程序是由组件构成的。J2EE组件是具有独立功能的软件单元,它们通过相关的类和文件组装成J2EE应用程序,并与其他组件交互。本系统包括如下组件:
①应用客户端程序及J2EE服务器。
②Java Servlet和JavaServer Pages(JSP)Web组件及JavaBean。
(2)WEB层组件
J2EE web层组件包含JSP页面或Servlet。按照J2EE规范,还包含某些JavaBean对象来处理用户输入,并把输入发送给运行在业务逻辑层上的组件来进行处理。
(3)客户层组件
基于WEB方式的静态HTML页面或是Applet客户端的小应用程序。
(4)编写算法
编写最短路径数据结构算法,解决完成站点之间最短乘车路径查询。
1.3 开发环境
开发工具:Eclipse 3.2 &#43; MyEclipse 5.0GA。
运行环境:JSDK 1.5.0_04虚拟机。
服务器:Tomcat 5.5。
数据库:MicroSoft SQL Server 2000。
操作系统:Windows XP。
所需内存:512 M。
2 理论基础
2.1.1 J2EE的概念
J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2标准平台。J2EE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对EJB(Enterprise JavaBeans)、Java Servlet API、JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。
2.1.2 JSP的概念
JSP程序是一个服务端页面脚本程序,可以在这个脚本中直接编写客户端浏览器需要显示的HTML文档内容,当然也可以依照JSP规范将Java程序代码嵌入脚本。JSP脚本规范提供了若干内部对象来简化JSP程序和浏览器之间的输入输出处理。由于JSP程序是从HTML页面添加Java动态处理代码而来,因此,JSP程序又称为动态JSP页面。
2.1.3 Java Bean的概念
JavaBean是一种JAVA语言写成的可重用组件,用户可以使用JavaBean将功能、处理、&#20540;、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。这个对J2EE业务逻辑层处理具有相当重要的部分。
2.1.4 Java Servlet的概念
Java Servlet使用的是一种请求/响应机制,也就是说通过特定的Java程序设计技术,由该Servlet动态产生的响应向某一特定的请求做出响应。Servlet所能应用的请求/响应场合很多,但常用的还是在Web应用程序中用于产生超文本传输协议响应(HTTP)。据此,Servlet可能取代其他类型的HTTP请求/响应机制,譬如通用网关接口(CGI)脚本。
2.1.5 Session对象
Session对象是类javax.servlet.Httpsession的一个对象,是用来保存每个用户信息(以会话的形式直接保存在WEB服务器端),以便跟踪每个用户的操作状态。
2.2 J2EE的结构
J2EE结构具有一个很大的特点,就是与平台无关性的J2EE结构。所开发出来的程序可以在任何操作系统下运行。这样就使得J2EE程序的编写变得十分简单,因为业务逻辑被封装成可以复用的组件,并且J2EE服务器以容器的形式为所有的组件类型提供后台服务,所以你可以集中精力解决手头的业务逻辑。
2.3 J2EE的容器类型
J2EE容器类型可以分为WEB容器和EJB容器。
EJB容器管理所有J2EE应用程序中企业级Bean的执行,Enterprise Bean和它们的容器运行在J2EE服务器上。
WEB容器也是管理所有J2EE应用程序中JSP和Servlet组件执行,同理WEB组件和它们的容器也是运行在J2EE服务器上的。
2.4 J2EE的体系与模式
2.4.1 J2EE的体系(分布式计算)
()表示层:Web Page| HTML&|&HTTP
()控制层:JSP | Servlets
()逻辑层:JavaBean
()数据层:Database
2.4.2 J2EE的模式
MVC(Model – View – Controller)
页面bean是一个模型(model),而JSP是一个视图(view), Servlet是一个控制器(controller)。
3 公交查询系统功能分析
3.1 公交查询系统的需求
3.1.1 系统需求描述
公交查询系统的需求最主要是通过站点与车次之间的关系,利用数据结构算法构造一个公交查询的网络图,然后通过最短路径算法,为用户准确地提供两站点之间的最短乘车路线。
其次从业务实现上来说,需要在业务逻辑层上编写最短路径算法,同时还要编写当用户查询请求时必须的数据库连接,然后根据用户提供查询站点信息,建立公交查询网络图,最终调用算法获取两站点之间的最短乘车线路。当查询完成后,如果用户需要进行其它的操作,则释放该连接资源。
最后,为了让公交线路信息得到及时的更新或是信息删除,需要做出相应的操作和处理。
3.1.2 系统数据流图
图3.1 系统数据流图
3.2 公交查询系统的功能
()通过选择商厦名称进行相应的信息查询。
()通过选择车号进行相应的信息查询。
()通过选择站点进行相应的信息查询。
()通过选择任意两个站点,完成两站点之间最短乘车路线查询。
()完成车次和站点添加功能。
()完成车次和站点更新功能。
()完成车次和站点删除功能。
()用户登录验证功能。
()用户注册信息功能。
()用户注销功能。
()删除用户信息功能。
()添加用户留言,删除用户留言,查看用户留言。
()管理员登录验证功能。
()管理员注销功能。
3.3 公交查询系统的数据库设计
3.3.1 E-R图
图3.2 用户实体及属性
图3.3 管理员实体及属性
图3.4 留言板实体及属性
图3.5 车次与站点之间关系
3.3.2 数据库表设计
(1)用户表userInfo(如表3.1)
表3.1 用户表信息
userpassword
&4 公交查询系统的设计与实现
创建管理员登录的Servlet
(1)打开Eclipse开工具,新建一个ConfirmServlet类(如图4.1)
图4.1 创建管理员登录ConfirmServlet类
(2)在已创建好ConfirmServlet类中,生成一个具有私有属性的login()方法,该方法就是对管理员请求过来的信息进行验证。该方法首先利用HttpServletRequest,HttpServletResponse进行对象初始化。利用HttpServletRequest的getParameter()来获取管理员页面传来的两个参数,一个是adminname,另一个是adminpassword。然后调用自定义连接数据库类进行数据库对象实例化,最后在进行验证的时候,获取管理页面验证码,如果验证码无误就对管理员账号和管理员密码验证,最终将正确的管理员账号和管理员密码放入session会话变量中。
管理员登录界面(如图4.2)
图4.2 管理员登录界面
&4.2 创建用户登录的Servlet
(1)打开Eclipse开工具,新建一个UserLoginServlet类(如图4.3)
图4.3 创建用户登录UserLoginServlet类
(2)与管理员中的ConfirmServlet类一样,也生成一个具有私有属性的login()方法,该方法也同样的继承了HttpServletRequest和HttpServletResponse类,通过这个类来获取用户界面请求过来的参数,当通过用户信息验证后,同样也将用户账号和用户的密码放入session会话变量中,一旦用户最终关闭浏览器,session会话变量也随即销毁。
用户登录界面(如图4.4)
图4.4 用户登录界面
公交系统查询模块
4.3.1商厦查询
商厦查询是为用户提供按具体的名称(如:欧尚)查询,并显示到这个地点所有公交车车次的相关信息(如:车号,站点名称,票价,车子的档次和这个商厦的名称等信息)。而查询功能的实现是由系统的业务逻辑层中的QueryData类来实现的。当用户传来的车次提交信息,首先商厦查询页面先编译成服务器上的Servlet,然后根据需要调用业务逻辑层中相应类。
商厦信息查询结果(如图4.5)
图4.5 商厦查询
相应代码:
&调用此方法时,在页面中先引用包com.busSystem.util,再创建QueryData类的对象,通过对象调用queryPlace()这个方法。
4.3.2 车次信息查询
车次信息查询是为用户提供一个按公交车的车号(如:1路)查询,并显示该公交车的相关信息(如:公交车的起点站、终点站、票价和车子的档次等信息)。而查询功能的实现是由系统的业务逻辑层中的QueryData类来实现的。
车次信息查询结果(如图4.6)
图4.6 车次信息查询
相应的代码:
&调用此方法时,在页面中先引用包com.busSystem.util,再创建QueryData类的对象,通过对象调用statisticsByBusInfo()这个方法。
4.3.3 站点信息查询
站点信息查询是为用户提供按公交车某一个站点查询到该站点需要乘坐公交车的车号。该查询功能的实现也是由系统的业务逻辑层中的QueryData类来实现的。
站点信息查询结果(如图4.7)
图4.7 站点信息查询
相应代码:
&调用此方法时,在页面中先引用包com.busSystem.util,再创建QueryData类的对象,通过对象调用queryStInfo()这个方法。
4.3.4 两个站点间的信息查询
任意两个站点间的查询页面(如图4.8)
图4.8 最短路径查询页面
任意两个站点间查询结果页面(如图4.9)
图4.9 任意两个站点间查询结果
(1)广度优先遍历概念
给定一个起点,广度优先遍历首先访问起点与起点的邻接点,然后分别考察每一个邻接点并访问它们的邻接点。遍历使用一个队列存放顶点的未被访问邻接点,每当从队列中删除一个顶点,就将这个顶点的未访问邻接点插入队列,遍历的顺序即为顶点插入这个队列的顺序。
(2)图的建立过程
图4.10 构造图的流程
①初始化车次列表listBusNum,它是用来存储数据库中现有的车号,为建立图的先做好准备。
②在建立图的过程需要连接数据库,所以必须将需要用到连接数据库的类全部对象初始化,如:connection,statement,resultset这三个关键类。
③首先建立图的时候,需要添加图的各个节点。而这里的节点就是数据库站点信息(stinfo)表中的站点ID号。
④查询站点信息表,将所有的站点从数据库中取出来,调用添加站点graph.addVertex()的方法,将图的各个节点建立好。
⑤通过车次列表,循环的取出各个车号,查询车号与站点ID关系表(busst),找到该车号对应的所有站点。
⑥创建向量vector,该向量用来存放一个车号对应多个站的ID号。
⑦初始化站点列表listStID,它用来存放已经保存好站点ID的向量,这样子就建立起一个关系,就是站点列表中保存了每一个车号所对应车号它自身的所有站点ID。
⑧将站点列表和初始化好了的图一起传入createEdgeByDateBase中,建立双向图。最后图的建立过程结束。
(3)最短路径算法原理图(如图4.11)
图4.11 最短路径算法原理图
(4)最短路径算法原理描述:
①将顶点A入队,同时将顶点A设置为已经被访问。
②判断队列是否为空,如果不是则顶点A出队,同时判断顶点A的邻接顶点B、E、D是否已经被访问,如果没有,则将顶点B、E、D入队,并分别设置为已经被访问,接着将入队顶点B、E、D分别指向他们的前置顶点A,并分别判断顶点B、E、D是否为目的顶点I,不是则进入下一步3。
③判断队列是否为空,如果不是则顶点B出队,同时判断顶点B的邻接顶点E是否已经被访问。判断可知顶点B的邻接顶点E已经被访问,则顶点E不用指向他的前置顶点B。接着进入下一步4。
④判断队列是否为空,如果不是则顶点E出队,同时判断顶点E的邻接顶点F、H是否已经被访问,如果没有,则将顶点F、H入队,并分别设置为已经被访问,接着将入队顶点F、H分别指向他们的前置顶点E,并分别判断顶点F、H是否为目的顶点I,不是则进入下一步5。
⑤判断队列是否为空,如果不是则顶点D出队,同时判断顶点D的邻接顶点G是否已经被访问,如果没有,则将顶点G入队,并分别设置为已经被访问,接着将入队顶点G分别指向他们的前置顶点D,并分别判断顶点G是否为目的顶点I,不是则进入下一步6。
⑥判断队列是否为空,同时判断入队的顶点F是否是目的顶点I。如果不是则顶点F出队,同时判断顶点F的邻接顶点C是否已经被访问,如果没有,则将顶点C入队,并分别设置为已经被访问,接着将入队顶点C分别指向他们的前置顶点F。并分别判断顶点C是否为目的顶点I,不是则进入下一步7。
⑦判断队列是否为空,如果不是则顶点H出队,同时判断顶点H的邻接顶点I是否已经被访问,如果没有,则将顶点I入队,并分别设置为已经被访问,接着将入队顶点I指向他们的前置顶点H,并分别判断顶点I是否为目的顶点I,可以判断顶点I就是目的顶点,将顶点I入堆栈,进入下一步8。
⑧判断I的前置顶点是否为空,如果不是则将前置顶点入堆栈,循环判断前置顶点的前置顶点,如果不为空,则入堆栈,直到循环判断到空为止。这样堆栈中的所有顶点出堆栈,出堆栈的顶点A-&E-&H-&I就是查询出来最短路径。
最短路径算法相应的程序(利用广度优先遍历算法查找最短路径):
&4.4 公交系统添加模块
4.4.1 添加车次
添加车次功能主要是增加一个车次详细信息,其中包括:车次号,起点站,终点站,票价,汽车档次,票价类型。需要注意,在添加起点站和终点站的时候,数据都是从站点库获得然后添加到起点站和终点站中去。因为添加车次它只涉及到车次的详细信息,如果要想添加站点,则需要在添加站点功能页面中进行相应的操作。
添加车次页面(如图4.12)
图4.12 添加车次
4.4.2 添加站点
添加站点功能:(1)在添加站点的文本框中输入要添加的站点名称。(2)提供了一个站点重名的查找功能,该功能可以对你输入添加的站点名称进行名称查重,通过查询站点编码表,显示这个站点是否已经存在。如果不存在,则将此新增站点名称插入到站点编码表中,如果存在,则不需将此站点名称插入到站点编码表中。(3)通过下拉选择框选择新增站点所对应的车次号。(4)如果查询站点总数在文本框中显示为“0”,则需要将起点站和终点站同新增的站点一起插入车次和站点的关系表中。如果查询站点总数在文本框中显示不为“0”,则只需将新增的站点插入车次和站点关系表中即可。
添加站点页面(如图4.13)
图4.13 添加站点
4.5 公交系统删除模块
4.5.1 删除车次
删除车次功能:分页列出车次信息表中所有的车次信息,选择操作中的删除,就可以将对应的车次信息删除,但是在删除车次信息的时候需要先删除车次与站点关系表中所有对应该车次的信息。如果不先删除就会出现违反数据库完整性。
删除车次页面(如图4.14)
图4.14 删除车次
4.5.2 删除站点
删除站点功能:通过车次的下拉选择框选择车次,进行查询列出该车次的所有站点信息,然后点击删除操作就可以删除该站点。需要注意:因为在车次中从起点站到终点站计算,其所有的站点是一个有次序的排列,所以删除一个站点,则它的下个站点次序号依次减少一位。
删除站点页面(如图4.15)
图4.15 删除站点
4.6 公交系统更新模块
更新站点功能:通过车次的下拉选择框选择车次,进行查询列出该车次的所有站点信息,然后点击更新操作就可以更新该站点。需要注意的是,在更新起点站(或是终点站)的时候,也要同时更新车次表中的起点站(或是终点站)。
更新站点页面(如图4.16)
图4.16 更新站点
4.7 公交系统留言板模块
4.7.1 发表留言
发表留言是公交查询系统的一个新增的功能,主要是收集用户的留言信息,可以根据用户提供的留言信息或是提出的建议,对系统进行修改和完善。使得系统更加趋于成熟完整。注册的用户登录到发表留言的板块当中,系统会自动提取用户名称,用户只需添上自己的邮箱,发表的主题和内容即可。
发表留言页面(如图4.17)
图4.17 发表留言
4.7.2 查看留言
查看留言很简单为用户提供了一个查看自己的发表的留言,而其它用户是不能看见的。因为系统是一个管理方面的功能较多,所以不会将用户留言信息提供其它的用户查看。
查看留言(如图4.18)
图4.18 查看留言
4.7.3 删除留言
删除留言功能只有管理员才能查看并操作,在删除的显示页面中会将所有的用户留言信息及用户名显示出来。这样也为管理员提供查看哪些用户是非法的发布留言内容。针对这种情况删除该用户。
删除留言页面(如图4.19)
图4.19 删除留言
5 系统测试与分析
设计完成系统的各个模块之后,需要对整个系统进行全面的测试。目的是让整个系统能够快速、稳定、安全的运行。在进行系统测试过程中出现如下几种情况:
(1)对页面提交的过来的数据进行空指针异常捕捉。凡是遇到无效或是空&#20540;数据都需要用程序进行操作处理。
(2)及时的捕捉数据库连接和关闭异常。以免数据库连接资源及时释放,提供下一次请求调用。
(3)对数据库查询操作异常进行捕捉。
(4)对数据库查询操作异常进行捕捉。
(5)对数据库更新操作异常进行捕捉。
(6)对数据库添加操作异常进行捕捉。
(7)对数据库删除操作异常进行捕捉。
(8)权限控制,通过session会话变量对管理员和用户的权限进行控制。
(9)页面的编码方式不同,需要的对字符串进行转码操作。
通过对J2EE知识的认真学习,理论联系实践,最终完成了基于J2EE公交查询系统的设计与实现。经过多次测试,运行效果良好。对于该系统,加强后台管理,就可以单独作为大型公交管理系统的一个模块,也可以将它的功能更加完善后放置于城市公共场所,为人们提供快捷、方便的查询。这样不仅体现出一个城市的公交查询系统的发展水平,更可以显示出城市的数字化和信息化水平。公交查询系统的开发利用也必将促使城市公交更好的服务于人们。
在完成这次毕业设计的过程中,自己查阅了大量的书籍,并且通过互联网也查阅了许多相关资料,开发出具有B/S结构模式的公交系统,从而使我的编程能力和自学能力得到了很大程度的提高,对网站设计有了更深地了解。
但是,由于整个系统完全都是由个人设计的,有关J2EE许多知识都要靠自己去摸索,加之自己水平有限,未能完全地理解J2EE的强大功能,因此,系统还存在着许多不足之处。
[1] 刘晓华.J2EE企业级应用开发[M].北京:飞思科技产品研发中心,2003。
[2] 赛奎春,陈威.JSP工程应用与项目实践[M].北京:清华大学出版社,2004。
[3] Cay S.Horstmann,Gary Cornell.java核心技术卷2高级特性[M].北京:机械工业出版社,2003。
[4] Frank M.Carrano,Walter Savitch.数据结构与抽象:Java语言版[M].北京:清华大学出版社,2005。
[5] 孙卫琴,李洪成.Tomcat与Java Web开发技术详解[M].北京:电子工业出版社,2004。
[6] 高铁杠,顾巧论.智能公交查询系统[J].新技术应用,-32。
[7] 王宏.MSSQL&数据库管理.北京:人民邮电出版社。
11路上行所有公交车站
想要源码和完整文档的请联系
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4139次
排名:千里之外

我要回帖

更多关于 最短路径算法 的文章

 

随机推荐