第一篇:课程设计火车票售票系统的需求分析
二.需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为八个模块,每一个模块对应一个函数。在这些函数当中,添加车次数据函数、售票函数、查询总额函数的实现严格按照题目的要求,而显示时间函数和显示车次函数属于附加功能。读取文件函数和保存信息函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。
1.添加车次函数
主要实现程序最初运行时车次的录入 2.旅客买票函数
实现的功能是按照旅客所需车次几所购买车票的数目 3.查询车票总额
按照题目的具体要求实现的是总额的查询 4.显示函数
实现的是显示目前所有的有效车次信息
除上面介绍的功能之外,程序还具有显示当地时间,以及退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个车次都包含车次、日期,始发、终点以及所受票数和所需费用,在程序当中,将车次类型定义为结构体类型,添加的车次信息直接写入E盘的train.txt文件中,其它函数每次对车次记录的访问,其数据来源都是train.txt文件,这样做不但可以保证学生数据的一致性,而且可以对车次数据进行永保存,保证每次运行程序都可以采用原来的数据
近年来,中国乃至世界的人口急剧增加,人口流动量也随之增加,火车作为一种便捷且相对 比较便宜的交通工具也受到广大出行者的青睐,为了减轻铁道部售票的压力,特此编写此程序,便于乘客在网上购票。
3.1.2 软件项目概述
本系统拥有四大功能,分别是查询、订票、改签和退票。在使用不能系统之前,用户必须注 册用户名,用户名必须包括乘客的身份证号,这样可以实行实名制购票,防止在购票高峰,非法 分子以高价倒卖火车票,以此来保证乘客的利益。用户在利用用户名登陆本系统以后,方可经行 查询、订票、改签和退票的相关操作。其中,查询允许乘客对自己所需乘坐的列车经行查询,来 判断是否有票,如果有票,乘客则可以选择订票,订票以后,用户的信息将被修改,用户信息将 会添加刚才购买的火车票的列车车次以及起始地和目的地。如果乘客已经购票,需要换票,则必 须先查询是否有需要换的票,如果有票,则可以经行换票操作,同样,用户信息将也会被修改。
当乘客已经订票,需要退票,点击退票,则可以退票,但同时会弹出
需要用户支付手续费的窗
口,用户支付完手续费后,退票成功,用户信息将被修改,推掉的车票对应的列车号以及相关信 息将从用户信息中删除。
3.2 订票流程设计
3.2.1 订票流程描述
乘客在使用系统之前,首先注册新用户,需要输入自己相关个人信息,包括自己的身份证号 码,名称,登陆密码等。当已经注册好用户以后,用户可以利用自己的证件号码和登陆密码登陆 火车票订票系统,乘客需先查询自己所需要乘坐的列车,看是否有票,如果有票则可以选择订票,进行订票;如果用户已经购票,需要换票,则需要查询目标票看其是否有剩余,如果有剩余,则 可以进行换票,当用户输入已拥有的火车票的列车号点击退票,则可以经行退票。当然,以上操 作都必须建立在用户已登录的基础上
阶段通过对系统目标的初步调研和分析,提出可行性方案并进行论证。我们在这 里主要从技术可行性、经济可行性和操作可行性三方面进行分析。2.1.1 经济可行性
本系统其他应用软件、硬件系统也易于获得.因此 , 开发成本较低。而引进使用本系
统后,与传统方式相比,具有高效率、低成本、高质量的特点,可以节省不少人力、物 力及财力。所以,从经济的角度来看,该系统可行。2.1.2 技术可行性
开发工具: VS2005
数据库环境: SQL Server 2005 系统环境:
Microsoft Windows 2000 或以上版本。
系统实现依靠相对熟悉的 c 语言和 SQL Server2008 数据库系统,其基本操作实质还
是对数据库进行添加、删除、查找等操作。2.1.3 操作可行性
系统采用菜单式,实现用户与数据库的交互,界面简洁友好,操作方便。2.2 需求分析
需求分析是软件设计的一个重要的环节。本阶段对订票系统的应用情况作全面调
查,以确定系统目标,并对系统所需要的基础数据以及数据处理要求进行分析,从而确 定用户的需求。用户对系统的需求我们从以下几方面进行分析。2.2.1 功能需求
本网上售票系统应该具备如下功能: 1.查询
分为对车次信息的查询和客户对已订车票信息的查询。要求: 1)对车次的查询,可以按照发车车次进行查询; 2)车次信息包括:车号、出发 地、目的地、发车日期、开出时刻、票价。3)座位类型设定。4)车次信息只允许用户查询,不能修改。2.添加车票
通过查询系统,客户根据自己的需求找到满意的车次,再输入个人信息后直接通过 网上售票确定已预订选中的车票。要求 :
售票记录应包括:会员名、车号、发车日期、订购票数、总价。3.退票
可退票,通过查询系统,客户可以根据自己的名字找到自己的订票信息,通过退票 模块退去已购车票。2.2.2 数据需求 信息需求,即在系统中需要处理哪些数据。根据对火车站网上订票系统的分析,本 系统的信息需求如表 2-1 所示。表 2-1 信息输入输出 信息输 入 信息 处理 信息 输出 用户输 入所需车次 检索 系统数据库 符合 用户需求的车次及相关 信息 用户输
入个人信息及所需 购的车 票信息 更新
系统中的订票信息,将新
信息存入系统数据库 操作
反馈(如找零)2.2.3 性能需求
为了保证系统能够长期、安全、稳定、可靠、高效的运行,本系统应该满足以下的 性能需求。1.准确性和及时性
系统处理的准确性和及时性是系统的必要性能。系统应能及时而且准确的根据用户 权限及所输入的信息做出响应。
由于本系统的查询功能对于整个系统的功能和性能完成
举足轻重。作为系统的很多数据来源,而车票的数量和时间又影响用户的决策活动,其 准确性和及时性很大程度上决定了系统的成败。在系统开发过程中,必须采用一定的方 法保证系统的准确性和及时性。2.易用性
本系统是直接面对用户的,而用户往往对计算机并不是非常熟悉。这就要求系统能 够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使 用用户熟悉的术语和中文信息的界面,从而保证系统的易用性。
第二篇:火车票售票系统 需求分析报告
三、需求规格说明书
三、需求规格说明书
1.引言...........................................................................................................................1 1.1编写目的.............................................................................................................1 1.2项目背景.............................................................................................................2 1.3定义....................................................................................................................2 1.4参考资料.............................................................................................................2 2.任务概述....................................................................................................................2 2.1目标....................................................................................................................2 2.2运行环境.............................................................................................................3 2.3条件与限制..........................................................................................................3 3.数据描述....................................................................................................................3 3.1静态数据.............................................................................................................3 3.2动态数据.............................................................................................................3 3.3数据库介绍..........................................................................................................4 3.4数据词典.............................................................................................................4 3.5数据采集.............................................................................................................8 4.功能需求....................................................................................................................8 4.1功能划分.............................................................................................................8 4.2功能描述.............................................................................................................9 5.性能需求....................................................................................................................9 5.1数据精确度..........................................................................................................9 5.2时间特性.............................................................................................................9 5.3适应性.................................................................................................................9 6.运行需求....................................................................................................................9 6.1用户界面.............................................................................................................9 6.2硬件接口...........................................................................................................10 6.3软件接口...........................................................................................................10 6.4故障处理...........................................................................................................10 7.其它需求..................................................................................................................10
1.引言
1.1编写目的
本需求分析报告的目的是规范化本软件的编写,旨在于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,同时提出了本火车售票系统的软件开发过程,便于程
三、需求规格说明书
序员与客户之间的交流、协作,并作为工作成果的原始依据,同时也表明了本软件的共性,以期能够获得更大范围的应用。本文档供项目经理、设计人员、开发人员参考。
1.2项目背景
a.项目的委托单位:中国铁路局 b.开发单位:xx大学 c.主管部门:计算机学院 d.软件名称:火车售票系统 e.软件开发者:
1.3定义
a.铁路售票应用系统软件:基本元素为构成铁路售票及相关行为所必须的各种部分。
b.需求:用户解决问题或达到目标所需的条件或功能;系统或系统部件要满足合同、标准,规范或其它正式规定文档所需具有的条件或权能。
c.需求分析:包括提炼,分析和仔细审查已收集到的需求,以确保所有的风险承担者都明其含义并找出其中的错误,遗憾或其它不足的地方。
d.模块的独立性:是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他的模块的接口是简单的。
1.4参考资料
a.《实用软件工程》(第二版)郑人杰,殷人昆,陶永雷。清华大学出版社,1997。b.《JAVA网络高级编程》金勇华,曲俊生。人民邮电出版社,2001。
c.《JBUILDER培训教程》Borland software corporation。机械工业出版社,2002。
2.任务概述
2.1目标
(1)完善目前火车售票系统,使之能跟上时代的发展。同时通过实践来提高自己的动手能
三、需求规格说明书
(2)应用范围:理论上能够实现于铁路部门的售票系统,其目的在于在原有的系统基础使得火车售票便捷化,以期实现完善日常生活中火车售票的各种缺陷。
(3)可实现旅客对于火车票的查询与购买功能,售票员则可实现查询、添加和删除等功能;对于所查询的车次结果提供列表显示输出;有一定的安全机制,普通旅客不能对车次信息随意删改,只有授权的售票员可通过密码识别进行维护。
2.2运行环境
操作系统:Microsoft Windows 2000 Advanced Server 支持环境:IIS 5.0 数 据 库:Microsoft SQL Server 2000 2.3条件与限制
一个更完善的火车票售票系统,应提供更为便捷与强大的查询购买功能,如相应的网络操作及服务,由于开发时间和计算机数量有限,该系统并未提供这一功能,对于信息的保护手段仅限制于设置用户级别,以记名提供数据文件的备份,比较简单,不能防止恶意的破坏,安全性能有待进一步完善。
3.数据描述
3.1静态数据
火车票:列车车号
(int SerialNumber)
列车始发时间(struct time SetOut)
列车始发站(char DeparturePoint)
列车终点站(char TerminalPoint)
票务:列车车号
(int SerialNumber)
已售出车票票数(int FixedNumber)
额定载量(int FixNumber)
售票员:用户名(char name)
密码(char password)3.2动态数据
输入数据:根据界面提示,键盘输入操作;
查询方式:查询车次、查询始发站;
三、需求规格说明书
旅客购买时的票务信息,售票员添加、购票、退票时的票务信息;
售票员备份数据恢复所需的数据备份文件;
售票员操作需密码,旅客操作受限; 输出信息:查询车次确定的数据库记录的子集;
统计结果;
车次信息录入、删除(成功或失败);
车次信息查询、购买的操作结果;
数据备份输出的数据备份文件; 内部数据:查询操作建立的索引;
3.3数据库介绍
数据库采用Microsoft Access数据库
3.4数据词典
《火车售票系统》的总体功能如下: 车票的售出; 车票的退还; 车票信息的查询;
车票的增删改;
售票员查询统计车票信息; 售票系统数据备份; 售票管理者口令修改; 1.售票员登陆系统:(1)数据流图
售票退票选择检验错误售票员选择用户名密码身份验证售票员信息密码正确登陆系统选择选择选择授权信息表查询录入新的班次信息
(2)数据词典
数据源点及汇点描述: ① 名称:售票员
简要描述:管理售票员信息
有关数据流:用户名、密码、系统选择:售票系统、退票系统、查询系统、录入信息系统 数目:1
三、需求规格说明书
加工逻辑词条描述: ① 加工名:身份检验
加工编号:1
简要描述:检验用户身份 输入数据流:用户名、密码
输出数据流:密码正确、身份验证错误 加工逻辑: IF 用户名为空 THEN
发出“用户名为空错误”
ELSE IF 密码为空 THEN
发出“密码为空错误”
ELSE IF 用户名和密码不符 THEN
发出“用户名和密码不匹配错误”
ENDIF
ENDIF
ENDIF
ENDIF 数据流名词条描述: ① 数据流名:用户名
说明:售票员姓名
数据流来源:售票员 数据流去向:身份检验
数据流组成:用户名=字符型字符串 ② 数据流名:密码
说明:与用户名相匹配的密码 数据流来源:售票员
数据流去向:身份检验
数据流组成:密码=短整型字符串 每个数据量流通量: ③ 数据流名:出错信息
说明:用于指示身份验证错误的信息
数据流来源:身份检验 数据流去向:售票员
数据流组成:出错信息=任意字符串 ④ 数据流名:系统名称
说明:系统的名称 数据流来源: 数据流去向:选择 数据流组成: 数据文件词条描述: ① 数据文件名:授权信息表
简述:存放售票员信息
输入数据:
输出数据:售票员信息
数据文件组成:授权信息表由“售票员信息”组成
三、需求规格说明书
2.售票员相关操作(售票、退票、查询、录入)
票务信息表车票信息车票信息售票退票选择检验错误售票员选择用户名密码身份验证售票员信息密码正确登陆系统选择选择选择授权信息表查询车票信息录入新的班次信息车票信息列车信息表
(2):数据词典:
数据源点及汇点描述: 1 名称:售票员 ○简要描述:管理售票员信息 有关数据流:用户名、密码
数目:1 加工逻辑词条描述: 1加工名:身份检验 ○加工编号:1
简要描述:检验用户身份
输入数据流:用户名、密码
输出数据流:密码正确、身份验证错误 2加工名:售票 ○加工编号:2 简要描述:根据所读入的操作信息,售出火车票
输入数据流:操作信息,火车票信息
输出数据流:火车票信息
加工逻辑:根据所读入的操作信息,售出火车票
数据流名词条描述: 数据流名:用户名 ○
三、需求规格说明书
说明:售票员的姓名
数据流来源:售票员 数据流去向:身份检验
数据流组成:用户名=字符型字符串 2数据流名:密码 ○说明:与职工名称相匹配的密码 数据流来源:售票员 数据流去向:身份检验
数据流组成:密码=短整型字符串 每个数据量流通量: 3数据流名:车票信息 ○说明:车票信息
数据流来源:售票员
数据流去向:列车信息表
数据文件词条描述:
① 数据文件名:列车信息表
简述:车票信息
输入数据:车票信息
输出数据:
数据文件组成:列车信息表由“车票信息”组成 存储方式:关键码 存取频率:频繁 2数据文件名:票务信息表 ○简述:票务信息
输入数据:票务信息 输出数据:
数据文件组成:票务信息表由“列车号、已售票、剩余票”组成 存储方式:关键码 存取频率:频繁
3.旅客查询购票过程:(1)数据流图
三、需求规格说明书
旅客 登录系统选择选择选择选择订票退票查询
(2)数据词典:
● 数据源点及汇点描述: 名称:旅客
简要描述:订票,退票,查询
有关数据流:系统选择:订票系统、退票系统、查询系统 ●数据流名词条描述:
⑤ 数据流名:系统名称
说明:系统的名称 数据流来源:
数据流去向:选择
数据流组成:
3.5数据采集
数据采集采用键盘输入
4.功能需求
4.1功能划分
该软件具有如下主要功能: 1.浏览功能 2.查询功能 3.添加功能 4.修改功能 5.删除功能
三、需求规格说明书
6.授权功能
4.2功能描述
1.浏览功能
列出当前数据库文件中车票的所有记录 可选定一项纪录,显示说有域 2.查询功能
车次信息匹配查询 始发站信息匹配查询 3.添加功能
增加一条车票的信息 4.修改功能
修改某一已存在的记录内容,提供确认机制 5.删除功能
删除一条记录,提供确认机制 6.授权功能
授权票务管理人员修改数据的权限
5.性能需求
5.1数据精确度
查询时应保证查全率,所有在相应域中包含查询车次的记录都应能查到,同时保证查准率。
5.2时间特性
一般操作的相应时间应在1~2秒内
5.3适应性
满足运行环境在允许操作系统之间的安全转换和雨其它又能够用软件的独立运行要求。
6.运行需求
6.1用户界面
采取对话框方式,多功能窗口运行
三、需求规格说明书
6.2硬件接口
(1)硬件接口:支持x86系列PC机
(2)网络硬件接口要求:现实中要求具有高速以太网组网一实现联网销售,但是在理论实验验证软件本身的目的来看,无需网络通讯接口。
6.3软件接口
运行于Windows2000及更高版本并装有JAVA虚拟机的操作系统之上。
6.4故障处理
正常使用时不用出错,对于用户的输入错误应及时给出适当的改正信息提示,若运行遇到不可恢复的系统错误,也必须保证数据库完好无损。
7.其它需求
(1)可用性:该软件也可以通过单步跟踪的操作进行检查处理。
(2)安全性:由于软件运行数据放在数据库中,所以参数不容易被错改、破坏,万一参数受到破坏也不会影响源程序。
(3)可维护性:该软件利用数据库进行编程,系统结构由程序基本确定,大量的参数及文本内容全部放于数据库中。修改、更新数据只要在数据库进行修改添加,而不需要对系统结构进行修改,这样系统维护性、升级都十分方便。
(4)兼容性:由于尚未测试,故无法对兼容性进行评析。
第三篇:火车站售票系统需求分析
火车票销售系统需求分析
一、引言
随着科学技术的发展,计算机领域不断取得日新月异的研究成果。计算机在代替和延伸脑力劳动方面发挥越来越重要的作用,在日常生活中随处都离不开计算机。尤其是在交通发达的今天,新时代的人们越来越依赖于方便、快捷的网络购票,计算机优势更加体现出来。在数字化的今天,为了使旅客更方便地购票、使火车售票系统更加利于管理,开发火车票销售系统更加显得重要,我们结合本次课程设计开发以下的火车票销售系统方案。
二、编写目的
本系统主要为了更好地实现火车票的自动化销售,给旅客提供一个方便快捷的购票平台。同时也为系统管理员提供一个井然有序的管理平台, 防止手工管理混乱,避免一些人为的错误。
三、功能需求
通过对火车票销售系统所需要实现的功能的分析:一个火车站售票系统主要由管理员管理系统和用户系统两部分组成。划分如下图:
四. 数据流图 顶
层
:
0层:
1层:
五. E-R图
六、数据字典
1.用户信息数据流,包括用户信息表,属性(ER图小框框里的)主要操作:用户注册后将用户信息添加进去,用户申请修改信息,管理员审核后修改数据表等。
2.火车票信息数据流,包括火车票数据表、售票数据表,属性的基本操作:用户购买、预定、退票等操作,管理员对火车票信息的修改、更新等操作,站点与火车票是一对多关系。
3.站点信息数据流,包括站点数据表,主要操作:管理员根据路况情况(维修、建造等)及时更新站点信息等操作,与火车票是一对多关系。
七、接口要求
硬件接口:无特别要求;
网络硬件接口要求:现实中要求具有高速以太网组网一实现联网销售,但是在理论实验验证软件本身的目的来看,无需网络通讯接口。
软件接口要求:无
八、软件属性
可用性:本软件也可以通过单步跟踪的操作进行检查处理。
安全性:由于软件运行数据放在数据库中,所以参数不容易被错改、破坏,万一参数受到破坏也不会影响源程序。
可维护性:本软件利用数据库进行编程,系统结构由程序基本确定,大量的参数及文本内容全部放于数据库中。修改、更新数据只要在数据库进行修改添加,而不需要对系统结构进行修改,这样系统维护性、升级都十分方便。
兼容性:由于尚未测试,故无法对兼容性进行评析。
九、支持信息及运行环境
软件支持:本系统网页端采用Myeclipes软件编写,手机端采用android stdio软件编写
设备支持:推荐配置:Windows8及以上版本、android4.0及以上版本;
数 据 库:Mysql。
十、参考资料
《数据库设计》Stephens著 机械工业出版社 《数据库系统概论》(第三版)萨师煊、王珊著 高教出版社
《数据库原理、编程与性能》作者:(美)Patrick O'Neil Elizabeth O'Neil 译者: 周傲英 俞荣华 季文赟 钱卫宁 等
《数据库系统基础教程》清华大学出版社等
第四篇:课程设计一:火车售票系统
数据结构与算法课程实验报告
班级:学号:
课程设计一:火车售票系统设计及实现姓名:
cll
一、实验内容:
火车售票系统在现实中的应用已经非常普遍,目前通常使用可视化的方法实现,例如采用C/S模式下的程序设计或者采用B/S模式下的程序设计,通常都具有较为友好的界面和较为完善的功能。火车售票系统的实现过程中,主要涉及到数据格式的设计,也就是数据结构的设计。通常在采用数据库的情况下,可以运用数据库的设计来实现。在没有采用数据库情况下需要,单独设计相应数据结构和算法。
二、实验目的:
按给定需求,通过查找相关资料,完成火车售票系统设计及实现,在设计过程中充分运用数据结构与算法课程中所学知识,从而熟练地掌握和应用线性表、单链表等重要数据结构和常用算法。提前熟悉软件需求分析,软件测试等环节,运用相应程序设计语言实现该系统,从而进一步提高程序设计能力。
三、问题描述
(1)此系统可以实现售票、退票、车票剩余情况查询等功能。
(2)每张车票包含车次、座位信息。在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。
(3)退票时,必须是车站售出的车票才能退,否则视为无效票,不能退票。(4)演示程序以用户和计算机的对话方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在后。
(5)由订票系统的主要功能使程序的命令包括: 1)查询;2)订票;3)退票 4)退出订票系统
四、问题的实现
4.1所用的数据结构(包括所用数据结构的抽象数据类型定义和说明)typedefstructLNode{ //数据域
char name[10];//订票姓名
intdnum;//订票数量
char dj[50];//证件编号
intzhekou;//1代表折扣对象
float pay;//付费
structLNode *next;//指针域
intzuohao[200];}LNode,*LinkList;//构造单链表(已订票)
typedefstructTickets{ char *endname;//终点站名
char *hnum;//车次名
intfnum;//票价
float discut;//折扣
int day;//日期
intwholenum;//总票额 intlastnum;//余票量
inttuipiao[100];//退票处理,记录退票的座位号 inttpcs;//记录目前退票次数
intmcps;//记录卖出去的票数(包括退票)LinkList la;//已订票链表
}Tickets;//构造结构类型(火车票)
typedefstruct{ struct Tickets *elem;//存储空间的基址
int length;intlistsize;//当前分配的存储容量(以sizeof(Tickets)为单位)}SqList;//构造顺序表
4.2主要实现思路
1、火车站的火车票采用顺序表表示。每趟火车出售的票用链表表示。
2、查询:输入终点站信息,输出该趟火车的票价,日期,余票数等信息; 订票:输入终点站信息,确认有该趟车之后,输入该趟车的基本信息,之后输入购票数,系统查询是否有余票,确认之后,输入个人基本信息;系统查询是否有退票,若有退票则,先售出退票。插入新的结点。
退票:输入终点站的信息,输入个人信息,1、若退出所有票,则删除该结点,若,只退部分票,则更改该结点的购票信息。
退出:退出系统;
【程序演示】
输入2 订票,购买到温州的火车票十张,姓名:a;证件号:a;
退票:输入3退票,输入终点站温州,姓名:a;证件号:a;
退票之后,继续订票3张
【实现代码】
intInitList_L(LinkList *h){//初始化带头结点的单链表
*h =(LinkList)malloc(sizeof(LNode));//生成头结点
if(!h){ printf(“初始化链表错误!n”);
return 0;}
(*h)-> next = NULL;return 1;}
intCreate_Sq(SqList *L){//初始化并创建顺序表
L->elem=(Tickets *)malloc(ListInitSize*sizeof(Tickets));if(!L->elem){ printf(“存储分配失败!”);// 存储分配失败
return 0;} L->length=5;//赋值
L->listsize=ListInitSize;int j;for(j = 0;j < L->length;j++){
L->elem[j].mcps=0;//初始化,记录买出去的票 L->elem[j].tpcs=0;//记录退票数
} inti;for(i = 0;i < L->length;i++){
InitList_L(&L->elem[i].la);}
L->elem[0].endname=“北京”;//终点站名
L->elem[0].hnum=“G2378”;//车次名
L->elem[0].day=1;//日期
L->elem[0].fnum=346;//票价
L->elem[0].discut=0.5;L->elem[0].wholenum=L->elem[0].lastnum=10;
L->elem[1].endname=“温州”;L->elem[1].hnum=“K351”;L->elem[1].day=2;L->elem[1].fnum=254;L->elem[1].discut=0.5;L->elem[1].wholenum=L->elem[1].lastnum=10;
L->elem[2].endname=“合肥”;L->elem[2].hnum=“G782B”;L->elem[2].day=3;L->elem[2].fnum=224;
L->elem[2].discut=0.5;L->elem[2].wholenum=L->elem[2].lastnum=10;L->elem[3].endname=“武汉”;L->elem[3].hnum=“D2903”;L->elem[3].day=4;L->elem[3].fnum=200;L->elem[3].discut=0.5;L->elem[3].wholenum=L->elem[3].lastnum=10;L->elem[4].endname=“厦门”;L->elem[4].hnum=“T112”;L->elem[4].day=5;L->elem[4].fnum=450;L->elem[4].discut=0.5;L->elem[4].wholenum=L->elem[4].lastnum=10;return 1;}//创建顺序表
void Demand(SqList L){ int n1;do{
char endstop[100];
printf(“*******查票窗口********n”);
printf(“请输入终点站名:n”);
do{ gets(endstop);} while(!endstop[0]);inti;for(i=0;i printf(“tt杭州-->%sn”,endstop);printf(“tt车次:%sn”,L.elem[i].hnum);printf(“tt日期:%d日n”,L.elem[i].day);printf(“tt票价:%dn”,L.elem[i].fnum);printf(“tt折扣价(学生/军人等5折):%fn”,L.elem[i].fnum*L.elem[i].discut);printf(“tt总票量:%dn”,L.elem[i].wholenum);printf(“tt余票量:%dn”,L.elem[i].lastnum);} } break;if(i==L.length-1){ printf(“没有找到%s的车票!n”,endstop);} printf(“1.返回主菜单;2.继续n”); scanf(“%d”,&n1);}while(n1==2);} void GetTicket(SqList *L){//订票 int n2=2,zhekou;//n2=1,继续订票;n2=2,返回主菜单;n2=0,确定,即订票成功 intnum;//订票数 float money;//存储应付的总票额 char endstop[100];//记录终点站名 char name[100];char ID[100];//记录证件号 do{ printf(“*******订票窗口********n”);printf(“终点站名:”); do{ gets(endstop);} while(!endstop[0]);inti = 0;for(i=0;i printf(“tt杭州-->%sn”,endstop);printf(“tt车次:%sn”,L->elem[i].hnum);printf(“tt日期:%d日n”,L->elem[i].day);printf(“tt票价:%dn”,L->elem[i].fnum);printf(“tt折扣价(学生/军人等5折):%fn”,L->elem[i].fnum*L->elem[i].discut);printf(“tt总票量:%dn”,L->elem[i].wholenum);printf(“tt余票量:%dn”,L->elem[i].lastnum);printf(“请输入订票数:”); scanf(“%d”,&num); if(L->elem[i].lastnum == 0){ printf(“对不起,到%s的车票已卖完!n”,endstop);printf(“nt1.继续订票;2.返回主菜单;n”); scanf(“%d”,&n2);}else if(num> L->elem[i].lastnum){ printf(“对不起,到%s的车票只剩%d张。n”,endstop);printf(“n1.继续订票;2.返回主菜单;n”);scanf(“%d”,&n2);}else{ printf(“购票请输入个人信息:n”); printf(“姓名:”); do{ gets(name);}while(!name[0]); printf(“是折扣对象吗?若是,请输入相关证件号,不是请输入身份证号(1.是;0.不是)n”); scanf(“%d”,&zhekou);while(zhekou!= 1 &&zhekou!= 0){ printf(“不合法输入,请重输!n”); scanf(“%d”,&zhekou);} printf(“证件号码:”);//fflush(stdin);do{ gets(ID);}while(!ID[0]);//输出订票信息,待客户确认 printf(“t请核对您的订票信息:n”);printf(“t姓名:%sn”,name);printf(“t证件号码:%sn”,ID);printf(“t杭州--%s:n”,endstop);printf(“t车次:%sn”,L->elem[i].hnum);printf(“t日期:12月%d日”,L->elem[i].day);//输出票价(两种情况) if(zhekou==1){ printf(“折扣价(学生/军人等5折):%fn”,L->elem[i].fnum*L->elem[i].discut); money=L->elem[i].fnum*L->elem[i].discut*num;//money用于暂时存储应付的总票额 }else{ printf(“票价:%dn”,L->elem[i].fnum); money = L->elem[i].fnum*num; } printf(“订票数:%dn”,num); printf(“座位号: ”); //如果有退票,优先卖退票 int k=0; //k用于记录买到的票是退票的数目 int data[100];//临时记录座位号,用于后面的保存 int j;//只用于for循环的参数,不保存数据; for(j=L->elem[i].tpcs-1;j>=0;j--){//只需要num张就够了,L.elem[i].jishu1为退票总数 printf(“%dt”,L->elem[i].tuipiao[j]);//退票的座位号tuipioa[j] k++;//买到退票数目+1 if(k>=num)break;//说明买的全部都是退票 } //退票数目不够<买票数目 if(k 此时卖出的票数即为座位号 L->elem[i].mcps += 1;//卖出去票的数目+1(包括退票) data[j]=L->elem[i].mcps; printf(“%dt”,L->elem[i].mcps); } } printf(“n总票额:%fn”,money); printf(“n 0.确认;1.取消;2.返回主菜单n”); scanf(“%d”,&n2);if(n2==0){ printf(“订票成功!n”); L->elem[i].lastnum-=num;//更新余票的数目 //在链表中插入新结点 LinkListp,s;//已订票链表的指针类型 p = L->elem[i].la;//第i趟车的已订票列表(头结点) s =(LinkList)malloc(sizeof(LNode));//新的结点 if(!s){ printf(“内存分配失败!”); }else{ s->next=p->next;//在头部插入 p->next=s; s->dnum=num;//订票数量 s->pay=money;//票价 s->zhekou=zhekou;//折扣信息 strcpy(s->name,name);//姓名 strcpy(s->dj,ID);//证件号 //将座位号记入客户信息 int flag=0; for(j=L->elem[i].tpcs-1;j>=0;j--){//只需要num张就够了,L.elem[i].jishu1为可买退票的张数 } } s->zuohao[flag]=L->elem[i].tuipiao[j];flag++; k++;//买到退票数目+1 if(k>=num)break;//说明买的全部都是退票 } //退票数目不够<买票数目 if(k s->zuohao[flag]=data[j]; flag++;} } } } break; if(i==L->length-1){ printf(“没有到%s的车票!n”,endstop); n2=2; } } }while(n2==1);} void ReturnTicket(SqList *L){ int n3=2,k; //n3=1,继续退票;n3=2,返回主菜单;n3=0,确定,即退票成功,k记录要退的票的数目 LinkList p;char name[100];char ID[100]; char endstop[100];do{ printf(“*******退票窗口********n”); printf(“终点站:”); do{ gets(endstop);} while(!endstop[0]);inti; for(i=0;i printf(“姓名:”); do{ gets(name);}while(!name[0]);printf(“证件号:”);do{ gets(ID);}while(!ID[0]); p = L->elem[i].la;if(!p->next){ printf(“没有客户!”); p->next){ }else{ p = p->next;while(!(strcmp(p->name,name)==0 p=p->next;} &&strcmp(p->dj,ID)==0)&& if(strcmp(p->name,name)==0 &&strcmp(p->dj,ID)==0){ printf(“您的车票信息如下:n”); printf(“t姓名:%sn”,p->name); printf(“t证件号码:%sn”,p->dj); printf(“t杭州-->%sn”,L->elem[i].endname); printf(“t车次:%sn”,L->elem[i].hnum); printf(“t日期:12月%d日n”,L->elem[i].day); if(p->zhekou==0){//非折扣对象 printf(“t票价:%dn”,L->elem[i].fnum); }else{//折扣对象 printf(“t 折价:%fn”,L->elem[i].fnum*L->elem[i].discut); } printf(“t订票数:%dn”,p->dnum); printf(“t座位号为:”); int flag; for(flag = 0;flag dnum;flag++){ printf(“%dt”,p->zuohao[flag]); } printf(“总票额:%fn”,p->pay); printf(“退几张?n”); scanf(“%d”,&k);//k用来记录退票的张数 if(k > p->dnum){ printf(“您只有%d票,请重新确认!n”,p->dnum); printf(“1.重新确定;2.返回主菜单n”); scanf(“%d”,n3); }else{ printf(“0.确认;1.取消;2.返回主菜单n”); scanf(“%d”,&n3); if(n3==0){ printf(“退票成功!n”); int i1 = L->elem[i].tpcs; L->elem[i].tpcs+=k;//更新退票数 for(flag=p->dnum;flag>p->dnum-k;flag--,i1++){ L->elem[i].tuipiao[i1] = p->zuohao[flag-1]; } L->elem[i].lastnum+=k;//更新余票 if(k==p->dnum){ //票全部退完的情况,删除链表中的结点 LinkList q = L->elem[i].la; while(q->next!=p){ 扣 q = q->next; } q->next = p->next;free(p);//释放资源 n3=2;//返回主菜单 折扣票 }else{ if(p->pay == p->dnum*L->elem[i].fnum){ //判断是否是 } p->pay-=L->elem[i].fnum*k;}else{ p->pay-=L->elem[i].fnum*k*L->elem[i].discut; p->dnum-=k; printf(“你还有%d张票”,p->dnum); n3=2; } }//if(n3==0) }// else }else{// if(strcmp(p->name,name)==0&&strcmp(p->zhengjian,zhengjian)==0) printf(“没有该客户买票的信息!请重新确认!”);//最后一个结点也不是要找的结点的情况 n3=2; } } break; }//if(strcmp(L.elem[i].endstop,endstop)==0)if(i==L->length-1){ //查找到了最后一个 printf(“不是本站售出的票,请重新确认!n”); n3=2; } } }while(n3==1);} void Quit(){ printf(“成功退出系统!感谢您的支持!n”);} void main(){ LinkList L0;InitList_L(&L0);SqList L; //顺序表,用于存放车票信息 Create_Sq(&L); //初始化并创建顺序表 int n;do{ printf(“n **************杭州火车站订票系统***************n”); printf(“n ******************本站车票信息******************n”); printf(“ * 车次目的地日期票价 *nn”); inti;for(i=0;i * %s %s 12月%d日 %d * n”,L.elem[i].hnum,L.elem[i].endname,L.elem[i].day,L.elem[i].fnum); } printf(“n * 1.查询 3.退票 *n”);printf(“n * 2.订票 4.退出 *n”); printf(“ ***************************************************n”); printf(“n请按菜单提示输入:n”); } scanf(“%d”,&n); switch(n){ case 1 : Demand(L); break; case 2 :GetTicket(&L); break; case 3 :ReturnTicket(&L); break; case 4 : Quit(); break;} }while(n!=4); 一个简单的火车票售票管理系统(原创)#include typedef struct time //时间类型 { int x,y,z; //分别对应年,月,日 }TIME; typedef struct cnode //票信息类型 { int no; //票号 int id; //购票人证件号 TIME date; //购票日期 struct cnode *next;}CNODE; typedef struct tnode //车次信息类型 { char data; //车次编号 struct tnode *lchild,*rchild; CNODE *head;}TNODE; void create(); //按车次建立二叉排序树 void insert(int); //增加新的车次(二叉排序树的插入)void del(); //取消车次(二叉排序树节点删除) void inorder(TNODE *); //中序遍历车次二叉排序树(仅显示车次信息)void inorder_all(TNODE *); //中序遍历车次二叉排序树(显示车次及售票信息)void preorder(TNODE *); //先序遍历车次二叉排序树(仅显示车次信息)TNODE *search(); //按车次编号搜索 CNODE *insert_c(CNODE *); //插入新的售票信息(单张)CNODE *insert_c_more(CNODE *); //插入新的售票信息(批量)CNODE *del_c(CNODE *,CNODE *); //退票处理(删除售票信息)CNODE *search_c(CNODE *,int); //按票号查询 void search_c_id(CNODE *,int); //按购票人证件号搜索(限定某车次)void search_c_id_all(TNODE *,int); //按购票人证件号搜索(所有车次)void search_date(CNODE *,TIME); //按购票日期搜索(限定某车次)void search_date_all(TNODE *,TIME); //按购票日期搜索(所有车次)void print_c(CNODE *); //输出售票纪录(单张)void print_c_all(CNODE *); //输出售票纪录(批量) TNODE *root=NULL; void main(){ int i,func,no,ok; TNODE *t; CNODE *c; TIME d; printf(“nnn”); for(i=0;i<15;i++)printf(“=”); printf(“列车售票信息管理系统”); for(i=0;i<15;i++)printf(“=”); printf(“n”); printf(“t1.车次信息管理n”); printf(“t2.售票记录管理n”); printf(“t3.售票记录查询n”); printf(“t4.售票记录一览n”); printf(“t5.退出系统n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: printf(“nn车次信息管理>>>>n”); for(i=0;i printf(“nt1.增加新的车次”); printf(“nt2.取消车次”); printf(“nt3.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: create(); printf(“n售票信息更新成功!nn”); break; case 2:del();break; case 3:main();break; default:printf(“n[错误]功能号输入有误!请重新输入!”); } break; case 2: printf(“nn售票记录管理>>>>n”); for(i=0;i printf(“nt1.增加新的售票记录”); printf(“nt2.退票”); printf(“nt3.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: t=search(); if(t!=NULL)t->head=insert_c_more(t->head); break; case 2: t=search(); printf(“需要退票的票号:”); scanf(“%d”,&no); t->head=del_c(t->head,search_c(t->head,no)); break; case 3:main();break; default:printf(“n[错误]功能号输入有误!请重新输入!”); } break; case 3: printf(“nn售票记录查询>>>>n”); for(i=0;i printf(“nt1.按票号搜索”); printf(“nt2.按购票者证件号搜索”); printf(“nt3.按购票日期搜索”); printf(“nt4.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: t=search(); if(t!=NULL){ printf(“n请输入您所要查询的票号:”); scanf(“%d”,&no); c=search_c(t->head,no); if(c==NULL)printf(“[错误]没有该票号的纪录!该票还未售出或为废票!自动返回上级菜单n...”);} break; case 2: printf(“n请输入您所要查询的购票者证件号:”); scanf(“%d”,&no); search_c_id_all(root,no); printf(“搜索完毕!自动返回上级菜单n...”); break; case 3: do{ printf(“n请输入您所要查询的日期(格式: yy-mm-dd):”); scanf(“%d-%d-%d”,&d.x,&d.y,&d.z); if(d.y<13&&d.y>0){ if(d.y==1||d.y==3||d.y==5||d.y==7||d.y==8||d.y==10||d.y==12) if(d.z<32&&d.z>0)ok=1; else if(d.z==2) if(d.z<30&&d.z>0)ok=1; else if(d.z<31&&d.z>0)ok=1; } else ok=0; if(!ok)printf(“n[错误]日期输入有误!请重新输入!”); }while(!ok); printf(“n指定车次吗?(1->是,0->否):”); scanf(“%d”,&ok); if(ok)search_date(search()->head,d); else search_date_all(root,d); break; case 4:main();break; default:printf(“n[错误]功能号输入有误!自动返回上级菜单n...”); } break; case 4: printf(“nn售票记录一览>>>>n”); for(i=0;i printf(“nt1.仅浏览车次”); printf(“nt2.指定车次已售票记录”); printf(“nt3.所有车次已售票记录”); printf(“nt4.测试:先序遍历车次”); printf(“nt5.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: printf(“n+++仅浏览车次n”); if(root==NULL)printf(“[错误]无车次纪录!”); else{inorder(root);printf(“n”);} break; case 2: printf(“n+++指定车次已售票记录n”); t=search(); if(t!=NULL){ print_c_all(t->head); printf(“n”); } break; case 3: printf(“n+++所有车次已售票记录n”); if(root==NULL)printf(“[错误]无车次纪录!”); else{inorder_all(root);printf(“n”);} break; case 4: printf(“n+++测试:先序遍历车次n”); if(root==NULL)printf(“[错误]无车次纪录!”); else{preorder(root);printf(“n”);} break; case 5:main();break; default:printf(“n[错误]功能号输入有误!自动返回上级菜单n...”); } break; case 5:exit(0); default:printf(“n[错误]功能号输入有误!请重新输入!”); } main();} void inorder_all(TNODE *ptr){ if(ptr!=NULL) { inorder_all(ptr->lchild); printf(“%d:n”,ptr->data); print_c_all(ptr->head); printf(“n”); inorder_all(ptr->rchild); } } void inorder(TNODE *ptr){ if(ptr!=NULL) { inorder(ptr->lchild); printf(“%dt”,ptr->data); inorder(ptr->rchild); } } void preorder(TNODE *ptr){ if(ptr!=NULL) { printf(“%dt ”,ptr->data); preorder(ptr->lchild); preorder(ptr->rchild); } } void print_c(CNODE *tkt){ if(tkt!=NULL)printf(“t%dt%dt%d-%d-%dn”,tkt->no,tkt->id,tkt->date.x,tkt->date.y,tkt->date.z);} void print_c_all(CNODE *head){ int i=0,j=0; if(head==NULL){printf(“n记录为空!n”);return;} for(i=0;i printf(“nNOt票号t购票者证件号t购票日期(年-月-日)n”); for(i=0;i for(j=0;head!=NULL;j++){ printf(“n%d”,j); print_c(head); head=head->next; } printf(“n”); for(i=0;i printf(“n总计 %d 条记录n”,j); for(i=0;i printf(“n”);} void create(){ int n,i;int k[MAX];printf(“n您所希望增加车次的数量:”);scanf(“%d”,&n);for(i=0;i printf(“新增第%d列车次:”,i+1); scanf(“%d”,&k[i]);} for(i=0;i insert(k[i]);} void insert(int m){ TNODE *p1,*p2;if(root==NULL) { root=(TNODE *)malloc(sizeof(TNODE)); root->data=m; root->lchild=root->rchild=NULL; root->head=NULL; } else { p1=root; while(m!=p1->data) { if((m data)&&(p1->lchild!=NULL))p1=p1->lchild; else if((m>p1->data)&&(p1->rchild!=NULL))p1=p1->rchild; else if((m data)&&(p1->lchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p2->head=NULL; p1->lchild=p2; return; } else if((m>p1->data)&&(p1->rchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p2->head=NULL; p1->rchild=p2; return; } } printf(“n[错误]未能成功增加车次%d,车次号 %d 已存在!”,m,m); } } TNODE *search(){ int key; TNODE *p; p=root; printf(“n输入您所要查找的车次编号:”); scanf(“%d”,&key); while(p!=NULL&&p->data!=key){ if(key data){p=p->lchild;} else if(key>p->data){p=p->rchild;} } if(p==NULL)printf(“n该车次不存在!”); return(p);} void del(){ int key; TNODE *p1,*p2,*p3,*temp; p1=p2=root; p3=temp=NULL; printf(“n请输入您想要取消的车次编号:”); scanf(“%d”,&key); while(p2!=NULL&&p2->data!=key){ if(key data){p1=p2;p2=p2->lchild;} else if(key>p2->data){p1=p2;p2=p1->rchild;} } if(p2==NULL){printf(“n[错误]该车次不存在!返回上级菜单n...”);return;} else if(p2->lchild==NULL&&p2->rchild==NULL) { if(p1->lchild==p2)p1->lchild=NULL; if(p1->rchild==p2)p1->rchild=NULL; temp=p2; if(root==p2){temp=root;root=NULL;} } else{ if(p2->rchild==NULL){ temp=p2->lchild; p2->data=temp->data; p2->lchild=temp->lchild; p2->rchild=temp->rchild; } else if(p2->lchild==NULL){ temp=p2->rchild; p2->data=temp->data; p2->lchild=temp->lchild; p2->rchild=temp->rchild; } else{ p3=p2; temp=p2->lchild; while(temp->rchild!=NULL){p3=temp;temp=temp->rchild;} p2->data=temp->data; if(p3==p2)p3->lchild=temp->lchild; else p3->rchild=temp->lchild; } } free(temp); printf(“车次 %d 已取消!nn”,key);} CNODE *insert_c(CNODE *head){ CNODE *k,*p; k=(CNODE *)malloc(sizeof(CNODE)); do{ printf(“n车票编号:”); scanf(“%d”,&k->no); p=search_c(head,k->no); if(p!=NULL)printf(“n[错误]该票已被购买!请重新选择!n”); }while(p!=NULL); printf(“购票者证件号:”); scanf(“%d”,&k->id); printf(“购票日期(格式:yy-mm-dd):”); scanf(“%d-%d-%d”,&k->date.x,&k->date.y,&k->date.z); k->next=head; head=k; return(head);} CNODE *insert_c_more(CNODE *head){ int n,i; printf(“n请输入批量新增售票记录数:”); fflush(stdin); scanf(“%d”,&n); for(i=0;i printf(“n售票记录更新成功!n”); return(head);} CNODE *search_c(CNODE *head,int id){ CNODE *temp,*s; s=temp=head; while(temp!=NULL&&temp->id!=id){s=temp;temp=temp->next;} print_c(temp); if(temp!=NULL)return(s); else return NULL;} void search_c_id(CNODE *head,int id){ CNODE *s,*head_s; s=head_s=NULL; if(head==NULL)printf(“无该证件号纪录!n”); while(head!=NULL){ if(head->id==id){ s=(CNODE *)malloc(sizeof(CNODE)); s->no=head->no;s->id=head->id;s->date=head->date; s->next=head_s;head_s=s; } head=head->next; } print_c_all(head_s); printf(“n”);} void search_c_id_all(TNODE *ptr,int id){ if(ptr!=NULL){ search_c_id_all(ptr->lchild,id); printf(“n车次:%dn”,ptr->data); search_c_id(ptr->head,id); search_c_id_all(ptr->rchild,id); } } void search_date(CNODE *head,TIME t){ CNODE *s,*head_s; s=head_s=NULL; while(head!=NULL){ if(t.x==head->date.x) if(t.y==head->date.y) if(t.z==head->date.z) { s=(CNODE *)malloc(sizeof(CNODE)); s->no=head->no;s->id=head->id;s->date=head->date; s->next=head_s;head_s=s; } head=head->next; } print_c_all(head_s); printf(“n”);} void search_date_all(TNODE *ptr,TIME t){ if(ptr!=NULL){ search_date_all(ptr->lchild,t); printf(“n车次:%dn”,ptr->data); search_date(ptr->head,t); search_date_all(ptr->rchild,t); } } CNODE *del_c(CNODE *head,CNODE *p){ CNODE *temp; if(p==NULL)printf(“[错误]该票未售出或为废票!返回上级菜单n...”); else if(p==head){head=NULL;free(p);} else{ temp=p->next; p->next=temp->next; free(temp); } return(head);}第五篇:一个简单的火车票售票管理系统