航空售票系统报告书.docx
《航空售票系统报告书.docx》由会员分享,可在线阅读,更多相关《航空售票系统报告书.docx(26页珍藏版)》请在冰豆网上搜索。
航空售票系统报告书
数据结构课程设计报告
选题名称:
航空售票管理系统
系(院):
计算机工程学院
专业:
计算机科学与技术
班级:
姓名:
学号:
指导教师:
学年学期:
2009~2010学年第2学期
2010年6月19日
设计任务书
课题
名称
航空售票系统
设计
目的
本课程设计的目的是通过实践使学生经历一个数据结构系统开发的全过程并受到一次综合的训练,以便能较全面地理解、掌握和综合运用所学的知识去分析、解决实际问题。
实验
环境
1、Windows2000及以上
2、VisualC++6.0
任务
要求
任务:
完成《航空售票系统》的分析设计工作,并选用适当的开发工具完成系统的开发。
要求:
1、完成需求分析;
2、进行数据结构的概要设计;
3、进行数据结构的详细设计;
4、进行应用程序设计;
5、编程实现;
6、调试分析。
工作进度计划
序号
起止日期
工作内容
1
2010.6.14-2010.6.15
需求分析
2
2010.6.15-2010.6.16
概要设计
3
2010.6.16-2010.6.17
详细设计与实现
4
2010.6.17-2010.6.18
调试与操作说明
5
2010.6.18-2010.6.19
课程设计报告纂写
指导教师(签章):
2010年6月25日
摘要:
在当今经济和商务交往日益频繁的状况下,航空服务行业正面临客流量骤增的压力。
越来越多的航空公司都认识到传统的售票方法已经不能适合当今社会的需要,必须借助先进的计算机信息技术对售票服务进行管理。
“航空售票系统”可以说是整个航空售票计算机信息系统的中心子系统,因为航空售票最主要的功能就是为旅客提供订票退票。
设计航空售票这样一个系统,可以涉及到大多数数据结构的重要对象、重要功能和特性,比如:
储存过程、查找过程等。
由此,通过这个课程设计可以加深对这些数据结构知识的学习、理解,积累在实际工程应用中运用各种数据结构对象的经验,使学生掌握使用应用软件开发工具开发数据结构系统的基本方法。
在实用性方面,航空售票系统是很普遍的一种应用,选择该系统作为课程设计也可以为学生以后可能遇到的实际开发提供借鉴。
关键词:
航空系统;售票管理;数据结构
1需求分析
本次课程设计利用C++语言来编写,其运行平台为VisualC++。
1.问题描述:
航空客运订票业务活动包括:
查询航线、客票预定和办理退票等。
设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
2.基本要求:
任务:
通过此系统可以实现如下功能:
(1)录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
(2)查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
(3)可以输入起飞抵达城市,查询飞机航班情况;
(4)订票:
(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;
(5)退票:
可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
(6)修改航班信息:
当航班信息改变可以修改航班数据文件。
3.查询能实现的操作和功能如下:
查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
承办订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票少于订票额,则需重新询问客户要求。
若需要,可登记排队候补;
承办退票业务:
根据客户的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队,首先询问排在第一的客户,若所退票数满足他的要求,则为他办理订票手续,否则一次询问其他排队候补的客户。
2概要设计
本次数据结构课程设计所制作的航空客运订票系统主要运用了链式存储结构来实现。
我们知道线性表以及队列的存储结构主要用到了链式结构存储,因而此系统也应考虑使用这两种存储方式。
在航班信息方面,要对航班进行添加、删除、查询等操作。
由于链表的优势就在于便于进行添加、删除和查找,因此有关航班信息方面的部分可以由链表来实现。
但是为了更便于添加和删除,因此为链表设置了首、尾指针。
而对于订票、退票来说,其中要讲一个先来后到的道理。
基于这一点的要求,队列的存储方式再合适不过了,其“先进先出”的特点恰恰可以满足订票、退票的要求。
在结构定义方面,本系统定义了四个结构,分别用来储存航班信息、乘客信息、替补乘客信息以及结点信息。
而在航班信息定义中,分别将乘客信息、替补乘客信息引入其中,以供储存乘客信息和替补乘客信息。
根据本系统中的功能以及所定义的数据结构,特编写如下函数:
1.FlightInsert()//添加航班信息
2.FlightSearch()//查询航班信息
3.FlightRework()//修改航班信息
4.FlightBuyticket()//订票
5.FlightCancelticket()//退票
6.Buyticket(PFlightq,intTicket_Amount)//利用队列买票
7.Buyreplace(PFlightq,intTicket_Amount,intn)//利用队列进行替补买票
8.MainMenu()//主菜单
9.Main()//主函数
各个函数间的关系如下:
图2.1函数关系图
3详细设计
本航空客运售票系统分为两个文件:
一个是头文件Ticket.h,用来存放系统中数据结构的结构体,以及所要到的方法及函数。
另一个是C++文件Ticket.cpp.,本文件主要是本系统的主函数,其中调用头文件,来实现系统的功能。
具体实现如下:
3.1头文件Ticket.h,:
在前文中已介绍过,本文件是头文件,将售票系统的数据中的结构体定义在其中,并且利用所定义的结构来编写函数、方法来实现系统的功能。
首先采用链式结构,定义出三个结构体:
1.航线的结构体:
typedefstructFlight//航线信息
{
charDes[10];//终点站名
charFlightNum[10];//航班号
charPlaneNum[10];//飞机号
charWeek;//飞行周日
intRation;//乘员定额
intFreeTicket;//剩余票数
floatPrice[3];//舱位等级的价格
intReplacePas;//候补乘客数
Replace*ReplName;//该航班的候补乘客名单
Customer*CustName;//该航班的已定票乘客名单
structFlight*next;//指示下一航线结点
}Flight,*PFlight;
2.乘客结构体:
typedefstructCustomer//已定票乘客信息
{
charName[10];//姓名
intAmount;//定票数
intLevel;//舱位等级
intSeatNum;//座位号
charFlightNum[10];//所定航班号
structCustomer*next;
}Customer;
3.替补乘客结构体:
typedefstructReplace//替补乘客信息
{
charName[10];//姓名
intAmount;//定票数
intLevel;//舱位等级
charFlightNum[10];//所定航班号
structReplace*next;
}Replace;
以上三个结构体是以乘客信息、替补乘客信息为基础、再此之上有定义了飞机航线的结构体以及结点类型指针的结构体。
并在后者结构中引入了前两种结构体。
并且单独定义了两个指向Flight的指针,作为头只指针和尾指针:
Flight*head;//建立航线头结点
Flight*rear;//建立航线尾结点
以及乘客队列的指针:
Customer*Cusrear;
Replace*Reprear;
为今后的程序设计奠定了基础。
其次,编写实现各个功能的函数与方法:
1.MainMenu()——系统主菜单
此函数设计了本系统的界面,是程序的开始,具体实现如下:
voidMainMenu()
{
chari='0';
while(i!
='7')
{
cout<<"************航空公司客运定票系统V1.0********"<cout<<"*1、增加航线4、预订机票*"<cout<<"*2、查询航线5、退订机票*"<cout<<"*3、修改航线6、清空系统*"<cout<<"*7、退出系统*"<cout<<"*********************************************"<cin>>i;
switch(i)
{
case'1':
FlightInsert();break;
case'2':
FlightSearch();break;
case'3':
FlightRework();break;
case'4':
FlightBuyticket();break;
case'5':
FlightCancelticket();break;
case'6':
Flightclean();break;
case'7':
;break;
default:
cout<<"error\n";break;
}
}
}
2.voidFlightInsert()——添加航班信息
此方法主要用到链表的思想,类似于链表中的插入属性。
与一般链表不同的是,此方法设置了一个表尾指针,便于航班信息的添加,具体实现如下:
voidFlightInsert()//添加航班信息
{
Flight*p;
p=newFlight;
cout<<"请输入终点站名:
"<cin>>p->Des;
cout<<"请输入航班号:
"<cin>>p->FlightNum;
cout<<"请输入飞机号:
"<cin>>p->PlaneNum;
cout<<"请输入飞行周日:
"<cin>>p->Week;
cout<<"请输入乘员定额:
"<cin>>p->Ration;
p->FreeTicket=p->Ration;
cout<<"请输入舱位等级的价格:
"<cout<<"头等舱价格"<cin>>p->Price[0];
cout<<"普通舱价格"<cin>>p->Price[1];
cout<<"经济舱价格"<cin>>p->Price[2];
p->ReplName=newReplace;
p->CustName=newCustomer;
p->CustName->next=NULL;
p->ReplName->next=NULL;
p->ReplacePas=0;
rear->next=p;
rear=p;
rear->next=NULL;
}
3.FlightLookup()——查询航班信息
其实,查询航班的原理与删除原理相似,最中心的环节就是现对指定的航班进行定位。
与删除不同的是,查询不涉及到指针的变换,仅仅输出要查询的信息就可以了,具体实现如下:
voidFlightLookup()//查询航班
{
Flight*p,*q;
charFlightNum[10];
p=head;
inti=0;
while(i!
=1)
{
cout<<"请输入需要查询的航班号:
"<cin>>FlightNum;
while(p->next&&strcmp(p->next->FlightNum,FlightNum))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
cout<<"航班号:
"<FlightNum<cout<<"飞机号:
"<PlaneNum<cout<<"目的地:
"<Des<cout<<"飞行周日:
"<Week<cout<<"成员定额:
"<Ration<cout<<"剩余票数:
"<FreeTicket<cout<<"候补乘客数:
"<ReplacePas<cout<<"头等舱价格:
"<Price[0]<cout<<"普通舱价格:
"<Price[1]<cout<<"经济舱价格:
"<Price[2]<cout<<"1、返回主菜单2、继续"<cin>>i;
}
}
4.FlightRework()——修改航线信息
在修改航线信息方面,中心思想依旧类似于删除和查找。
只不过定位到所需信息之后要做的是重新给这些信息赋值。
在功能方面,为了使用户便于操作,因此需要一个界面来使程序更直观化一些,具体实现如下:
voidFlightRework()//修改航线信息
{
intCustomer_Number;
Flight*p,*q;
charFlightNum[10];
chari='0';
p=head;
cout<<"请输入需要修改的航班号:
"<cin>>FlightNum;
while(p->next&&strcmp(p->next->FlightNum,FlightNum))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
while(i!
='9')
{
cout<<"*****请输入需要修改的数据*****"<cout<<"*1、航班号2、飞机号*"<cout<<"*3、目的地4、飞行周日*"<cout<<"*5、成员定额6、头等舱价格*"<cout<<"*7、普通舱价格8、经济舱价格*"<cout<<"*9、退出*"<cout<<"******************************"<cin>>i;
switch(i)
{
case'1':
cout<<"请输入航班号:
"<cin>>q->FlightNum;break;
case'2':
cout<<"请输入飞机号:
"<cin>>q->PlaneNum;break;
case'3':
cout<<"请输入目的地:
"<cin>>q->Des;break;
case'4':
cout<<"请输入飞行周日:
"<cin>>q->Week;break;
case'5':
cout<<"请输入乘员定额:
"<Customer_Number=q->Ration-q->FreeTicket;
cin>>q->Ration;q->FreeTicket=q->Ration-Customer_Number;break;
case'6':
cout<<"请输入头等舱价格:
"<cin>>q->Price[0];break;
case'7':
cout<<"请输入普通舱价格:
"<cin>>q->Price[1];break;
case'8':
cout<<"请输入经济舱价格:
"<cin>>q->Price[2];break;
case'9':
break;
default:
cout<<"error\n";break;
}
}
}
}
5.FlightBuyTicket()——订票
订票是本系统的核心功能,本系统的一切功能都是围绕“订票”这个关键词来进行的。
用户确定所要乘坐的航班之后,进行订票,如果航班中的空余票数大于用户所要订的票数,则订票成功。
否则询问用户是否进入候补乘客名单。
其原理是运用链表的来添加乘客信息,运用队列来使替补乘客入队。
其中,还调用了另外两函数:
BuyTicket()和Buyreplace()来实现订票成功和进入替补乘客名单。
具体实现如下:
voidFlightBuyTicket()//订票
{
intTicket_Amount;
voidBuyTicket(PFlight,int);
voidBuyreplace(PFlight,int,int);
Flight*p,*q;
charDes[10];
inti=2;
while(i!
=1)
{
cout<<"请输入目的地:
"<cin>>Des;
p=head;
while(p->next&&strcmp(p->next->Des,Des))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
while(i!
=1)
{
cout<<"输入需要够买的票数"<cin>>Ticket_Amount;
while(Ticket_Amount==0)
{
cout<<"请输入一个非零数:
"<cin>>Ticket_Amount;
}
if(Ticket_Amount<=q->FreeTicket)
{
BuyTicket(q,Ticket_Amount);
//买票,详细介绍见下文
}
else
{
intn;
cout<<"剩余票数小于定票数,是否需要列入候补名单?
(1、是2、否)"<cin>>n;
Buyreplace(q,Ticket_Amount,n);
//进入替补名单,详细介绍见下文
}
cout<<"1、返回主菜单2、继续"<cin>>i;
}
}
}
}
6.FlightCancelTicket()——退票
作为人性化的航空客运订票系统,不但要实现订票,还要实现退票。
在退票方面,仍旧是利用链表,将乘客信息删除。
但删除之后,如若有替补乘客,还要使其依照进入替补乘客的队列的次序出队来实现订票。
其具体实现代码如下:
voidFlightCancelTicket()//退票
{
voidBuyTicket(PFlight,int);
Flight*p,*q;
Customer*h,*j;
charFlightNum[6];
charCustomer_Name[10];
intReplace1_Amount;//候补第一个人的定票数
inti;
while(i!
=1)
{
cout<<"请输入需要退定的航班号:
"<cin>>FlightNum;
p=head;
while(p->next&&strcmp(p->next->FlightNum,FlightNum))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
while(i!
=2)
{
cout<<"请输入姓名:
"<cin>>Customer_Name;
h=q->CustName;
while(h->next&&strcmp(h->next->Name,Customer_Name))
{
h=h->next;
}
j=h->next;
if(j==NULL)
{
cout<<"查无此人"<}
else
{
if(j->next==NULL){//当删除最后一个结点
Cusrear=h;
}
h->next=h->next->next;
q->FreeTicket+=j->Amount;
deletej;
cout<<"删除成功!
"<if(q->ReplName->next!
=NULL)
{
Replace1_Amount=q->ReplName->next->Amount;
if(Replace1_Amount<=q->FreeTicket)
{
Replace*rep;
rep=q->ReplName->next;
Customer*Cus2;
Cus2=newCustomer;
Cus2->SeatNum=q->Ration-q->FreeTicket+1;
strcpy(Cus2->FlightNum,q->FlightNum);
strcpy(Cus2->Name,rep->Name);
Cus2->Amount=rep->Amount;
Cus2->Level=rep->Level;
cout<<"乘客"<Name<<"已经成功买票"<cout<<"座位号为:
";
for(inti=1;i<=(r