火车订票系统课程设计.docx
《火车订票系统课程设计.docx》由会员分享,可在线阅读,更多相关《火车订票系统课程设计.docx(40页珍藏版)》请在冰豆网上搜索。
火车订票系统课程设计
火车订票系统课程设计
小组成员:
(080100)王健
(08010088)汪选继
()王海全
(08010077)黄磊
(08010067)韦士奎
第六章源程序代码...........................................................................16
第一章概述
1.1课程设计题目
开发一个学生火车票定票系统
主要实现以下功能:
1、学生基本信息的管理,尤其是学生目的地。
2、学生购票的基本信息,尤其是价钱和车票目的地
3、购票以后的分发管理和分配。
4、能实现退票功能
5、能进行信息的统计和查询
6、操作员管理
1.2设计目的
应用本学期对大型数据库系统原理的理论学习,通过上机实践的方式将理论知识与实践更好的结合起来,巩固所学知识。
实践和巩固在课堂教学中学习的关于关系数据库原理的有关知识和数据库系统的建立方法,熟练掌握对于给定实际问题,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。
1.3设计内容
对于所选择的题目必须对课题的相关信息有一定的了解,对于这个学生火车票定票系统来说,必须了解火车票预定系统的基本雏形以及购票人的信息还有火车票的相关信息。
把这些信息整理并生成数据库表,输入到数据库中,使之能够进行添加、查询、修改、删除并且与火车票预定系统执行一致的操作。
需求分析阶段就是要研究火车票预定系统的具体分类和实施过程流图。
概念设计阶段要完成数据抽象与局部视图设计还有视图的集成。
逻辑结构设计阶段要把E-R图转化为关系模式并且把我输入的三张表结合在一起完成一个总关系表。
最后就是要运行和实施数据库。
1.4系统测试要求
建立两个用户:
zhangsan,admin
(1)第一个用户zhangsan只具有普通用户的权限。
(2)第二个用户admin拥有系统操作员的权限。
第二章需求分析
2.1需求分析的任务
调查学生火车票预定系统应用领域涉及的内容,对涉及到领域的各个应用的信息要求和操作要求进行详细分析,形成需求分析说明书。
最重要的是调查、收集信息、分析购票人信息和火车票预定流程。
处理要求、数据的安全性与完整性要求。
要求系统能有效、快速、安全、可靠和无误的完成上述操作。
并要求客户端的界面要简单明了,易于操作,服务器端程序利于维护。
2.2需求分析的过程
火车站为方便学生返程,需要开发一个学生火车票预定系统。
这个预定火车票系统的学生信息,包括姓名、性别、身份证号码、起始时间、目的地,输入火车票预定系统的客户端程序,系统通过查询铁路系统内的车次数据服务器后,为学生安排车次,印出取票通知。
学生在凭取票通知和帐单交款后取票,系统校对无误后即印出火车票给学生。
如果有特殊原因,学生可以持有效证件去火车站退票。
要求系统能有效、快速、安全、可靠和无误的完成上述操作。
并要求客户端的界面要简单明了,易于操作,服务器端程序利于维护。
2.3数据字典与流程图
经过可行性分析和初步需求调查,抽象出该系统业务流程图,结合该实例具体情况,给出学生信息、订票信息和取票通知的具体需求。
图2.1学生购票流程图
⑴系统用户需求
①火车站需求
●订票功能:
希望能通过学生姓名查到该学生的车次编号并记录学生的基本信息。
●统计功能:
◆按火车票统计买票人数
②学生购票需求:
学生持个人有效证件去火车站购买火车票。
●交费功能:
◆交费
◆退票(资金退还)
③取票需求
●通知功能:
◆通知学生取票
●统计功能:
◆统计可以取票的人
●查询功能:
◆购票学生查询
购票学生姓名
购票学生身份证号
购票学生火车票编号
④车次信息需求
●查询功能:
◆车次号
◆起始地
◆目的地
◆出发时间
2.4系统框架
在调查完了系统需求之后,就要开始分析用户需求。
在此,采用自顶向下的结构化分析方法。
首先,定义全局概念结构的框架,如图2.2所示。
图2.2火车票预定系统总框架图
每个子系统需要进一步细化。
学生信息系统为例进一步细化,如图2.3所示。
图2.3学生信息系统
并且其中的每一个功能模块都可以进一步细化,如图2.4所示。
图2.4查询学生信息功能
图2.5车次信息系统
图2.6火车票信息系统能查询到的内容
图2.7退票系统
将以上所有子系统全部细化。
将所有用户需求分析完毕之后,就要开始构造数据字典了。
经分析之后,本系统要用到三个基本表:
学生信息表,车次信息表,火车票信息表。
数据结构定义如表2.1所示。
表2.1数据结构定义
数据结构名
含义说明
组成
学生
定义了学生相关信息
学生姓名,身份证号,性别,
学校,电话号
车次信息表
定义了车次
的有关信息
车次编号,起始时间,起始站点,终点站
火车票信息表
定义了火车票相关信息
火车票编号,座位号,起始时间,起始站点,终点站
第三章概念结构设计
3.1概念结构设计的方法与步骤
3.1.1概念结构设计的方法
概念设计阶段采用自底向上的方法,即自顶向下的进行需求分析,然后再自底向上的进行概念结构设计。
对已经细化到无法再分的阶段逐步集成在一起,最终合成一个全局概念模式。
3.1.2概念结构设计的步骤
第一步是进行局部视图的设计:
由于高层的数据流图只能反映系统的概貌,而中层流图能较好的反映系统中各局部应用的子系统组成。
因此我先逐一的设计分E-R图。
第二步是进行视图的集成:
各子系统的E-R图设计好之后,下一步就是要将所有的分E-R图合成一个系统的总E-R图,一般有两个方式,多个分E-R图一次集成,另一种是一次集成两个分E-R图。
我想采用一次集成两个分E-R图的方式。
3.2数据抽象与局部视图设计
按照图2.2火车票预定系统总框架图,设计实体属性图以及局部E-R图。
图3.1车次信息实体属性图
图3.2学生实体属性图
图3.3火车票实体属性图
……
3.3视图的集成
经过逐步细化再进行每两个一集成初步形成一个E-R图,最后得到图3.4总体概念结构E-R图。
图3.4系统总体结构E-R图
第四章数据库逻辑设计
4.1E-R图向关系模型的转换
将图3.4总体概念结构E-R图转化成关系模型。
学生(姓名,身份证号,电话号,性别,学校)
车次信息表(车次编号,起始时间,起始站点,终点站)
火车票信息表(座位号,车次编号号,座位信息,售出时间)
4.2数据模型的优化
将转化的关系模式进行优化,最终达到第三范式。
1、确定数据依赖
学生(姓名,身份证号,电话号,性别,学校)
学生姓名→身份证号,学生姓名→电话号,学生姓名→性别,学生姓名→学校
车次信息表(车次编号,起始时间,起始站点,终点站)
车次编号→起始时间,车次编号→起始站点,车次编号→终点站
火车票信息表(座位号,车次编号,座位信息,售出时间)
(座位号,车次编号)→座位信息,(座位号,车次编号,座位信息)→售出时间
2、对各关系模式间数据依赖进行极小化处理,消除冗余
学生姓名→性别,学生姓名→学校,学生姓名→车次编号
学生姓名→座位号,车次编号→起始站点,车次编号→终点站
车次编号→起始时间,(座位号,车次编号)→座位信息
3、看这些模式是否符合要求,确定是否要对某些模式进行合并或者分解
最终分解成第三范式:
(电话号,身份证号)(学生姓名)(学生姓名,性别,学校)(学生姓名,车次编号)(学生姓名,座位号)(车次编号,座位号)(车次编号,起始站点,终点站,起始时间)
4.3数据库的结构
根据总体结构图设计各表的结构,其相应标的定义如下:
字段名
数据类型
长度
约束
描述
name
varchar
50
主键
姓名
id
decimal
不为空
身份证号
telephonenumber
decimal
不为空
电话号
sex
varchar
50
不为空
性别
school
Varchar
50
不为空
学校
表4-1学生信息系统的结构
字段名
数据类型
长度
约束
描述
ttrainnumber
decimal
主键
车次编号
stratplace
varchar
50
不为空
起始站点
destination
varchar
50
不为空
目的地
startime
time
不为空
起始时间
表4-2车次信息表系统的结构
字段名
数据类型
长度
约束
描述
Seatnumber
decimal
主键
座位号
trainnumber
decimal
不为空
车次编号
soledtime
varchar
50
不为空
售出时间
isbooked
boolean
50
不为空
订票状态
表4.3火车票信息表系统的结构
五、软件功能设计
5.1软件模块划分
1.普通用户模块
在普通用户模块中可以实现注册,登陆,资料修改,车次查询,订票以及退票。
2.管理员模块
管理员模块包含三个板块的内容:
①车次基本信息管理:
包括添加,更新,查询,删除车次。
②火车票信息管理:
已定火车票列表。
③查看营业总额。
5.2软件功能结构图
第六章、源程序代码
算法的设计:
主函数:
利用case语句实现用户界面,用户输入需要的服务的数字代码,程序就会转到相应的函数,实现相应的功能。
在主函数开始处做下First标识,以便在其他函数中使用goto语句返回主函数的用户界面。
In()函数:
In()函数负责输入各种信息,链表中车票信息的初始值.
Book()函数:
Book()函数负责订票功能.主要是遍历整个链表,查找到需要订票的结点后修改其mark值.
Inquire()函数:
Inquire()函数主要负责查询功能.主要是遍历整个链表查找到需要的结点,然后输出.
Cancel()函数:
Cancel()函数主要负责退票功能.主要是遍历整个链表查找到需要的结点,然后修改mark的值.
You()函数:
You()函数主要负责输入用户信息,主要是创建一个单链表,将用户信息放入.并提供管理人员的查询功能.
Find()函数:
Find()函数主要负责查询用户信息,遍历整个单链表后,输出需要的信息.
Total()函数:
Total()函数主要负责统计整个订票系统的情况.
详细设计:
1.主函数:
①程序代码:
Main()
{int*t;
intc;
First:
printf(“welcometoourticketsystem!
\n”);
printf(“1.intputthedata.\n”); /*按1键输入数据*/
printf(“2.booktheticket.\n”); /*按2键订车票*/
printf(“3.inquiretheticket.\n”); /*按3键查询车票*/
printf(“4.canceltheticket.\n”); /*按4键退车票*/
printf(“5.inputyourowndata.\n”); /*按5键输入个人信息*/
scanf(“%d”,&c);
switch(c)
{case‘1’:
t=in();break;
case‘2’:
book();break;
case‘3’:
inquire();break;
case‘4’:
cancel();break;
case ‘5’:
you() ;break;
default :
printf(“youenteranerrornumber\n”);}}
②功能说明:
通过printf语句,输出提示用户选择的信息.用户看到后,按下自己需要功能的代号.然后程序进入实现该功能函数完成用户所需要的功能.
2.In()函数:
①程序流程图:
建立横向链表头结点
输入m,n的值
For循环,m是否为0
否
建立结点
向结点输入数据
For循环,n是否为0
否
建立纵向结点
向结点输入数据
是
返回头指针
Goto到用户界面
②程序代码:
structticket*in() /*一个返回指针形的函数*/
{
structticket*head; /*头结点*/
structticket*p1,*p2;
structstation*s1,*s2;
intm,n;
inti;
p1=p2=(structticket*)malloc(len); /*建立横向链表的头结点*/
scanf("%d",&m); /*输入一共所需的车票信息总数*/
scanf(“%d”,&n); /*输入从始发站到终点站共有几站*/
head=null;
for(i=0;i<=m;i++)
{
p2->next=p1;
p2=p1;
p1=(structticket)*malloc(len);
s1=s2=(structticket)*malloc(len); /*建立纵向链表的头结点*/
head1=s1=s2;
p1->down=s1=s2; /*指向纵向链表的头结点*/
scanf("%d","%d","%d",&p1->num,&p1->num2,&p1->time); /*输入横向链表的数据*/
for(i=0;i<=n,i++)
{
s2->next=s2;
s2=s1;
s1=(structticket)*malloc(len); /*建立纵向链表*/
scanf(“%s”,“%d”,“%d”,“%d”,“%d”,s1->name,&s1->time,&s1->money,&s1->seat,&s1->mark);
} /*输入纵向链表的数据*/
s1->next=head1; /*纵向链表为循环链表*/
}
p2->next=null;
return(head); /*返回头指针*/
gotofirst; /*返回头指针*/
}
③功能说明:
通过用户输入的数值,建立所需的结点数量.再输入每个结点的具体数据.使横向链表的尾指针指向空,纵向链表的的尾指针指向头指针.最后返回头指针,再回到用户界面.
3.Book()函数:
①程序流程图:
输入需要的车次号
输入需要到达的车站名
While循环是否需要的车次
是
横向结点值给o
While循环是否是需要的车站名
是
使mark的值为1
纵向结点值给s
纵向链表移针
横向链表移针
当横向链表下一个指针为空时
输出s点的数据
输出o点的数据
Mark是否为1
错误
否
是
②程序代码:
voidbook()
{
structticket*p;
structstation*q;
intt;
int*o,*s;
printf(“pleaseenterthenumber:
”);
scanf(“%d”,&f); /*输入需要的车次*/
printf(“pleaseenterthestation:
”);
scanf(“%d”,&h); /*输入需要到达的车站名*/
p=t; /*初始化p的值*/
while(p=!
null)
{
if(p->number==t)
{q=p->down;
o=p; /*把符合条件的横向链表结点的数据给o*/
while(q->next=!
head1)
{
if(q->name==h)
{
if(q->mark=1)
printf(“yourticketisunused”);
else
q->mark=1; /*修改mark标记*/
s=q; /*把符合条件的纵向链表的数据给s*/
}
q=q->next; /*纵向链表移针*/
}}
p=p->next; /*横向链表移针*/
}
printf(“yourtickethasalreadybooked!
”);
printf("%d","%d","%d",o->num,o->num2,o->time); /*输出横向链表的数据*/
printf(“%s”,“%d”,“%d”,“%d”,“%d”,s->name,&s->time,&s->money,&s->seat,&s->mark); /*输出纵向链表的数据*/
gotofirst;
}
③功能说明:
本函数主要是先遍历横向链表找到符合条件的结点后,转向该点的纵向链表,遍历纵向链表找到符合条件的结点,读出需要的数据.并且修改mark标记,使其成为已定车票.如果mark已经为1则输出错误信息.
3.inquire()函数:
①程序流程图:
输入需要的车次号
输入需要到达的车站名
While循环是否已到空
否
是否是需要的车次
是
While循环是否已到头指针
否
是否是需要的车站名
是
输出所需的信息
是
是
错误
移动指针
否
否
②程序代码:
voidinquire()
{
structticket*p;
structstation*q;
intt;
int*o,*s;
printf(“pleaseenterthenumber:
”);
scanf(“%d”,&f); /*输入需要的车次*/
printf(“pleaseenterthestation:
”);
scanf(“%d”,&h); /*输入需要到达的车站名*/
p=t; /*初始化p的值*/
while(p=!
null)
{
if(p->number==t)
{q=p->down;
o=p; /*把符合条件的横向链表结点的数据给o*/
while(q->next=!
head1)
{
if(q->name==h)
{
s=q; /*把符合条件的纵向链表的数据给s*/
}
q=q->next; /*纵向链表移针*/
}
}
p=p->next; /*横向链表移针*/
}
printf("%d","%d","%d",o->num,o->num2,o->time); /*输出横向链表的数据*/
printf(“%s”,“%d”,“%d”,“%d”,“%d”,s->name,&s->time,&s->money,&s->seat,&s->mark); /*输出纵向链表的数据*/
gotofirst;
}
③功能说明:
本函数主要提供查询功能.用户输入需要查询的车次和需要到车站名,程序首先遍历横向链表查找到需要的数据后转向纵向链表,接着遍历纵向链表,查找到需要的车站名.最后输出所有关于本车次的所有信息.
4.Cancel()函数:
①程序流程图:
输入需要的车次号
输入需要到达的车站名
While循环是否需要的车次
是
横向结点值给o
While循环是否是需要的车站名
是
使mark的值为0
纵向结点值给s
纵向链表移针
横向链表移针
当横向链表下一个指针为空时
输出s点的数据
输出o点的数据
②程序代码;
void cancel()
{
structticket*p;
structstation*q;
intt;
int*o,*s;
printf(“pleaseenterthenumber:
”);
scanf(“%d”,&f); /*输入需要的车次*/
printf(“pleaseenterthestation:
”);
scanf(“%d”,&h); /*输入需要到达的车站名*/
p=t; /*初始化p的值*/
while(p=!
null)
{
if(p->number=t)
{q=p->down;
o=p; /*把符合条件的横向链表结点的数据给o*/
while(q->next=!
head1)
{
if(q->name=h)
{
q->mark=0; /*修改mark标记*/
s=q; /*把符合条件的纵向链表的数据给s*/
}
q=q->next; /*纵向链表移针*/
}}
p=p->next; /*横向链表移针*/
}
printf(“yourtickethasalreadycancel!
”);
printf("%d","%d","%d",o->num,o->num2,o->time); /*输出横向链表的数据*/
printf(“%s”,“%d”,“%d”,“%d”,“%d”,s->name,&s->time,&s->money,&s->seat,&s->mark); /*输出纵向链表的数据*/
gotofirst;
}
③功能说明:
本函数主要提供退票功能.用户输入需要退票的车次和需要到车站名,程序首先遍历横向链表查找到需要的数据后转向纵向链表,接着遍历纵向链表,查找到需要的车站名.修改其mark标识是其为0.最后输出所有关于本车次的所有信息.
5.You()函数:
①程序代码:
voidyou()
{
structyou*head;
structyou*p;
p=(structyou*)malloc(len);
scanf("%d",&p->name,&p->num,&p->num1,&p-