猜数字游戏

更新时间:2024-06-02 06:25:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《Java程序设计》

课程设计

题 目 猜数字游戏 院 (系) 信息工程学院 专 业 班 级 2014级信工五贯班 学 生 姓 名 孙童童 谢军 王景涛 金从能

学 号 14w2110145、54、32、 设 计 地 点 信一606 指 导 教 师 胡俊

起止时间:2014年12月22日至2015年1月5

《Java程序设计》课程设计任务分配

1

院(系):信息工程学院 教研室:软件教研室 课程设计题目 深入理解java语言的语法规则及其优势,掌握类与方法的构造,掌握基于java的各种操作的实现课程设计目的

方法,训练对基础只是的基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。在实践中培养独立分析问题和解决问题的作风和能力。通过题意分析、选择类结构、算法设计、编制程序、调试程序、软件测试、结果分析、撰写课程设计报告等环节完成软件设计的全过程,不断地完善程序以提高程序的性能。 小组成员及任务分配姓名 孙童童 谢军 学号 承担任务 是否组长 是 否 否 否 14W2110145 总体结构设计与查询模块 14W2110154 王景涛 14W2110132 金从能 14W21101 2

目录

1、需求分析........................................ .......1

1.1用户需求分析................................... .......1 1.2开发环境分析................................... .......1 2、问题描述................................... .............2 2.1课程设计任务................................... .......2 2.2课程设计的要求........................................2 3、模块设计.................................................3 3.1系统总体设计..........................................3 3.2功能模块设计..........................................3 4、功能设计................................................4 4.1游戏界面模块..........................................4 4.2随机数的产生模块......................................4 4.3输入模块.............................................4 4.4记录猜测次数模块......................................4 4.5计时模块.............................................4 4.6输入输出模块.........................................4 4.7成绩判断模块........................... .............4 5、测试分析............................... ...............5 5.1测试 ................................ ..............5 实验总结................................ ................6 参考文献................................ ................6

程序附页 ................................ ................6

3

前言

随着Internet的迅速发展和用户数量的急剧增加,互联网对于企业和事业

单位的运营和发展日益重要,网上交易也逐渐被人们认可,并成为未来交易的发展方向。在这种情况下,很多原有的C/S模式的系统也逐渐步向B/S模式靠拢,铁路客车售票系统也不例外。

铁路客车售票系统是铁路旅游服务信息系统的一个重要组成部分,为旅客提供优质便捷的服务。为了提高铁路客运的售票效率,丰富铁路客运的营销手段,火车站售票总站的下属代售点可以可以通过公用的互联网资源,实现网上的售票,查询及管理工作。本论文围绕如何实现基于B/S结构的购票系统展开讨论,通过对现有C/S结构的售票系统与B/S结构的优点缺点进行比较,给出基于B/S结构售票系统的具体解决方案;查询,买票,订票,退票,用户管理等五大模块,并研究B/S结构在网络中面临的安全问题及提出相应的解决方案。在软件的结构设计中侧重售票系统主要功能的设计与实现。本论文的研究内容还涉及现有列车售票系统中常用的算法设计,对如何将B/S结构的售票系统与车票打印机连接起来也做了简要介绍

用信息化推动工业化,用信息技术改造传统产业,这是我国迫切要完成的一项战略性任务。作为工业文明的产物—铁路,如何借助信息技术的帮助,实现管理方式,运营组织,服务标准的现代化,这是摆在我国铁路工作者面前的重大课题。 铁路信息化是铁路现代化的重要标志,其根本目的是将信息技术应用到铁路生产经营与管理决策等各项活动中,改造传统产业,提高铁路生产率,提高市场竞争力,提高铁路运营经济效益。因此,开发这样一套软件成为很有必要的事情,在下面的各章中我将以开发这套火车售票系统的内容,谈谈其开发过程和所涉及到的问题及解决办法。

1 需求分析

4

列车售票系统的总目标是:在计算机网络,数据库和先进的开发平台上,

利用现有的软件,配置一定的硬件,开发一个具有开放体系结构的、易扩充的、易维护的、具有良好人机交互界面的客车售票系统,为企业的决策层提供准确、精细、迅速的客票销售信息。

1.1功能需求

客票系统通过计算机网络将客户端与服务器的数据库相连,将从客户端得到

的信息进行处理,实现列车车次查询,售票,订票,退票,用户管理等功能。以计算机为中心,实现销售业务的计算机自动化,为铁路部门降低成本、提高销售额、为铁路部门的经营决策提供及时精确的依据。 1.1.1查询功能需求

查询功能要能满足至少两种方式的查询:按车次查询,按站点查询。如果

查询出来满足条件的车次后,用户可以直接点击购买。查询出来的信息里面应该包括车次,开车时间,到达时间,起始站,终点站,车辆类型等主要车次信息。

1.1.2售票功能需求

售票模块主要有两个入口:一个是系统主界面的买票按钮,另一个是查询结果后面的购买按钮。买票界面里可以供用户填写或者选择的内容有:车次,开车时间,起始站,终点站,座位类型 ,票数等。还要有价格计算按钮,购买按钮和重置按钮。每趟车次的具体路段起始站和终点站要在用户输入车次后自动绑定,供用户选择。点击购买按钮后,系统给出具体的购买票据,并且要能打印票据。

1.1.3退票功能需求

退票模块要能实现两种功能:退订和退票。退订是指用户有过订票记录,但票还没拿到;退票是指用户退掉已经拿到的车票(退票时间必须给出具体限制)。

5

1.1.4订票功能需求

订票模块和买票模块主要有两点区别:用户进行订票操作时必须要输入用户信息;订票的和买票的提前时间不同,订票可以提前更多的时间。订票操作成功后,系统应给出具体的订票信息票据。

1.1.5用户管理功能需求

当高级管理员登录系统时,用户管理界面入口可见,其他用户登录后则不能看到用户管理模块。用户管理模块主要有六个子模块:管理用户,剩余票查询,更新车次,销售情况统计,新闻管理,留言管理。 ◆ 管理用户

