航空客运售票服务系统.docx
《航空客运售票服务系统.docx》由会员分享,可在线阅读,更多相关《航空客运售票服务系统.docx(29页珍藏版)》请在冰点文库上搜索。
航空客运售票服务系统
学生实习报告
课程名称_数据结构与数据处理应用训练
题目名称航空客运售票服务系统
学生学院
专业班级
学号
学生姓名
指导教师
2012年2月16日
航空客运售票服务系统
【摘要】21世纪是一个高速、快捷的年代。
在这个高速发展的年代里,速度成了我们追求的目标;二是提高工作效率;三是降低成本。
而且这样的系统势必让用户易学、易用,满足客户需求。
因此,办公自动化的高速度、高效率、高便捷、低成本便成了我们的目的,为此开发了这个“机场售票管理系统”。
本系统是采用C++开发的一个管理系统。
本系统要解决的是机场售票中所要解决的问题,包括售票退票功能、预约等待功能、查询航线功能、浏览航线客户功能等。
在整个系统中采用队列、线性链表、数组等存储方法。
在整个系统设计过程中,严格按照软件工程设计标准来设计系统。
【关键词】飞机信息,队列,线性链表,数据结构
1内容与要求
【问题描述】
航空客运订票的业务活动包括:
查询航线、机票预订和办理退票等。
试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
【具体要求】
设民航售票处的计算机系统可以为客户提供下列各项服务:
1.查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额。
2.承办订票业务:
根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。
若需要,可预约登记排队等候。
3.承办退票业务:
根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票数能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户。
【实现提示】
每条航线应包含的信息有:
终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。
这最后两项显然是一个线性表和一个队列。
为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。
由于预约人数无法预料,队列也应以链表作存储结构。
整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。
每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。
【测试数据】
自己设计,但报告上要求写出多批数据测试结果。
【选做内容】
当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其它航线情况。
大家还可以充分发挥自己的想象力,增加你的系统的功能和其它服务项目。
2总体设计
本系统的总体设计分为售票退票功能、预约等待功能、查询航线功能、浏览航线客户功能等。
具体请看该流程图:
查询航线:
voidchaxun(charzdzhan[10],intn,mainlistA)
订票业务:
voiddingpiao(intday,inthangbanhao,intdingpiaoe,intn,mainlistA)
退票业务:
voidtuipiao(intday,inthangbanhao,inttuipiaoe,charname[],intn,mainlistA)
浏览订票情况:
voidliulan(intn)
线性链表:
初始化链表:
voidInitList(LNode*&H)
清除链表:
voidClearList(LNode*&H)
计算链表长度:
intLengthList(LNode*H)
判断链表是否为空:
boolEmptyList(LNode*H)
根据POS值取出值:
kehuGetList(LNode*H,intpos)
查找链表中的数据:
boolFindList(LNode*H,kehuitem)
遍历链表:
voidTraverseList(LNode*H)
链表中插入数据:
boolInsertList(LNode*&H,kehuitem,intpos)
链表中删除数据:
boolDeleteList(LNode*&H,kehu&item,intpos)
队列:
voidInitQueue(Queue&Q)//初始化循环队列Q
intEmptyQueue(QueueQ)//判断队列是否为空,空返回1,否则返回0
voidEnQueue(Queue&Q,dengdaiitem)//进队列
dengdaiOutQueue(Queue&Q)//出队列
dengdaiPeekQueue(QueueQ)//取出队列中第一个数据
voidClearQueue(Queue&Q)//清除该队列
3详细设计
结构定义:
typedefstruct{
charname[10];//客户姓名
intdingpiaoe;//订票额
}dengdai;//预约等待的客户
typedefstruct{
charname[10];//客户姓名
intdingpiaoe;//订票额
intzuoweihao;//座位号
}kehu;//订到票的客户
typedefstruct{
charzdzhan[10];//终点站名
inthangbanhao;//航班号
intweek;//星期
intday;//日期
intyupiao;//余票
intdinge;//成员定额
LNode*pass;//订到票的客户
Queuewait;//等待预约的客户
}ElemType;
插入航线:
先提示要输入的航线数量,再用一个FOR循环将所有输入的数据存入数组;
查询航线:
用一个FOR循环,将输入的要查询的信息与数组中的所有航线信息作比较,若找到相同的终点站,则全部将他们输出。
订票业务:
用一个FOR循环,将输入的要订票的信息与数组中的所有航线信息作比较,若找到与输入信息相同的航线,则输出“找到您所要订的航班!
”,之后再输入客户姓名,再将以上输入信息放入2个结构:
预约等待的客户和订票客户。
再判断该航班是否有那么多票够该客户买,若够则输出座位号,若不够,则输出:
“该航班余票不足,是否预约登记排队等候,请选择YES/NO”,若客户选择YES,则将该客户信息放入队列。
若客户选择NO,则返回选择菜单。
如果在循环结束后,还未找到该航班,则输出:
“找不到您所要订的航班!
”
退票业务:
用一个FOR循环,将输入的要退票的信息与数组中的所有航线信息作比较,若找到与输入信息相同的航线,则输出“找到了您的航班!
”,再判断输入的退票额是否符合他的订票额,若大于订票额,则输出:
“您要退的票大于您订的票,退票不成功!
请重新输入退票额”并返回选择菜单。
若不大于,则输出“退票成功!
”并输出他剩余的票数。
若票数为0,则删除该客户信息。
退票结束后,询问在预约等待的顾客,从队列头开始,查找与余票额相符的顾客信息,找到则输出“XX客户的座位号为X”,找不到则让他们继续等待。
如果在循环结束后,还未找到该航班,则输出:
“您没有该航班的票!
”
浏览订票情况:
首先让使用者输入要查询的航线信息(日期、航班号)。
然后利用线性链表的的遍历功能,输出要查询航班客户信息。
4程序测试
测试数据:
航线信息:
终点站航班号星期日期
hangzhou1120120101
hangzhou2220120102
hangzhou3320120103
beijing4120120101
beijing5320120103
tianjing6420120104
tianjing7620120106
hangzhou8120120101
hangzhou9320120103
sichuan10220120102
sichuan11720120107
jiangsu12120120108
jiangsu13220120109
chongqin14520120105
chongqin15620120106
运行正确:
菜单输入错误:
订票时找不到航班:
退票时找不到航班:
输入的退票额大于订票额:
5总结
基本上能安全的运行,具备的功能符合题目的要求。
程序写的还算简练,结构清晰,各个模块的分工和功能明确。
21世纪是一个高速、快捷的年代。
在这个高速发展的年代里,速度成了我们追求的目标;二是提高工作效率;三是降低成本。
而且这样的系统势必让用户易学、易用,满足客户需求。
因此,办公自动化的高速度、高效率、高便捷、低成本便成了我们的目的,为此开发了这个“机场售票管理系统”。
本系统可以大大简化售票,订票,查询,统计等十分繁琐的工作,各个部门相互协调,简化办公环节,提高工作效率,便于管理,各种数据可以一目了然。
这次系统的设计从最开始的需求分析,可行性研究,到系统的整体设计,包括概要设计和详细设计的一个整体过程,本人真正明白了要做一个软件的难度,特别是要做一个真正可用的软件,就更难了。
经过这一个星期的实践编程,我收获很多,不仅巩固了以前的知识:
特别是像队列、链表、线性表、数组等等,还从同学、网上学到了很多其他知识,并且对调试更加熟悉。
不过这次的编程还是比较顺利的,没有出现特别大的错误,特别是那种出一点错就要改很久的错误。
这次实践过程中主要遇到的错误有以下一些:
1.一开始编的线性链表的头文件是带表头附加结点的,但是在调用存入客户的座位号的时候,是不需要表头附加结点的,不然出现的错误就是每个人的座位号错误,尤其是第一个客户,是个非常大的负数。
所以为了修改该错误,就要重新编写一个不带表头附加结点的线性链表。
2.一开始将数组mainlistA,定义成局部变量。
但是由于在子函数中要多次使用A,有时候又会忘记定义,所以就把A当作全局变量。
3.有时候也会出现一些不常用的小错误,就是做比较的时候还是很习惯的用“==”,“>”“<”等,但是在这个结构很多的程序里,很多都是字符型的,所以要记得使用STRING的功能去做比较和赋值等。
4.还有这次编程的一个难点,就是处理预约等待的客户。
后来从找资料和询问同学的想法之后知道了可以用一个新的队列,在询问预约等待的客户时不符合的就放入新的队列,符合就进入订票的链表,有了思路之后完成的就能很快了。
参考文献
[1]徐孝凯,《数据结构实用教程》[M],清华大学出版社,2006年9月
[2]牛义德.带刺的红玫瑰.航空电子售票系统.中国电子商务,2000
[3]伍俊良.VisualFoxpro.闵红梅.课程设计与系统开发案例.北京:
清华大学出版社,2003
[4]张龙.school著.晏海华译.软件工程导论第四版.北京清华大学出版,2003.11-13,25Judy
[5]c++编程--从问题分析到程序设计实验指导书.电子工业出版社
附录
test0.cpp:
#include
#include
#include
#include
typedefstruct{
charname[10];//客户姓名
intdingpiaoe;//订票额
}dengdai;//预约等待的客户
typedefstruct{
charname[10];//客户姓名
intdingpiaoe;//订票额
intzuoweihao;//座位号
}kehu;//订到票的客户
#include"Queue.h"
#include"LinkList.h"
typedefstruct{
charzdzhan[10];//终点站名
inthangbanhao;//航班号
intweek;//星期
intday;//日期
intyupiao;//余票
intdinge;//成员定额
LNode*pass;//订到票的客户
Queuewait;//预约等待的客户
}ElemType;
constintMaxSize=200;
typedefElemTypemainlist[MaxSize];
mainlistA;
#include"a.h"
voidmain()
{
intn=0,i,j,day,hangbanhao,dingpiaoe,tuipiaoe,k;
charzdzhan[10],name[10];//终点站名
while
(1){
printf("*********欢迎使用航空客运售票服务系统*********\n");
printf("**请选择相关服务项目**\n");
printf("**1.插入航线**\n");
printf("**2.查询航线**\n");
printf("**3.订票业务**\n");
printf("**4.退票业务**\n");
printf("**5.浏览订票情况**\n");
printf("**0.退出**\n");
printf("**********************************************\n");
cin>>j;
if(j==1){
cout<<"请输入您想插入的航线信息数:
";
cin>>k;
cout<<"请依次输入航线信息:
终点站名、航班号、星期几、日期"<for(i=0;icin>>A[i].zdzhan;
cin>>A[i].hangbanhao;
cin>>A[i].week;
cin>>A[i].day;
A[i].yupiao=50;
A[i].dinge=50;
InitQueue(A[i].wait);
InitList(A[i].pass);
}
n=n+k;
}
elseif(j==2){
cout<<"请输入你想去的终点名:
";
cin>>zdzhan;
chaxun(zdzhan,n,A);
}
elseif(j==3){
cout<<"请输入您想订票的日期、航班号、订票额"<cin>>day>>hangbanhao>>dingpiaoe;
dingpiao(day,hangbanhao,dingpiaoe,n,A);
}
elseif(j==4){
cout<<"请输入您想退票的日期、航班号、退票额、姓名"<cin>>day>>hangbanhao>>tuipiaoe>>name;
tuipiao(day,hangbanhao,tuipiaoe,name,n,A);
}
elseif(j==5){
liulan(n);
}
elseif(j==0)
break;
else
printf("输入错误!
\n");
}
}
a.h:
voidchaxun(charzdzhan[10],intn,mainlistA)
{
inti,j=0;
printf("终点站名\t航班号\t星期几\t日期\t余票\n");
for(i=0;iif(strcmp(A[i].zdzhan,zdzhan)==0)
cout<<}
}
voiddingpiao(intday,inthangbanhao,intdingpiaoe,intn,mainlistA)
{
inti,count;
kehutemp;
dengdaiitem;
chark[10];
for(i=0;iif(day==A[i].day&&hangbanhao==A[i].hangbanhao){
cout<<"找到您所要订的航班!
"<temp.dingpiaoe=dingpiaoe;
item.dingpiaoe=dingpiaoe;
cout<<"请输入您的姓名:
";
cin>>temp.name;
strcpy(item.name,temp.name);
if(dingpiaoe<=A[i].yupiao){
count=A[i].dinge-A[i].yupiao+1;
printf("您的座位号为%d\n",count);
temp.zuoweihao=count;
A[i].yupiao=A[i].yupiao-dingpiaoe;
InsertList(A[i].pass,temp,0);
}
else{
cout<<"该航班余票不足,是否预约登记排队等候,请选择YES/NO"<cin>>k;
if(strcmp(k,"YES")==0)
EnQueue(A[i].wait,item);
else
return;
}
break;
}
}
if(i>=n)
cout<<"找不到您所要订的航班!
"<}
voidtuipiao(intday,inthangbanhao,inttuipiaoe,charname[],intn,mainlistA)
{
inti,count;
Queuetemp;
dengdaiitem;
kehuitem1;
LNode*p;
InitQueue(temp);
for(i=0;i{
if((day==A[i].day)&&(hangbanhao==A[i].hangbanhao))
{
p=A[i].pass;
while(p)
{
if(!
strcmp(name,p->data.name))
{
cout<<"找到了您的航班!
"<if(tuipiaoe>p->data.dingpiaoe)
{
cout<<"您要退的票大于您订的票,退票不成功!
请重新输入退票额"<return;
}
else
{
A[i].yupiao=A[i].yupiao+tuipiaoe;
count=p->data.dingpiaoe-tuipiaoe;
printf("退票成功,您还有%d张票\n",count);
if(p->data.dingpiaoe)
p->data.dingpiaoe=count;
else
DeleteList(p,item1,-1);
}
while(!
EmptyQueue(A[i].wait))
{
item=PeekQueue(A[i].wait);
if(item.dingpiaoe>A[i].yupiao)
{
EnQueue(temp,OutQueue(A[i].wait));
}
else
{
item1.dingpiaoe=item.dingpiaoe;
strcpy(item1.name,item.name);
item1.zuoweihao=A[i].dinge-A[i].yupiao+1;
InsertList(A[i].pass,item1,0);
OutQueue(A[i].wait);
A[i].yupiao-=item.dingpiaoe;
cout<"<}
}
A[i].wait=temp;
return;
}
p=p->next;
}
}
}
if(i>=n)
cout<<"您没有该航班的票!
"<}
voidliulan(intn)
{
intday,hangbanhao;
cout<<"请输入您要查询的航线信息(日期、航班号):
";
cin>>day>>hangbanhao;
for(intt=0;t{
if((day==A[t].day)&&(hangbanhao==A[t].hangbanhao))
{
printf("客户号\t订票额\n");
TraverseList(A[t].pass);
}
}
}
LinkList.h:
typedefstructNode{
kehudata;
structNode*next;
}LNode;
voidInitList(LNode*&H)
{
H=NULL;
}
voidClearList(LNode*&H)
{//释放动态申请的内存空间
LNode*cp,*np;//当前结点指针与后继结点指针
cp=H;
while(cp!
=NULL)//按顺序遍历单链表,释放每个结点
{
np=cp->next;//保存下一个结点
free(cp);
cp=np;//使下一个结点成为当前结点
}
H=NULL;//置单链表为空
}
intLengthList(LNode*H)
{
LNode*p=H;//用来遍历链表结点
inti=0;//用来统计结点个数
while(p!
=NULL)
{
i++;
p=p->next;
}
returni;
}
boolEmptyList(LNode*H)
{
re