资源描述
目 录
第一章 绪论 2
第二章 开发语言介绍 3
2.1 系统开发环境 3
2.2 开发工具 3
2.3 Visual Basic的简介 3
2.4 ACCESS简介 4
第三章 需求分析 6
第四章 系统实现 9
4.1程序主界面模块 9
4.2按起终点站查询模块 19
4.3 中转站模块 19
第五章 软件测试 31
致 谢 32
参考文献 33
城市公交查询系统
【摘要】
我国城市公交乘客信息系统的发展处于一个较落后的水平,广大乘客可以获得信息的方式很少,为了解决这种问题,需要大力发展我国的城市公交乘客信息系统。出于这个目的,在老师的指导下,我设计了这个城市公交出行线路查询系统这个应用程序。在设计过程中,首先分析了我国城市公交乘客信息系统的发展现状,找出问题和不足。其次,在对公交乘客出行心理特征进行分析的基础上,考虑了乘客选择公交线路决策的因素,建立了基于时间价值和费用价值的公交线路选择合理的模型。在此基础上,进行程序关键部分的框架设计,理清程序设计思路。之后是程序关键部分的具体实现,包括关键程序原代码。最后完成功能介绍和使用说明。运用VB语言或方法,对线路查询系统进行了程序设计,并进行了模拟实验。本次设计的软件较为符合公交运营的实际情况,充分考虑了不同公交乘客的实际要求,运算速度较快,有较强的实际应用价值。
【关键词】
公交查询,VB,数据库
第一章 绪论
1.1我国城市公交乘客信息系统的现状
我国城市公交乘客信息系统的发展处于一个落后的水平,广大乘客可以获得信息的方式很少,公交信息的完整性和准确性得不到保证,而且还没有专门的机构负责信息的发布和管理。我国公交乘客信息系统的现状特点如下:
1.2 乘客可以获得的公交信息很少,而且方式主要是常规手段。
我国乘客一般获得公交信息的方式局限于电话,交通图,向熟人问讯等常规方式。乘客可以获得的公交信息很少,除去线路,站点等基本信息以外,有关班次,车辆到离站时间的信息基本上没有。
1.3 乘客出行中获得信息困难,基本上没有实时信息。
除去在杭州,上海等少数几个城市,乘客可以通过分布于城市中的若干电子站牌获得一些公交车辆的运营信息以外,在其它城市“出行中”的乘客无法获得任何实时信息。在我国一些城市中,有不少装饰华美的公交站台,但在这些站台上却找不到实用的城市交通图。总而言之,我国乘客在出行中无论是“静态线路信息”还是“动态实时信息”都很难获得。
1.4 缺乏专门的交通信息发布管理机构,乘客获得的信息准确性得不到保证。
目前,我国大多数城市对于交通信息的发布没有专门的管理机构和规章制度。在城市交通信息服务需求小的情况下尚可应付。但随着城市交通信息服务需求的增长,从事交通信息服务的人员和企业数量的增加,需要有专门的管理机构和制度。当前的城市交通信息服务存在着混乱和低效的问题,有些甚至是对乘客的误导。
1.5 我国公交乘客信息系统与网络的结合还是低层次的。
在我国一些城市出现了基于网络的公交信息服务系统(例如中国公交查询网,它可提供全国大约七十多个城市的公交系统信息查询),但总体上还是处于一个较低的层次。这些信息系统还处于一种静态的公交信息查询系统,还不能作到为乘客的出行自动的生成出行计划或方案。
第二章 开发语言介绍
2.1 系统开发环境
系统开发环境包括硬件平台和软件平台两种。
硬件平台是指开发与运行所需要的硬件环境,主要包括计算机机型及硬件配置。由于本系统是一个小型的播放器,因此对计算机硬件的要求不高,比较经济,只要配备有PII300处理器(或以上)、64M内存(或以上)、20G硬(或以上)的普通微机即可顺利运行。
软件平台是指系统开发与运行的软件环境。本系统在开发时选用了稳定性较强的Windows XP中文专业版和Visual Basic6.0作为开发语言,开发出的应用系统稳定性较高。
Visual Basic 6.0具有可视化的开发环境,可以快速完成系统的开发。
2.2 开发工具
在确定了操作系统后,就该选择开发工具了。经过了综合的比较而且最重要的是本人在学校期间学习的就是Visual Basic。 先我们来了介绍一下Visual Basic以及微软提供了哪些特点。
2.3 Visual Basic的简介
首先,我们还从Visual Basic这个名字开始,来认识这个软件。所谓“Visual”指的是开发图形用户界面 (GUI) 的方法。它不需编写大量的代码去描述界面元素的外观和位置,而只要把预先建立的对象添加到屏幕上的某一位置即可。如果已使用过诸如 Paint 之类的绘图程序,则实际上已掌握了创建用户界面的必要技巧。“Basic”指的是 BASIC (Beginners All-Purpose Symbolist Instruction Code) 语言,一种在计算技术发展历史上应用得最为广泛的编程语言。Visual Basic 在原有 BASIC 语言的基础上进一步发展,至今包含了数百条语句、函数及关键词,其中很多和 Windows GUI 有直接关系。专业人员可以用 Visual Basic 实现其它任何 Windows 编程语言的功能,而初学者只要掌握几个关键词就可以建立实用的应用程序。Visual Basic 不仅是 Visual Basic 编程语言。Visual Basic 编程系统和 VBA 都使用这一语言。Visual Basic Scripting Edition (VBScript) 是广泛使用的脚本语言,它是 Visual Basic 语言的子集。这样,在学习 Visual Basic 中得到的经验可应用到所有这些领域中。
接着,我们再从Visual Basic的发展历史来进一步地认识一下它。Visual Basic的最初版本是Visual Basic1.0,那时的Visual Basic只是简单地以对象的属性为中心来进行编程。到了Visual Basic2.0时,开始正式地采用面向对象技术,其有一个重要的新特性就是可拥有对象变量,并把Variant型变量作为缺省数据类型变量。没过多久Visual Basic的下两个版本Visual Basic3.0和Visual Basic4.0接踵而至,一种内建的新的控件类型——数据控件,能够使创建一个与数据库交互作用的应用程序变得令人惊讶的容易。在微软的其它应用程序,如WORD字处理软件、EXCEL电子报表软件、ACCESS数据库软件中都做了改变,使得它们可以与Visual Basic一致工作。这种新技术被称作为Visual Basic For Applications,它帮助实现了Visual Basic的最初设想。理论上,人们总是能够通过某种叫做动态数据交换(DDE)的技术使视窗系统应用程序彼此交互。但那样既慢而且又麻烦。Visual Basic的完美之处在于它能使程序员获得一块数据——如报表,并将它看作是Visual Basic的对象。其目的就是要使视窗系统下的每一件事情都支持同样的易于使用的高级语言。Visual Basic5.0出现以后,在某些方面有了重大的突破。它给予了程序员长期期待的不用离开Visual Basic环境,就可以创建新的定制控件类型和创建其它项目类型的能力。除了一般应用程序外,程序员还能创建文档、DLLs、OLE服务器和ActiveX控件。当Visual Basic逐渐复杂时,世界已经在围着它转了。项目类型的增加不是用来迷惑程序员,而是提供灵活性的。视窗系统已经成为一个特别丰富的环境,可使应用程序彼此交流和共享数据。我们现在所使用的Visual Basic6.0被看着是Visual Basic的网络版本。可以看出它投入了相当一部分的精力去支持微软日益在Internet和分布式(网络)计算方面的重视程度。虽然它没有象Visual Basic5.0所引起的那样激动人心,但它还是在某些方面做了一些有用的改进。其最重要的一个改进就是增加了ADO数据控件,它可以缩小本地和远程数据控件之间的差别。换句话说,程序员在很大程度上可以与数据库交互作用,而不用担心网络上由谁来提供服务。
2.4 ACCESS简介
数据库选用Microsoft公司的Access产品作为数据库应用程序。目前的Access 2000是Microsoft强大的桌面数据库平台的第六代产品,是3 2位Access的第三个版本。Access有以下一些基本定义:
(1)数据库是一个包含各种Access “对象”(表、查询、窗体、报表、宏和模块)的文件,Access中所有工作都是建立在此基础之上的。
(2)表是存放数据的容器,被设计成行和列的格式,就像电子表中的那样。每一列叫做一个“字段”,包含特定类型的信息,如姓名或学历。每一行称为一个“记录”,包含与单个实体有关的所有信息,如某个员工的姓名、性别、所在部门、学历等。对于像Access这样的关系数据库管理程序,一个数据库通常包含几个存放相关数据的不同表。
(3)查询是一个Access对象,它询问数据库中有关数据的问题。根据设计方法的不同,查询能够在数据库中检索并组合来自不同表的数据。例如,可以设计一个查询来告知在公司中工作超过1年的职员有多少。查询还可以对一组数据执行操作,如更新或删除某组记录。
(4)窗体是一个窗口,它提供一种很方便的途径来查看数据库中已有记录或向数据库中增添新记录。在Access中,可以创建一个窗体,用来同时查阅单个表或多个表中的数据,还可以打印和显示窗体。
(5)报表是一个Access对象,设计来显示数据,其作用类似于窗体,但主要是用于数据打印,不能输入数据。
(6)页是一种特殊类型的窗体,它使用户能够利用Web浏览器查看和编辑Access的表。
(7)宏用来保存Access中的一系列操作。可自动执行一些日常的任务,以便简化在Access中的工作。
(8)模块是用Visual Basic for Applications(VBA) 编写的过程,VBA是Access的基础程序设计语言。利用VBA可以编写程序代码来完成Access宏所不能完成的特定任务。
第三章 需求分析
3.1计算机网络
计算机网络是指将多台具有独立功能的计算机,通过通信线路和通信设备连接起来,在网络软件的支持下实现数据通信和资源共享的计算机系统。
计算机网络的规模有大有小,大的可以覆盖全球,小的仅局限于一个办公室。现在一般按照网络覆盖的地理范围将计算机网络分为三类:局域网(LAN)、城域网(MAN)、广域网(WAN)。
3.2 系统功能
1、基于浏览器(B/S模式)的公交线路分类查询;
2、数据的录入、修改、添加、删除。
3.3 公交查询系统设计分析
根据数据库系统生存期的设计方法,从数据库应用系统和开发的全过程来考虑,将数据库应用系统设计分为以下几个阶段:
1)规划;
2)需求分析;
3)概念设计;
4)逻辑设计;
5)物理设计。
3.4 应用需求分析
要设计一个良好的公交查询系统,就必须首先明确该应用环境对系统的要求。公交查询系统的应用背景为:方便市民搭乘公交车出行;手动(目前)、自动(将来)、及时更新查询数据。因此,该系统需满足以下几方面需求:
1、查询功能:系统需要提供几种不同方式的查询手段,以实现灵活方便地管理整个系统。
2、数据的更新修改:
更新:系统允许管理员级别的用户对数据进行更新、修改并且存盘操作;
编辑:系统允许管理员级别的用户对数据进行编辑、删除的操作,保证现库的真实性与实时性。
3、打印输出(暂未实现):系统可以将用户查询到的内容动态地生成报表,并打印输出。
3.5 系统功能模块划分
公交查询系统功能划分模块如下:
1、查询系统模块
该模块实现公交查询功能。可实现按起点-中转站-终点查询查询和按线路查询两种查询方式。
录入系统模块
该模块实现数据的录入、修改、删除功能。该模块由公交站点管理与公交线路管理两部分组成。
3.6系统数据库设计
概念设计
概念设计的目标是产生反映城市公交查询系统需求的数据库概念结构,即概念模式。概念模式是独立于数据库逻辑结构,独立于支持数据库的DBMS,不依赖于计算机系统的。
1、ER模型
ER模型是对现实世界的一种抽象。它的主要成分是实体、联系和属性。使
用这三种成分,我们可以建立许多应用环境的ER模型。
2、ER模型的操作
在利用ER模型进行数据库概念设计的过程中,常常需要对ER图进行种种
变换。这些变换又称为ER模型的操作,包括实体类型、联系类型和属性的分裂、合并和增删等等。
3、利用ER方法的数据库概念设计
利用ER方法进行数据库的概念设计,可以分成三步进行:首先设计局部ER模式,然后把各局部ER模式综合成一个全局ER模式,最后对全局ER模式进行优化,得到最终的ER模式,即概念模式。
设计局部的ER模式
通常,一个数据库系统都是为多个不同用户服务的。各个用户对数据的观点可能不一样,信息处理需求也可能不同。在设计数据库概念结构时,为了更好地模拟现实世界,一个有效的策略是“分而治之”,即先分别考虑各个用户的信息需求,形成局部概念结构,然后再综合成全局结构。在ER方法中,局部概念结构又称为局部ER模式,其图形表示称为ER图。
实体和属性的定义如下:
站点(站点编号,站点名称,站点类别)
线路(线路编号,始发时间,终发时间,备注)
线路站点对应(线路编号,站点名称)
城市交通查询系统
按车次查询
按起终点站查询
第四章 系统实现
4.1程序主界面模块
本系统可以查询各个车次的各个站点,用户可以清楚该线路各个站点的名称,本系统操作简单,适合大众用户使用.
本模块界面如下所示:
主要代码如下:
Private Sub Command1_Click()
If Combo1.Text = "" Then
MsgBox "您没有输入要查询的车次!", vbInformation + vbOKOnly, "提示!"
Combo1.SetFocus
Exit Sub
End If
gcaf = 1
Cbm.Visible = False
Label5.Visible = False
MSF1(0).Visible = True
MSF1(1).Visible = False
MSF1(2).Visible = False
txtsql = "select *from bus where number = '" & Trim(Combo1.Text) & " '"
showdata 0
Label7.Visible = True
End Sub
Private Sub Command2_Click()
Command4.Caption = "查找经过站点最小的线路"
gcaf = 2
If cbs.Text = "" Then
MsgBox "您没有输入要查询的起点站!", vbInformation + vbOKOnly, "提示!"
cbs.SetFocus
Exit Sub
End If
If Cbe.Text = "" Then
MsgBox "您没有输入要查询的终点站!", vbInformation + vbOKOnly, "提示!"
Cbe.SetFocus
Exit Sub
End If
If Cbm.Visible = False Or Cbm.Text = "" Then
digein = 0
showSEdata cbs.Text, Cbe.Text, 0
digeitemp = digein
Label7.Visible = True
Else
If Cbm.Text <> "" Then
Label7.Visible = True
End If
digein = 0
showSEdata cbs.Text, Cbm.Text, 1 '把转发站作为终点站进行查询
digeitemp = digein
digein = 0
showSEdata Cbm.Text, Cbe.Text, 2 '把转发站作为起点站进行查询
digeitemp = digein
End If
End Sub
Private Sub Command3_Click()
Load map
map.Show
End Sub
Private Sub Command4_Click()
'以下代码写得不是很好,有点乱的感觉
'其思路是先统计要经过的车站个数,再把最小车站个数的线路显示出来
'还有要注意的一点是在显示出了最近车站的线路后,为了返回开始查询到的线路,我用了MSF1(i)做为存储
Dim intmin As Integer
Dim intcount As Integer
Dim alloks() As Integer
Dim rs As Integer
Dim oksn As Integer
Dim strbij As String
Dim bfin As Boolean
intmin = 10000
If gcaf = 2 Then
If Command4.Caption = "查找经过站点最小的线路" Then
Command4.Caption = "返回"
oksn = 0
If MSF1(0).Visible = True Then
ReDim alloks(MSF1(0).Rows)
MSF1(1).Clear
MSF1(1).Rows = MSF1(0).Rows
For k = 0 To MSF1(0).Rows - 1
intcount = 9999
bfin = False
For t = 0 To NC + 2
If MSF1(0).TextMatrix(k, t) = "" Then
Exit For
End If
MSF1(1).TextMatrix(k, t) = MSF1(0).TextMatrix(k, t)
If bfin = False Then
If cbs.Text = MSF1(0).TextMatrix(k, t) Or Cbe.Text = MSF1(0).TextMatrix(k, t) Then
If intcount = 9999 Then
intcount = 0
Else
intcount = intcount + 1
bfin = True
End If
Else
If intcount <> 9999 Then
intcount = intcount + 1
End If
End If
End If
Next
MSF1(1).TextMatrix(k, NC + 2) = MSF1(0).TextMatrix(k, NC + 2)
alloks(oksn) = intcount
oksn = oksn + 1
If intcount < intmin Then
intmin = intcount
End If
Next
MSF1(0).Clear
rs = 1
With MSF1(0)
.TextMatrix(0, 1) = "车次"
For k = 1 To NC + 1
.TextMatrix(0, k + 1) = "站" & CStr(k)
Next
.TextMatrix(0, NC + 2) = "备注"
End With
For s = 0 To MSF1(1).Rows - 1
If alloks(s) = intmin Then
For r = 0 To NC + 4
If MSF1(1).TextMatrix(s, r) = "" Then
Exit For
End If
MSF1(0).TextMatrix(rs, r) = MSF1(1).TextMatrix(s, r)
Next
rs = rs + 1
End If
Next
MSF1(0).Refresh
Else
intpart = MSF1(1).Rows
ReDim alloks(MSF1(1).Rows + MSF1(2).Rows)
MSF1(0).Clear
MSF1(0).Rows = MSF1(1).Rows + MSF1(2).Rows
For k = 0 To MSF1(1).Rows - 1
intcount = 9999
bfin = False
For t = 0 To NC + 2
If MSF1(1).TextMatrix(k, t) = "" Then
Exit For
End If
MSF1(0).TextMatrix(k, t) = MSF1(1).TextMatrix(k, t)
If bfin = False Then
If cbs.Text = MSF1(1).TextMatrix(k, t) Or Cbm.Text = MSF1(1).TextMatrix(k, t) Then
If intcount = 9999 Then
intcount = 0
Else
intcount = intcount + 1
bfin = True
End If
Else
If intcount <> 9999 Then
intcount = intcount + 1
End If
End If
End If
Next
MSF1(0).TextMatrix(k, NC + 2) = MSF1(1).TextMatrix(k, NC + 2)
alloks(oksn) = intcount
oksn = oksn + 1
If intcount < intmin Then
intmin = intcount
End If
Next
MSF1(1).Clear
rs = 1
With MSF1(1)
.TextMatrix(0, 1) = "车次"
For k = 1 To NC + 1
.TextMatrix(0, k + 1) = "站" & CStr(k)
Next
.TextMatrix(0, NC + 2) = "备注"
End With
For s = 0 To intpart - 1
If alloks(s) = intmin Then
For r = 0 To NC + 4
If MSF1(0).TextMatrix(s, r) = "" Then
Exit For
End If
MSF1(1).TextMatrix(rs, r) = MSF1(0).TextMatrix(s, r)
Next
rs = rs + 1
End If
Next
MSF1(1).Refresh
intmin = 9999
For k = 0 To MSF1(2).Rows - 1
intcount = 9999
bfin = False
For t = 0 To NC + 2
If MSF1(2).TextMatrix(k, t) = "" Then
Exit For
End If
MSF1(0).TextMatrix(k + MSF1(1).Rows, t) = MSF1(2).TextMatrix(k, t)
If bfin = False Then
If Cbe.Text = MSF1(2).TextMatrix(k, t) Or Cbm.Text = MSF1(2).TextMatrix(k, t) Then
If intcount = 9999 Then
intcount = 0
Else
intcount = intcount + 1
bfin = True
End If
Else
If intcount <> 9999 Then
intcount = intcount + 1
End If
End If
End If
Next
MSF1(0).TextMatrix(k, NC + 2) = MSF1(2).TextMatrix(k, NC + 2)
alloks(oksn) = intcount
oksn = oksn + 1
If intcount < intmin Then
intmin = intcount
End If
Next
MSF1(2).Clear
With MSF1(2)
.TextMatrix(0, 1) = "车次"
For k = 1 To NC + 1
.TextMatrix(0, k + 1) = "站" & CStr(k)
Next
.TextMatrix(0, NC + 2) = "备注"
End With
rs = 1
For s = intpart To MSF1(1).Rows + MSF1(2).Rows - 1
If alloks(s) = intmin Then
For r = 0 To NC + 4
If MSF1(0).TextMatrix(s, r) = "" Then
Exit For
End If
MSF1(2).TextMatrix(rs, r) = MSF1(0).TextMatrix(s, r)
Next
rs = rs + 1
End If
Next
MSF1(2).Refresh
End If
Else
If MSF1(0).Visible = True Then
Command4.Caption = "查找经过站点最小的线路"
MSF1(0).Clear
With MSF1(0)
.TextMatrix(0, 1) = "车次"
For k = 1 To NC + 1
.TextMatrix(0, k + 1) = "站" & CStr(k)
Next
.TextMatrix(0, NC + 2) = "备注"
End With
For Y = 0 To MSF1(1).Rows - 1
For X = 0 To NC + 2
If MSF1(1).TextMatrix(Y, X) = "" Then
Exit For
End If
MSF1(0).TextMatrix(Y, X) = MSF1(1).TextMatrix(Y, X)
Next
MSF1(0).TextMatrix(Y, NC + 2) = MSF1(1).TextMatrix(Y, NC + 2)
Next
MSF1(0).Refresh
MSF1(1).Clear
Else
Command4.Caption = "查找经过站点最小的线路"
MSF1(1).Clear
With MSF1(1)
.TextMatrix(0, 1) = "车次"
For k = 1 To NC + 1
.TextMatrix(0, k + 1) = "站" & CStr(k)
Next
.TextMatrix(0, NC + 2) = "备注"
End With
For Y = 0 To intpart - 1
For X = 0 To NC + 4
If MSF1(0).TextMatrix(Y, X) = "" Then
Exit For
End If
MSF1(1).TextMatrix(Y, X) = MSF1(0).TextMatrix(Y, X)
Next
MSF1(1).TextMatrix(Y, NC + 2) = MSF1(0).TextMatrix(Y, NC + 2)
Next
MSF1(1).Refresh
MSF1(2).Clear
With MSF1(2)
.TextMatrix(0, 1) = "车次"
For k = 1 To NC + 1
.TextMatrix(0, k + 1) = "站" & CStr(k)
Next
.TextMatrix(0, NC + 2) = "备注"
End With
For Y = intpart To MSF1(0).Rows - 1
For X = 0 To NC + 4
If MSF1(0).TextMatrix(Y, X) = "" Then
Exit For
End If
MSF1(2).TextMatrix(Y - intpart, X) = MSF1(0).TextMatrix(Y, X)
Next
MSF1(2).TextMatrix(Y - intpart, NC + 2) = MSF1(0).TextMatrix(Y, NC + 2)
Next
MSF1(2).Refresh
MSF1(0).Clear
End If
End If
End If
End Sub
Private Sub Form_Load()
loadform.lblstatus = "Loading ... 正在联接所需的数据库"
loadform.Refresh
Adodc1.ConnectionString = connstring
Adodc1.CommandType = adCmdTable
Adodc1.RecordSource = "bus"
Adodc1.Refresh
loadform.lblstatus.Caption = "Loading ... 正在初始化所需控件"
loadform.Refresh
tm = 0
Text1.Visible = False
Label5.Visible = False
gcaf = 0 '用来标志用什么方式来进行查询
For i = 0 To NC
Text2(i).Visible = False
Next
bcb1 = False
bcbm = False
bcbe = False
bcbs = False
digein = 0
digeitemp = 0
showtitle (0)
'Form1.BackColor = 14321052
For i = 0 To 2
MSF1(i).BackColorBkg = 11763820
Next
loadform.lblstatus.Caption = "Loading ... 正在检索所有的车站名"
loadform.Refresh
Call showallstation
For s = 0 To cbs.ListCount
Cbe.AddItem cbs.List(s)
Next
Cbe.RemoveItem 0
loadform.lblstatus.Caption = " 初始化成功!"
loadform.Refresh
Unload loadform
End Sub
4.2 按起终点站查询模块
用户可以根据自己的实际需要,输入自己现在的地点,再输入要到达的地点,然后点查询,如果出现弹窗,意思就是没有车次是直达该站的,询问是否要转车,点确定的话,可以直接查询转车的路线
本模块界面如下所示:
4.3 中转站模块
用户点确定后,本系统自动列出可转车的车次,站点,中转站名是哪个,等等站点信息.本模块如下所示:
主要代码如下:
Private Sub Command2_Click()
Command4.Caption = "查找经过站点最小的线路"
gcaf = 2
If cbs.Text = "" Then
MsgBox "您没有输入要查询的起点站!", vbInformation + vbOKOnly, "提示!"
cbs.SetFocus
Ex
展开阅读全文