系统的用户有三类,高级管理员,代售点用户和企业用户,不同的用户权限不同。这些权限具体体现在提前买票和订票时间上。除了高级管理员,其他的用户都要先注册才能使用,不同类型的用户登录系统后操作界面不太一样。 ◆ 剩余票查询

管理员要能查询某个车次或者所有的车次剩余票信息。 ◆ 更新车次

管理员可在第一次使用系统时通过这个功能模块来建立基本的车次信息库,在以后的业务活动中根据具体需要删除或者修改某些车次信息。 ◆ 销售情况统计

用户可以统计某一时间段内某个车次或者某个代售点的销售情况,当然也可以查询所有车次或者所有代售点的销售情况。

6

2 系统设计

2.1系统总体设计

2.1.1设计目标

采用现有的互联网资源,实现B/S结构的铁路客车售票系统。 2.1.2设计原则

◆系统安全可靠;未经注册的用户不能登录系统,用户个人信息和购票信息通过互联网上传输时,要确保信息的安全性。

◆系统准确及时;用户对系统进行操作时,系统应在很短时间内(一般以秒为单位)给与响应。

◆系统的可扩展性;对于用户新的需求,能做到只需添加新模块即可满足用户要求。

2.1.3功能设计

图2.1系统总的功能模块结构

2.2系统功能模块设计

7

2.2.1注册模块

注册模块是每个信息系统必须有的一个功能模块,现在常用的注册机制主要有三种:

◆ 用户登录ID和密码直接由管理员分配,用户只能修改密码。

◆ 用户输入注册信息,等管理员验证通过后,给出登录名和密码,用户可以修改密码。

◆ 用户正确输入注册信息后,系统直接通过验证,把用户注册的用户名作为合法用户,这种是最常用的。本系统用的就是这种登录方式,这种注册方式用户名和密码都可以修改。

2.2.2登录模块

用户输入系统网址,首先出现的是系统登录页面,登陆页面的主要功能是验证用户的合法性,如果用户不经过登陆页面直接输入其他系统页面的网址,系统也会自动跳转到登陆页面。登录页面上还有注册用户入口 ,用户第一次使用本系统应该先注册,后使用。

2.2.3售票模块

买票模块可以说是客车售票系统最重要最核心的模块,其它的功能模块都是为是以它为核心,为它服务。进入买票页面后,用户可以选择或输入车次,开车时间,起始站,终点站,座位类型,是否学生票,票数等信息,可以点击计算价格和购买按钮。买票成功后可以给出用户具体的票据,也就是车票,本系统暂时先模拟了一张车票,车票上有打印按钮,当用户点击打印按钮,理论上可以打印出实际的车票,这个功能要设计到系统和车票打印机的连接,本系统主要侧重软件实现。

2.2.4订票模块

8

订票模块也是客票系统中必不可少的功能模块,订票是指在超出买票期限时用户可以和代售点达成协议,先付款预定车票,这也是缓解客票销售紧张的一种好方法。

订票界面和买票界面差不多,只是在买票页面上多了用户信息栏。当用户想要订票时候,除了需要输入车次信息和票数外,还要输入自己的信息,如:姓名,联系方式,身份证号,地址等。用户的订票信息将会被保存到订票表里面(订票表)。

2.2.5退票模块

有的用户可能会应为很多原因,原先买的或者订的票现在又不想要,所以退票这个功能也是必不可少的。现在火车站退票的规定是在列车开车前可以退票,只能退还原票价80%的金额。退票模块分为两种退票方式:退票和退订。本系统设置的退票,退订比率均为80%,即无论退票还是退订返回给用户的金额是原票价的80%。用户退票成功后,用户的在dingpiao表里面(订票表)的纪录要立即删除。

2.2.6查询模块

如果用户买票时已经知道要购买的车次,那么直接在买票模块里输入车次就可以进行买票;如果用户买票时只知道出发地点和到达地点,这时就要用到查询功能,在查询功能支持两种查询方式:按车次查询和按站点查询。按车次查询直接输入车次就可以查出来该车次的车次信息;按站点查询又分为三种查询方式:按起始站,按终点站,按起始站和终点站的组合。无论以哪种方式查询,查询结果里面除了显示每一趟车次的详细信息外,每趟车次后面还有一个购买按钮,点击它就会跳到买票页面,用户就可以在这里购买该车次车票。

2.2.7个人资料模块

个人资料模块是个相对比较小的功能模块,它的作用是供用户查看或者修改

9

自己的资料。用户登录系统主界面后,点个人资料系统就可以显示当前登陆用户的信息。用户可以在上面修改保存自己的信息。

2.2.8 管理用户模块

管理用户功能主要是为了方便系统管理员对所有用户的管理,系统管理员在这里可以查看,修改和增加用户。如果某个代售点被取消,管理员就可以在这里删除它的用户信息。

2.2.9更新车次模块

更新车次模块主要作用是方便管理员建立基本车次信息库,车次信息库由基本车次信息和详细路段信息组成,并且它们是相互对应的,基本信息里面只保存了该车次开车时间,到达时间,起始站,终点站,车辆类型等信息。详细路段信息包括该车次沿途经过所有站点的站名,各段的开始到达时间和路程信息等。管理员可查看,修改,增加删除车次信息和详细路段信息。

2.2.10查询剩余票模块

查询剩余票功能是方便管理员了解某个车次或者所有车次的车票销售情况。管理员可以搜索指定车次或者所有车的的车票销售情况,查询结果里面有该趟车所有类型座位的车票剩余数。

2.2.11新闻管理模块

这里的新闻管理功能是针对管理员的,管理员在这里可以对系统发布的新闻进行后台管理,比如查看,增加 ,修改,删除新闻等,由于新闻一般比较多,删除新闻时主要是用时间段范围删除,即选定新闻发布的起始日期和终止日期,则这一段时间内的新闻都将被删除。 2.2.12留言管理模块

