火车订票系统课程设计.doc_第1页
火车订票系统课程设计.doc_第2页
火车订票系统课程设计.doc_第3页
火车订票系统课程设计.doc_第4页
火车订票系统课程设计.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

火车订票系统课程设计小组成员:(080100)王健 (08010088)汪选继 ()王海全 (08010077)黄磊 (08010067)韦士奎目录第一章 概述11.1课题简介11.2设计目的11.3设计内容11.4系统实验要求1第二章 需求分析52.1 需求分析的任务52.2 需求分析的过程52.3 数据字典与流程图52.4 系统框架7第三章 概念结构设计93.1 概念结构设计的方法与步骤93.1.1 概念结构设计的方法93.1.3 概念结构设计的步骤93.2 数据抽象与局部视图设计103.3视图的集成11第四章 数据库逻辑设计134.1 E-R图向关系模型的转换134.2 数据模型的优化134.3 数据库的结构14第五章 软件功能设计155.1 软件模块划分155.2 软件功能结构图15第六章 源程序代码.1643第一章 概述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 学生购票流程图 系统用户需求 火车站需求l 订票功能:希望能通过学生姓名查到该学生的车次编号并记录学生的基本信息。l 统计功能:u 按火车票统计买票人数学生购票需求 :学生持个人有效证件去火车站购买火车票。l 交费功能:u 交费u 退票(资金退还) 取票需求l 通知功能:u 通知学生取票l 统计功能:u 统计可以取票的人l 查询功能:u 购票学生查询 购票学生姓名 购票学生身份证号 购票学生火车票编号 车次信息需求l 查询功能:u 车次号u 起始地u 目的地u 出发时间2.4 系统框架在调查完了系统需求之后,就要开始分析用户需求。在此,采用自顶向下的结构化分析方法。首先,定义全局概念结构的框架,如图2.2所示。图2.2火车票预定系统总框架图每个子系统需要进一步细化。学生信息系统为例进一步细化,如图2.3所示。图2.3学生信息系统并且其中的每一个功能模块都可以进一步细化,如图2.4所示。图2.4查询学生信息功能图2.5车次信息系统 图2.6 火车票信息系统能查询到的内容图2.7退票系统将以上所有子系统全部细化。将所有用户需求分析完毕之后,就要开始构造数据字典了。经分析之后,本系统要用到三个基本表:学生信息表,车次信息表,火车票信息表。数据结构定义如表2.1所示。表2.1 数据结构定义数据结构名含义说明组成学生定义了学生相关信息学生姓名,身份证号,性别,学校,电话号车次信息表定义了车次的有关信息车次编号,起始时间,起始站点,终点站火车票信息表定义了火车票相关信息火车票编号,座位号,起始时间,起始站点,终点站q第三章 概念结构设计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.1 E-R图向关系模型的转换将图3.4总体概念结构E-R图转化成关系模型。学生(姓名,身份证号,电话号,性别,学校) 车次信息表(车次编号,起始时间,起始站点,终点站) 火车票信息表(座位号,车次编号号, 座位信息,售出时间)4.2 数据模型的优化将转化的关系模式进行优化,最终达到第三范式。1、确定数据依赖学生(姓名,身份证号,电话号,性别,学校)学生姓名身份证号,学生姓名电话号,学生姓名性别,学生姓名学校 车次信息表(车次编号,起始时间,起始站点,终点站)车次编号起始时间,车次编号起始站点,车次编号终点站火车票信息表(座位号,车次编号,座位信息,售出时间)(座位号,车次编号)座位信息,(座位号,车次编号,座位信息)售出时间2、 对各关系模式间数据依赖进行极小化处理,消除冗余 学生姓名性别,学生姓名学校,学生姓名车次编号学生姓名座位号,车次编号起始站点,车次编号终点站车次编号起始时间,(座位号,车次编号)座位信息3、 看这些模式是否符合要求,确定是否要对某些模式进行合并或者分解 最终分解成第三范式: (电话号,身份证号)(学生姓名)(学生姓名,性别,学校)(学生姓名,车次编号)(学生姓名,座位号)(车次编号,座位号)(车次编号,起始站点,终点站,起始时间)4.3 数据库的结构根据总体结构图设计各表的结构,其相应标的定义如下:字段名数据类型长度约束描述namevarchar50主键姓名iddecimal不为空身份证号telephone numberdecimal不为空电话号sexvarchar50不为空性别schoolVarchar50不为空学校表4-1学生信息系统的结构字段名数据类型长度约束描述ttrain numberdecimal主键车次编号stratplacevarchar50不为空起始站点destinationvarchar50不为空目的地startimetime不为空起始时间表4-2 车次信息表系统的结构字段名数据类型长度约束描述Seat numberdecimal主键座位号trainnumberdecimal不为空车次编号soledtimevarchar50不为空售出时间isbookedboolean50不为空订票状态表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;int c;First: printf(“welcome to our ticket system!n”);printf(“1.intput the data.n”); /*按1键输入数据*/printf(“2.book the ticket.n”); /*按2键订车票*/printf(“3.inquire the ticket.n”); /*按3键查询车票*/printf(“4.cancel the ticket.n”); /*按4键退车票*/printf(“5.input your own data.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(“you enter an error numbern”);功能说明:通过printf语句,输出提示用户选择的信息.用户看到后,按下自己需要功能的代号.然后程序进入实现该功能函数完成用户所需要的功能.2. In()函数:程序流程图: 建立横向链表头结点输入m,n的值For循环,m是否为0否建立结点向结点输入数据For循环,n是否为0否建立纵向结点向结点输入数据是返回头指针Goto到用户界面程序代码:struct ticket *in() /*一个返回指针形的函数*/ struct ticket *head; /*头结点*/struct ticket *p1,*p2;struct station *s1,*s2;int m,n;int i;p1=p2=(struct ticket *)malloc(len); /*建立横向链表的头结点*/scanf(%d,&m); /*输入一共所需的车票信息总数*/scanf(“%d”,&n); /*输入从始发站到终点站共有几站*/head=null;for(i=0;inext=p1;p2=p1;p1=(struct ticket )*malloc(len); s1=s2=(struct ticket )*malloc(len); /*建立纵向链表的头结点*/head1=s1=s2;p1-down=s1=s2; /*指向纵向链表的头结点*/scanf(%d,%d,%d,&p1-num,&p1-num2, &p1-time); /*输入横向链表的数据*/for(i=0;inext=s2;s2=s1;s1=(struct ticket )*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); /*返回头指针*/goto first; /*返回头指针*/功能说明:通过用户输入的数值,建立所需的结点数量.再输入每个结点的具体数据.使横向链表的尾指针指向空,纵向链表的的尾指针指向头指针.最后返回头指针,再回到用户界面.3.Book()函数:程序流程图:输入需要的车次号输入需要到达的车站名While循环是否需要的车次是横向结点值给oWhile循环是否是需要的车站名是使mark的值为1纵向结点值给s纵向链表移针横向链表移针当横向链表下一个指针为空时输出 s点的数据输出 o点的数据Mark是否为1错误否是程序代码:void book() struct ticket *p;struct station *q;int t;int *o,*s;printf(“please enter the number:”);scanf(“%d”,&f); /*输入需要的车次*/printf(“please enter the station:”); 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(“your ticket is unused”);elseq-mark=1; /*修改mark标记*/s=q; /*把符合条件的纵向链表的数据给s*/q=q-next; /*纵向链表移针*/p=p-next; /*横向链表移针*/ printf(“your ticket has already booked!”);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); /*输出纵向链表的数据*/goto first;功能说明:本函数主要是先遍历横向链表找到符合条件的结点后,转向该点的纵向链表,遍历纵向链表找到符合条件的结点,读出需要的数据.并且修改mark标记,使其成为已定车票.如果mark已经为1则输出错误信息.3.inquire()函数: 程序流程图:输入需要的车次号输入需要到达的车站名While循环是否已到空否是否是需要的车次是While循环是否已到头指针否是否是需要的车站名是输出所需的信息是是错误移动指针否否程序代码:void inquire() struct ticket *p;struct station *q;int t;int *o,*s;printf(“please enter the number:”);scanf(“%d”,&f); /*输入需要的车次*/printf(“please enter the station:”); 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); /*输出纵向链表的数据*/goto first;功能说明:本函数主要提供查询功能.用户输入需要查询的车次和需要到 车站名,程序首先遍历横向链表查找到需要的数据后转向纵向链表,接着遍历纵向链表,查找到需要的车站名.最后输出所有关于本车次的所有信息.4.Cancel()函数:程序流程图:输入需要的车次号输入需要到达的车站名While循环是否需要的车次是横向结点值给oWhile循环是否是需要的车站名是使mark的值为0纵向结点值给s纵向链表移针横向链表移针当横向链表下一个指针为空时输出 s点的数据输出 o点的数据程序代码;void cancel()struct ticket *p;struct station *q;int t;int *o,*s;printf(“please enter the number:”);scanf(“%d”,&f); /*输入需要的车次*/printf(“please enter the station:”); 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(“your ticket has already cancel!”);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); /*输出纵向链表的数据*/goto first;功能说明: 本函数主要提供退票功能.用户输入需要退票的车次和需要到车站名,程序首先遍历横向链表查找到需要的数据后转向纵向链表,接着遍历纵向链表,查找到需要的车站名.修改其mark标识是其为0.最后输出所有关于本车次的所有信息.5. You()函数:程序代码:void you() struct you *head;struct you *p;p=(struct you *)malloc(len);scanf(%d,&p-name,&p-num,&p-num1,&p-time,&p-time1);goto First; 用户查询代码: (注:本函数用于管理人员查询用户)void find()struct you *head;struct you *p;int u;scanf(“%d”,&u);while(p=!null) if(p-num=u)s=p;p=p-next;printf(“%s”,”%d”,”%d”,”%d”,”%d”,p-name,p-num,p-num1,p-time,p-time1);功能说明: 本函数用于用户输入个人信息,以便管理人员管理.而管理函数只面对管理人员使用,因此未在用户界面上显示出来.6.统计模块:void total() int *p,*q;int n;p=t;while(p=!null)while(q-next=!head1)if (mark=1) n=n+1;q=q-next; p=p-next;printf(“the number of the booked ticket are :”);printf(“%d”,n); 6.所用变量声明:横向链表结点的结构体:struct ticketint num;int num1; int time; struct ticket *next; struct station *down; int t;纵向链表结点的结构体: struct station int name; int time; int money; int mark; struct station *next;用户信息链表结点的结构体: struct you int name; int num; int num1; int time; int time1; struct you *next; 运行结果:输入: 2 3 K717,Beijing,11:00 Yuci,12:00,10,0,56 Yangyuan,1:00,20,0,56 Shijiazhuang,2:00,30,56 输入:k717 shijiazhuang输出:you have already booked the ticket! K717,shijiazhuang,11:00,3:00,30,56程序源代码: #include #include #define null 0#define len sizeof(struct ticket)struct ticketint num;int num1; int time; struct ticket *next; struct station *down; int t;struct station /*公共变量声明*/ int name; int time; int money; int mark; struct station *next;struct you int name; int num; int num1; int time; int time1; struct you *next; struct ticket *in() /*一个返回指针形的函数*/ struct ticket *head; /*头结点*/struct ticket *p1,*p2;struct station *s1,*s2;int m,n;int i;p1=p2=(struct ticket *)malloc(len); /*建立横向链表的头结点*/scanf(%d,&m); /*输入一共所需的车票信息总数*/scanf(“%d”,&n); /*输入从始发站到终点站共有几站*/head=null;for(i=0;inext=p1;p2=p1;p1=(struct ticket )*malloc(len); s1=s2=(struct ticket )*malloc(len); /*建立纵向链表的头结点*/head1=s1=s2;p1-down=s1=s2; /*指向纵向链表的头结点*/scanf(%d,%d,%d,&p1-num,&p1-num2, &p1-time); /*输入横向链表的数据*/for(i=0;inext=s2;s2=s1;s1=(struct ticket )*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); /*返回头指针*/goto first; /*返回头指针*/void book() struct ticket *p;struct station *q;int t;int *o,*s;printf(“please enter the number:”);scanf(“%d”,&f); /*输入需要的车次*/printf(“please enter the station:”); 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(“your ticket is unused”);elseq-mark=1; /*修改mark标记*/s=q; /*把符合条件的纵向链表的数据给s*/q=q-next; /*纵向链表移针*/p=p-next; /*横向链表移针*/ printf(“your ticket has already booked!”);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); /*输出纵向链表的数据*/goto first; void inquire() struct ticket *p;struct station *q;int t;int *o,*s;printf(“please enter the number:”);scanf(“%d”,&f); /*输入需要的车次*/printf(“please enter the station:”); 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); /*输出纵向链表的数据*/goto first; void cancel()struct ticket *p;struct station *q;int t;int *o,*s;printf(“please enter the number:”);scanf(“%d”,&f); /*输入需要的车次*/printf(“please enter the station:”); scanf(“%d”,&h); /*输入需要到达的车站名*/p=t; /*初始化p的值*/while(p=!null)if(p-number=t)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论