10

留言管理是管理员针对用户的留言进行管理,管理员在这里可以看到用户的留言标题,内容,作者名称,留言时间等信息,管理员也可以对留言进行批量的删除。

2.2.13销售统计模块

要进行销售统计,主要是设置三个统计条件: ◆统计的时间范围选择,这是最基本的统计条件

◆统计方式选择,它又分为三种:按车次,按代售点,所有 ◆统计结果显示方式,它分为两种:记录和合计。

2.3数据库设计

本系统采用的数据库软件为SQLserver2000,本系统用到的数据库名为selltickets(售票),它里面包括9张表,为了便于理解,本系统的所有表的字段名称都为中文汉字,下面逐一介绍。

字段名称 序号 用户名 密码 联系方式 负责人 单位全称 数据类型 Int Char Char Varchar Char Varchar 长度 4 10 10 50 10 50 描述 主键 用户名 密码 联系方式 负责人 单位全称 11

具体地址 身份证 代售点编号 Varchar Char Int 20 20 4 具体地址 身份证号 为代售点用户自动分配编号

2.3.1 user表(用户表)

2.3.2 车次详细信息表 字段名称 序号 车次 开车时间 到达时间 出发站 到达站 数据类型 Decimal Char Datatime Datetime Char Char 长度 9 18 8 8 50 50 描述 主键 车次 开车时间 到达时间 出发站 到达站 12

行程 Decimal 9 每两站之间的距离

2.3.3 列车价格表 车次 列车价格 价格表 描述 主键 路程分段计费 序号 里程 普通列车 Int Int Decimal Decimal 4 4 9 9 字段名称 数据类型 长度 普通列车对应路普快列车 段价格 普快列车对应路特快列车 段价格 特快列车对应路空调费率 段价格 路段空调费率 座位类型

2.3.4dingpiao表(订票纪录表) 字段名称 序号 标题 内容 作者 时间 数据类型 Int Varchar Varchar Varchar Datetime 座位类型 Decimal 9 Int 9 Char 10 长度 4 50 1000 50 8 描述 主键 标题 留言内容 留言的用户名 发表留言的时间 3 系统实现 本章主要讲如何在前面分析和设计的基础上通过ASP.NET和sqlserver2000

13

来实现售票系统。下面将详细介绍每个功能模块是如何实现。

在讲系统实现之前,现讲一下asp.net是如何对数据库进行操作的,因为本系统的所有模块基本上都涉及到数据库操作。

SQLserver2000数据库属于关系型数据库,而关系型数据库中最重要的也是最基础的是数据表 ,数据表是一系列相关数据的集合,每张数据表可分为行和列,每一行是一条记录,每一列是一个字段,为了存储数据,可以建立相应的数据表,使得数据以一条一条的记录方式存储在数据表中,当然这些都是用数据库管理软件来实现的。

数据库和数据表创建好后,我们就可以对数据库进行读写操作,asp.net是用ado.net来对数据库进行操作的,ado.net是一组有.NET Framework提供的对象类的名称,用于数据存储中的数据交互,需要注意的是,ado.net使用的是数据存储的概念,而不是数据库的概念,就是说,ado.net不但可以处理数据库中的数据 ,还可以处理其他存储方式中的数据,例如XML格式,Excel格式和文本文件格式中的数据。

Ado.net与ado相比有更大的可伸缩性和互操作性,它的一大特点是可以对断开的数据集进行操作。在Web应用程序中,由于用户在使用网页访问数据库时,网络一般是断开的,只有当用户发出请求时才与数据库建立连接,一旦请求完毕,就断开连接,这样做的最大好处就是可以节约服务器的资源,所以ado.net这个特性可以很大程度上提高应用程序的效率。

建立数据库连接的方法很多,如果使用的OLE DB编程接口,就要使用OleDbConnection对象,如果使用的是SQL Server编程接口,就要使用Sqlconnection对象(本系统使用的就是Sqlconnection对象)。

如果要与数据库中的某一张表建立连接,在服务器资源管理器中找到对应的表,把它拖到对应的页面中去,系统会自动生成sqlDataAdapter对象和sqlConnection对象,我们可以用sqlConnection来生成数据集dataset对sqlDataAdapter按照提示向导做简单的配置,就可以在程序里调用它.

3.1登陆模块

14

3.1.1实现原理

用户输入用户名和密码后,点击登录,系统执行登录按钮的鼠标点击事件,登录按钮的鼠标点击事件里面先判断用户名和密码两个文本框是否为空,如果为空,提示“输入信息不完整!”,如果两个文本框不为空,以用户名为查询条件,查询user表(用户表),查询出来的结果填充到数据集里面,然后判断数据集里面的数据表,如果行数为空,说明用户为非法用户,提示“用户名或者密码错误”,如果行数大于等于一,通过验证,跳转到系统主界面。

3.1.2关键代码

import java.util.Scanner; public class Test {

public static void main(String[] args) {

String cha=\

int i=(int)(Math.random()*100); while(cha.equals(\

System.out.println(\这是一个游戏,请输入1~100中的一个数字

\

while(true){

Scanner str = new Scanner(System.in); int s=str.nextInt(); if(s>i){

System.out.println(\你输入的数大了\

15

}

}

else if(s

System.out.println(\你输入的数小了\

}

else{ } }

System.out.println(\恭喜你猜对了\break;

System.out.println(\是否再来一次:y/n\Scanner stb=new Scanner(System.in); String b =stb.next(); cha=b.toString();

}

}

3.2注册模块

3.2.1实现原理

注册模块里有两种注册方式:代售点注册和企业用户注册。代售点注册是针对火车站下属的售票窗口,企业用户注册是针对长期需要购票的企事业单位,如

16

大中专院校和企业单位。这两种不同的注册方式要求用户填写的注册信息不同,但是它们的注册信息是存放在同一张表(user表)里面的。既然注册信息都放在一张表里面,那么如何区分两种不同的用户?本系统从user表里的两个字段来区分:一是“代售点编号”字段,如果是代售点注册,系统在用户注册时自动分配给该用户一个编号,如果是企业用户注册,该字段为空;二是通过“用户类型来区分”,如果是代售点注册,用户类型为“1”,如果是企业用户注册,该字段值为“2”,如果是高级管理员该字段值为“0”,这个字段的值在订票和买票操作中要用到,因为不同的用户类型他的提前订票和买票时间不同。

在注册页面当用户点击两个RadioButton按钮:代售点注册和企业用户注册,这两个组件的AutoPostBack属性的值都为True,并且它们Grounpname相同,当用户任意点击其中一个,系统会自动把用户选择返回给服务器,服务器根据选择的注册方式初始化页面,点击两个RadioButton出现的用户信息填写框不同。这里是把两种用户注册信息放到一个页面里,在页面的page_load事件里,判断是那种注册方式,根据不同的注册方式隐藏一种,显示另外的信息栏。

当用户点击确定(注册)按钮时,系统首先判断页面上所有的信息栏有没有空,有空则提示“信息输入不完整”,否则进入下一步判断,用户注册页面这里要求用户名6-16个字符,密码8-16个字符,所以这里要判断用户名和密码格式是否合法,密码和重复密码要一致,密码长度要合法。如果输入信息都满足上述条件,把用户的注册信息存储到user表(用户表)里面,然后系统跳转到注册成功页面,在此页面停留5秒钟,自动回到用户登录页面,这里用户也可以手动点击回到用户登录页面。

3.2.2 Button_queding_Click事件(提交事件) ◆Button_queding_Click事件的核心代码如下:

this.sqlDataAdapter_user.InsertCommand.CommandText=”insert into [user] (序号,用户名,密码,联系方式,负责人,代售点编号,具体地址,身份证,用户类型) values(.”+xuhao+”.,.”+xingming+”.,.”+mima+”.,.”+lxfs+”.,.”+fzr+”.,.”+bianhao+”.,.”+dz+”.,.”+sfz+”.,.”+yonghuleixing+”.)”;//构造sql插入语句

17

if(this.sqlConnection1.State.ToString()==”Closed”) this.sqlConnection1.Open();//打开数据库连接

this.sqlDataAdapter_user.InsertCommand.ExecuteNonQuery();//执行插入语句

this.Response.Redirect(“zhucechenggong.aspx”);//跳转到注册成功信息页面

◆获取IP的代码如下 :

this.Label_IP.Text=Page.Request.UserHostAddress; ◆获取浏览器版本号的代码如下:

this.Label_LLQ.Text=Request.Browser.Version; 基于.NET 火车售票系统的设计与实现

3.3系统主界面

系统主界面是所有系统其它所有模块的入口,主界面上的所有按钮鼠标点击事件主要执行两种代码:一是直接跳转如:

this.Response.Redirect(“黑龙江x.aspx”);,“黑龙江x.aspx”是其它功能页面的名称,

二是在主界面的上弹出新的窗口,如: string msg;

msg = “”;

this.RegisterStartupScript(“个人信息”,msg);//执行javascript脚本

图3.3系统主界面

3.4售票模块

3.4.1实现原理

在买票页面,用户需要输入购买的车次,开车时间,起始站,终点站,座位类型,是不是学生票,票数,等信息。这里要注意的是:当用户输入车次后,直接去点起始站和终点站的下拉菜单是没有可选值的,正确定操作是输入车次后,点确定,系统会根据车次把该车次的详细路段信息绑定到起始站和终点站的下拉菜单里面,为什么要输入车次后点击确定?这就是B/S结构系统得特点,要想得到结果必须要把数据提交给后台服务器,如果只是输入车次不点确定,后台无法确定车次信息。同样的道理,当上面的车票信息都填写完后要点击价格按钮,系统会根据车次信息把价格计算出来,显示给用户。计算出来价格后,用户就可以点击购买按钮,进行买票。

点击购买按钮后,系统首先从Senssion[“name”]里面得到当前登录的用户名,根据用户名在user表(用户表)里面找到该用户的用户类型,根据用户类型得出该用户的提前买票时间;然后把当前的系统时间和开车时间求差值,把这个差值和提前买票时间做个比较 ,如果差值大于提前买票时间,提示“不在

19

购票期限内!”。否则,在dingpiao表(订票表)里面添加买票纪录 ,在tickets表(车次信息表)里把对应的车次对应座位类型的票数减去购买的票数;最后给出买票详单,买票详单上显示了车票的具体信息,这些字段信息是如何获得的?

通常有两种方法:一,买票操作成功后,调用买票详单页面,通过URL把所有的车票信息传递过去;二,调用买票详单页面时,只传递车次,详单页面的page_load事件里面直接获取车次,根据车次去订票表里面查找购票信息,再把它们显示出来,本系统用的是第二种方法。买票详单上面有打印按钮,点击它可以把车票打印出来。

3.4.2绑定车次代码

DropDownList_qsz(起始站下拉框)和DropDownList_zdz(终点站下拉框)两个下拉框开始时是空的,当用户输入车次后,点击“确定”按钮,系统会根据车次从数据库里面的ticketsinf表查询该车次的所有沿途站点,并把它绑定到DropDownList_qsz和DropDownList_zdz上,用户就可以从DropDownList_qsz和DropDownList_zdz里面分别选择起始站和终点站。

Button_quding_click(确定车次)事件里绑定起始站的核心代码如下: dsbegin=new DataSet(); //存放起始站的查询结果

sql=”SELECT出发站FROM ticketsinf”; /* 构造查询语句 sql+=” where车次=’”+ this.Text_checi.Text.Trim()+”’”; */

if(this.sqlConnection1.State.ToString()==”Closed”) /*打开数据库连接 this.sqlConnection1.Open(); */

this.sqlDataAdapter_ticketsinf.SelectCommand.CommandText=sql; /*执行查询操作

this.sqlDataAdapter_ticketsinf.Fill(this.dsbegin); */

this.DropDownList_qsz.DataSource=this.dsbegin; //以下为绑定起始站代码 this.DropDownList_qsz.DataMember=this.dsbegin.Tables[0].ToString();

20

this.DropDownList_qsz.DataTextField=this.dsbegin.Tables[0].Columns[0].ToString();

this.DropDownList_qsz.DataValueField=this.dsbegin.Tables[0].Columns[0].ToString();

this.DropDownList_qsz.DataBind();

3.4.3价格计算原理及代码

计算价格是本系统中比较复杂的一个模块。首先我们先了解一下铁路部门是如何计算车票价格的。火车票价格计算参数有四张表,它们分别是“普通列车硬座价格表”,“普通列车卧铺价格表”,“空调列车硬座价格表”,“空调列车卧铺价格表”

本系统数据库中有四张表

(putongliechejiage,putonglichewopujiage,kongtiaoliejiage,kongtiaoliechewopujiage),分别与上面四张表结构相对应。下面讲具体实现价格计算的流程:

价格计算的核心代码:(仅以普通列车硬座为例)

if((kongtiao==””)&&(zuoweileixing==”硬座”)) //如果是普通列车硬座 {

this.sqlDataAdapter_putongche.SelectCommand.CommandText=”select里程,普通列车,普快列车,特快列车,空调费率 ,座位类型from putongliechejiage “; //构造查询语句

if(this.sqlConnection2.State.ToString()==”Closed”) this.sqlConnection2.Open(); //打开数据库

this.sqlDataAdapter_putongche.Fill(this.dsputongche); //执行查询语句 int hangshu=this.dsputongche.Tables[0].Rows.Count; //记录查询结果的行数

21

基于.NET 火车售票系统的设计与实现

if(leixing==”普通”) //如果车辆类型为“普通” {

for(int i=0;i

{ if(lucheng>=decimal.Parse(this.dsputongche.Tables[0].Rows[i][0].ToString())&&lucheng

//判断路程是在那个范围内

{jiage=decimal.Parse(this.dsputongche.Tables[0].Rows[i][1].ToString())+decimal.Parse(this.dsputongche.Tables[0].Rows[i][4].ToString()); //得出价格

break; //退出循环 } } }

3.4.4售票模块界面 1.售票界面:

22

图3.9售票界面

3.5订票模块

订票模块和买票模块共用一个界面,当在软件主界面分别点击买票和订票按钮时,通过URL传递给买票页面的参数(flag)不一样,买票页面在page_load事件里面先判断flag的值,如果flag=1,买票界面下面的用户信息栏(如图5-11)不显示,如果flag=2则显示用户信息栏。其它的操作原理基本一致,只是订票操作在dingpiao表中要记录的字段多一些,这里不再阐述。

3.6退票模块

退票模块主要有两个功能:退票和退订,如果用户已经买到票,又想把票退掉,可以选择退票功能,前提是车票上的开车日期在退票之后,否则不能退;如果用户有过订票记录,但还没拿到票,现在又想取消订票,可以选择退订功能,退票和退订在合法的时间范围内返给用户的金额是原价的80%(本系统暂定为

23

80%)。退订和退票的操作流程一致,如下:

选择退票方式-}输入车次-〉选择时间-〉点“确定”-〉选择起始站和终点站-〉选择作为类型-〉输入票数—〉点“价格”-〉点退票。

这里要注意的是,如果用户选择的是退订方式,底下的用户信息栏用户要如实填写,即和订票时输入的信息要完全一样,否则退票操作不能完成。 3.6.1退票方式

用户选择退票时,系统重新加载页面显示退票要填写的信息栏。用户点退票按钮后,系统先判断所有的信息栏有没有空值,如果有给出错误提示“信息输入不完整”,如果没有空值,获取系统时间,用车票上的开车时间减去系统时间得到差值,如果差值大于等于零,表示可以退票,把订票表里面的该条买票纪录删除,并在车次基本信息表的对应车次和对应座位类型票数上加上退票数。退票方式中用到的确定车次和计算价格和买票模块中的原理基本一样,唯一不同的是退票方式下的计算价格返回的是两个值,一个原价,一个现退金额,买票模块中的计算价格只返回一个价格。

3.6.2退订方式

退订方式和退票方式界面大体一致,只是退订方式比退票多了一个用户信息栏,实现的原理也差不多,只不过退订在删除订票记录的时候必须要验证订票用户信息,当用户名,身份证号都对应上,才可以删除该条订票记录,删除订票记录后,也要修改车次基本信息表的剩余票数。 基于.NET 火车售票系统的设计与实现

3.7查询模块

查询模块的功能是当用户买票时,他只知道开车时间,起始站和终点站,但是不知道坐哪趟车,或者是用户想了解车次的详细信息等等。用户这些需求都可以通过查询功能来实现。

24

图3.7查询模块的操作 3.7.1查询模块关键代码 1.DateGrid控件

DateGrid(数据网格)控件是用来把数据库中的查询结果展示给用户,使用之前先要设置好它的数据源和数据成员。当执行了查询语句后,填充数据集,再执行数据网格绑定,数据就可以展示出来。 本页面的DateGrid控件主要有以下几个事件:

DataGrid_ItemComman事件。这个事件里面常用的命令有两种:select ,delete, DateGrid里面用到的是select命令,也就是我们在查询结果中看到的“购买”。如图5-16: 图3-16 车次查询结果 这个事件的代码如下:

if(e.CommandName==”Select”) //判断命令类型 {

25

string flag=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString(); //取当前行的索引

Response.Redirect(“maipiao.aspx?flag=”+flag); //跳转到买票页面,并传递参数flag }

DataGrid的数据源是dateset_chaxun,数据成员是tickets,数据键字段是“车次”。this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();这行代码的意思就是获取数据键字段,在这个数据网格中数据字段是“车次”。

Response.Redirect(“maipiao.aspx?flag=”+flag);这里面的flag参数传递的就是车次,用户点击“购买”后,系统会跳转到买票页面,那里面的车次字段,起始站和终点站字段系统会自动给它们绑定数据。用户只需要选择开车时间和座位类型等即可。

DataGrid_PageIndexChanged事件是DateGrid控件里面最常用的事件,它的功能是实现分页,用户可以自己定义DateGrid里面每页显示多少行(查询模块里面设置的是每页显示10行),当查询结果超过设定的行数时,DateGrid底线会出现分页符(“下一页”或者“1.2?”),点击它可以显示其与查询结果,它的代码如下:

this.sqlDataAdapter_tickets.Fill(this.dschaxun); //重新填充数据集合 this.DataGrid1.CurrentPageIndex=e.NewPageIndex; //获取新的页面索引 this.DataGrid1.DataBind(); //绑定数据 2.查询功能代码

这里的查询方式有两种:按车次查询和按站点查询。按车次算法比较简单,这里不多讲,主要讲按站点查询。

按站点查询又分为三种方式:按起始站,按终点站,按起始站和终点站组合。 如何区分三种查询方式?这里使用的是判断起始站,终点站文本框里面是否为空,它们有四种组合方式,除去全空外,其余三种刚好对应三种查询方式,

26

判断查询方式的代码如下: if(this.TextBox_qsz.Text.Trim() this.TextBox_zdz.Text.Trim() !=””)

type=”zh”; //起始站和终点站都不为空,查询类型为 “zh” else if(this.TextBox_qsz.Text.Trim() !=””) //按起始站查询 type=”sfz”;

else if(this.TextBox_zdz.Text.Trim() !=””) // 按终点站查询 type=”zdz”; if(type!=null) {

this.displaycc黑龙江(type); //调用查询车次函数 }

查询车次函数displaycc黑龙江的代码比较长,这里不具体给出,只讲一下查询原理。调用查询函数时要传递查询方式参数(type)过去,如this.displaycc黑龙江(type),displaycc黑龙江函数的内部执行结构是这样的:用case语句进行判断type的值,如果type=”sfz”,即按起始站进行查询,如果type=”zdz”,即按终点站进行查询,这两种查询方式原理其实是一样,它以出发站(到达站)作为查询条件,去搜索tikcetsinf表,把查询结果填充到dateset (数据集)中去,如果dateset .tables[0].rows.count >1,进行循环取。

每一行的车次字段值,然后以车次为查询条件对tickets表进行查询,把该车次的基本信息展示给用户。

组合查询(即有起始站又有终点站)方式:假如我们要查询从成都到北京西的车次信息,首先把ticketsinf表中的车次,出发站,到达站三个字段全部查询出来放到数据集的一张表里面,假如这张表名为table,用count纪录table表的行数。执行循环:(for i=0;i

如果table表里面的第一行的出发站等于成都,作标记flag1=1,并纪录该

27

!=”” &&

行的车次,然后再判断该行的到达站是否等于北京西,如果该行的到达站也等于北京西站,作标记flag2=2,如果flag1=1并且flag2=2,以该行的车次为条件对tickets表进行查询,把查询结果展示给用户;如果第一行没有满足条件,继续判断下一行纪录,假如某一行的出发站等于成都,但是它的到达站不等于北京西,而在下面的某行找到一行到达站等于北京西,这时候就要判断车次,因为ticketsinf表中纪录很多车次的信息,如果不判断车次是否相等,会出现查出错。如果结果在table都查询完后仍没有满足flag1=1并且flag2=2 ,它们的车次相等,则说明没有用户要的车次信息。

3.8个人资料模块

个人资料模块位于系统主界面上,用户登陆系统后,可以对自己的个人信息进行修改,但是用户自己不能修改用户类型和代售点编号。

3.9站内新闻模块

火车站如果发布了最新通知或者新闻,代售点或企业单位通过新闻模块了解最新的业内信息和一些车次变动信息。这里说的新闻模块是指用户看到的新闻页面,具体新闻的添加删除会在后面的用户管理里面详细谈到。

用户打开站内新闻页面时,页面就已经有新闻显示出来,比如今日要闻栏里显示的今天的所有新闻,以往新闻里显示的是所有的新闻纪录。新闻栏里显示的是今日新闻的第一条新闻,这些都是不用用户操作 直接显示出来的,所以它们的代码都是在Page_load事件里面执行的。

今日要闻的实现原理是:从系统获取今天的日期,以它为条件所有数据库里的xinwen表(新闻表),然后把查询结果的新闻标题绑定到DataGrid_jryw(今日要闻_数据网格),这里要注意的是,从xinwen表里面查询出来的新闻标题可能很长,如果直接绑定到DataGrid_jryw中去可能界面比较乱,所以在绑定之前先要对查询结果进行处理,这里是利用循环语句把查询结果所有的行都执行

28

substring(0,10)方法,这样标题就只显示前10个字符,substring是string()自带的方法。

以往新闻的代码原理和上面一样,不同的是它无条件的执行查询语句,即查询所有新闻内容。

3.10意见反馈模块

该功能在系统的主界面上,它的作用是把用户在使用系统中遇到的问题,或者意见建议及时地反馈给管理员,为系统的升级和完善提供参考意见。意见反馈模块被调用时是以窗口形式出现在主界面上的。用户填写好意见标题和内容后,点击“提交”按钮,用户意见将被保存到liuyan表(留言表)里面。

3.11用户管理模块

前面介绍的模块都是面向用户的,普通用户登录系统时,用户管理模块是不可见的,当登录用户名为admin时,用户管理模块可见,它的主要功能是方便管理员管理整个系统,当本系统第一次安装运行后,管理员要做的操作是进入“更新车次”模块,建立基本车次信息表和车次详细信息表,只有这些数据添加后,本系统才可用。用户管理模块包括以下子模块:管理用户,查询剩余票,更新车次,新闻管理,信息反馈,销售情况查询。

3.12管理用户模块

管理用户模块的主要的功能便于系统管理员对系统注册用户进行查询,修改或者增加新的用户。查询子功能分为按用户名模糊查询和查询所有用户;这里的修改用户信息功能和系统主页面里的修改用户信息功能不太一样,管理员在这里可以修改用户的所有信息,包括用户类型和编号等。

用户的查询结果是绑定到数据网格DataGrid(数据网格)上,由于用户信息字

29

段很多,DataGrid不能把用户信息全部显示在一行,所有这里就在DataGrid里的每一行后面增加了一个“详细/编辑”按钮,点击它可以弹出一个新窗口,在新的窗口里面可以看到用户的详细信息,还可以对用户信息进行修改。 统计在线人数的实现原理如下:

在Global.aspx里设置一个变量counter用来存储当前在线用户数量,当有用户进入系统后会触发Session_Start事件,counter加一;当有用户离开系统后会触发Session_End事件,counter减一,这样就可以实现统计在线人数的功能。

具体代码如下:

protected void Session_Start(Object sender, EventArgs e)//当有用户进入系统后counter加一 {

counter++; }

protected void Session_End(Object sender, EventArgs e)//当用户离开系统后counter加减一 {

counter--; }

3.13查询剩余票模块

如果管理员想知道哪趟车现在的车票剩余情况,可以在这里进行查询。这个模块里面的查询方式分为两种:按车次查询和查询所有车次。这个模块功能相对比较简单,它只是涉及到一些数据库查询操作。 按车次查询代码如下:

30

sql=”select * from tickets where车次=.”

+this.TextBox_cxcc.Text.Trim()+”.”; //构造查询语句

this.sqlDataAdapter_tickets.SelectCommand.CommandText=sql; if(this.sqlConnection1.State.ToString()==”closed”) this.sqlConnection1.Open();

//如果数据库连接关闭,打开数据库连接

this.sqlDataAdapter_tickets.Fill(this.dataSet_checi); //执行查询语句,把查询结果绑定到数据集上 this.DataGrid1.DataBind(); //绑定数据网格

this.DataGrid1.Visible=true; //让数据网格可见

3.14更新车次模块

更新车次这个模块式比较重要的模块,系统管理员在列车售票系统安装完成以后,首先要用到的就是这个模块。在更新车次里,首先在车次基本信息表里添加车次记录 ,然后根据车次基本信息表对应的在车次详细信息表里把对应的详细站点,停开时间,路程等都添加进去,这样用户才可以在客户端查询到车次信息。车次基本信息的字段比较多大体结构

在上图可以看到车次基本信息的字段构成,当用户第一次进入这个页面时,基本信息里面的这些文本框都是不可用的,如果用户想要增加新的车次信息,点击“增加基本信息”按钮,上面的文本框都变成可用状态,基本信息填完后点“增加”按钮,即可完成一次增加车次基本信息操作,如果用户想对已有的车次基本信息进行修改,首先输入车次,点击“确认车次”按钮,系统会把该车次的所有基本

31

信息都显示在对应的文本框里面,用户可以对其进行修改,修改完后点击“更新“按钮,即可完成一次修改操作。

修改完后点“更新“即可。如果你想在以后的详细路段信息里面追加一条路段信息,点“增加“,这时编辑路段信息栏全部清空,您输完新的信息后点”确定“就可以增加一条新的路段信息。

3.15新闻管理模块

火车售票系统中一个很重要的功能就是新闻管理,因为整个铁路运营中总会出现一些车次临时增开,停开,车次调换等等不确定因素,这些信息必须要能及时的传达给火车站下属代售点,这样能方便买票的旅客。基于C/S结构的售票系统它的客户端一般不具备新闻查看的功能,要查看新闻通知,只能登陆专门的网站。这样不方便客户在第一时间得到最新的通知。本系统集成了新闻模块,这样便于用户查看新闻通知,新闻管理模块对于整个售票系统来说是相当重要的。

新闻模块分为两部分:新闻管理,和新闻查阅。新闻查阅位于系统的主界面上,新闻管理在用户管理里,只有高级管理员才拥有操作权限。新闻查阅在前面已经讲过,下面着重讲一下新闻管理的基本结构和实现方法.

新闻管理模块中管理员主要操作分为增加,搜索,查看,删除新闻。增加新闻功能中用户只需输入新闻标题和和内容,新闻发布时间有系统自动附加。搜索功能主要是按时间段进行搜索,管理员可以选择新闻的起止时间,在搜索出来的结果点详细就可以查看新闻,也可以对其进行修改。为了减轻系统负担,管理员可以定期对过去的新闻进行删除,这个也是按时间删除 ,选择要删除的新闻的起止时间,点全部删除即可。

3.16留言管理模块

B/S结构的客票销售系统得另一个优点就是用户和管理员沟通比较方便,如果用户在使用过程中有什么问题或者建议,可以通过留言板反馈给管理员,便于

32

管理员及时解决问题,用户留言位于系统的主界面上,这里主要讲留言的后台管理。管理员可以查看(按时间段查询)留言,删除留言(按时间段删除)。用户留言包括标题,内容,留言者姓名,留言时间等信息。管理员管理留言的基本步骤为:按日期查看留言(一般是每天查看一次),在留言列表里面点详细按钮,可以查看具体留言信息包括作者,留言时间,内容等,对于过期的流言管理员可以直接选择日期进行删除。

3.17销售统计模块

销售统计在整个客票系统的管理中有着至关重要的作用,管理员通过对某一段时间段内的客票销售情况统计,可以为客票系统管理者的决策提供一定的依据。

销售统计模块的设计结构是:以时间范围为基本的统计条件;选定时间段后,用户可以进一步选择查询方式(按车次,按代售点,查询所有);上面两个条件选定后,用户可以进一步选择查询结果显示方式(记录,合计),“记录”方式的意思就是把每一条的购票或者订票记录都显示出来,“合计”方式的意思是显示某一时间段所有销售累计(本系统暂时只统计车票的销售数量和总的销售金额),三个统计条件确定后就可以执行统计操作。

如果查询结果选择的是以记录方式显示,点“查询”后,则查询结果显示在本页面的下方,如果查询结果选择的是以合计方式显示,点“查询”后,系统会在弹出的窗口里面显示查询结果。由于按车次统计的合计和按代售点统计的合计要显示的字段不同,这里做了两个弹出窗口,用来分别显示按车次和按代售点的统计结果。

如果要统计售票情况的合计值,点“查询”后,系统会把查询的起始时间,终止时间,查询方式,如果按车次查询,只传递车次 ,如果是按代售点查询,则传递代售点的编号,这些参数传递到弹出窗口页面后,新的页面的page_load事件里首先从URL里面获取参数,得到参数后,在对dingpiao表(订票记录表)进行查询。

33

点击“查询”按钮后,首先要进行查询方式和显示方式的判断,查询方式有按车次,按代售点,查询所有三种方式,显示方式有按记录和按合计两种方式,这样就有6种组合方式,不同的组合方式执行的代码不一样 ,显示的结果也不一样。

通过URL传递参数的代码:(传递参数到tongji.aspx页面)

string canshu=”cxfs=”+cxfs+”&qssj=”+qssj+”&zzsj=”+zzsj+”&checi=”+checi;//构造参数 string msg;

msg = “”;

this.RegisterStartupScript(“售票情况统计”,msg); //执行脚本 通过URL获取参数代码:

string qssj1=Request.QueryString*”qssj”+;//起始时间 string zzsj1=Request.QueryString*”zzsj”+;//终止时间 string cxfs1=Request.QueryString*”cxfs”+;//查询方式 string checi=Request.QueryString*”checi”+;//车次

以上就是本系统所有模块实现的细节,由于本系统设计的程序代码比较多,所以本论文针对最常用的功能实现给出了具体的原代码。本论文中的所有系统实现界面截图均是系统通过调试运行时的真实数据。

34

总 结

课程设计是一次理论与实践的相结合,是我们的又一次成长。

课程设计可谓一路波折,整个过程中出现了很多令人意想不到的问题。例如,我们最初是想实现人事管理系统,由于几次攻克都未果,过多的东西以我们的水平无法实现,所以不得不放弃。于是我们选择了火车管理这一课题。

回顾起此次课程设计,至今我们仍感慨颇多,将理论转化为实践,在这整个过程中,我们不仅可以学习,还得到了相应的锻炼。不仅巩固了以前所学过的知识,而且还学习了新知识,如C#。这次的课程设计是我们慢慢摸索而来的的结果,有点惨不忍睹。对于界面以及前后台的链接在以往课程设计中我们是没有做过的。一开始,我们像迷失了方向的羔羊,不知何去何从。一是我们真的不会,而是我们找到的现有资料无法给我们完整的参考,在某些环节中总是出现错误,于是各方求救。由于实践的机会太少,平时下的功夫也太少,如今也只能慢慢摸索了。对我们来说最困难的不是前台界面的建立,后台数据库的表的导入,而是怎么实现前后台的链接。这是我们的第一次尝试。

通过这次课程设计,说实在,感觉自己的水平还很差,要学的知识实在很多。做后台也不是件容易的事情。不过,我们通过付出辛勤的劳动,一切掌握不会遥不可及的。我们只有投身实践,才知道我们的差距有多么的远,才知道那些没有掌握好。同时在设计的过程中发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,所以在做课设的过程之中老是需要找资料,这严重影响了我们完成课设的进度。

我们所做的“火车管理”的课题。首先我们要建立几个界面,第一登陆界面,可以进入购票系统;第二是查询界面,查询你想知道的货车信息;第三订票界面,填入相关信息实现火车购票。我们要考虑到火车的变动,以及信息的变动。同时,我们也允许退票的存在,在系统中实现网上支付,等等一系列问题。在我们的后台中,还要将这些用户存储起来,供我们再次使用。当然,我们还需要管理员,以便对信息进行添加和修改,甚至删除。伴随着每天信息的更新,我们必须及时更新给广大需求者。

最高兴的是我们团队的合作精神,一根筷子易折,二十根筷子不易折不,不一样的人,不一样的思维才能碰撞出不一样的火花。在设计中遇到了很多问题,但是在我们的共同努力下尝试着解决。看似很简单的问题,有的却使我们颇为吃力。在前后台的连接中,我们摸着石头过河,纵然还是有很多东西不太熟悉,但这个过程中我们还是学到了不少的东西。对于

35

某些错误,除了老师和同学的帮助外,我们摸索着解决。对我们来说,结果不重要,重要的是过程。

通过这此课程设计,我们又一次成长了,但我们的脚步不会再此停止,我们要不断提高自身能力,向着更高更远的方向前进。

36

参 考 文 献

[1]《软件工程》 ----------张海潘编 清华大学出版社 [2] 陶宏才.数据库原理及设计[M].清华大学出版社,2004.2.

[3] 方振球.铁路无线售票系统的设计与开发[M].铁道科学研究院,2003.6. [4] 黄钧.网络售票数据库安全通信系统[M].成都理工大学,2002.5. [5] 谢帕,梁超,张莉.ado.net技术内幕[M].清华大学出版社,2003.10. [6] 袁勤勇.NET Framework编程思想[M].清华大学出版社,2002.1. [7] 火车票价计算,票价表.http://www.huoche.com.cn/piaojia/ [8]《软件工程》 --------王利福 张世琨 编著 北京大学出版社 [9]《数据库原理及应用》 ------张国辉 编著 科学出版社

37

本文来源:https://www.bwwdw.com/article/hfl6.html

Top