数据结构课程设计航空订票系统Word文档格式.docx
- 文档编号:21506714
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:22
- 大小:178KB
数据结构课程设计航空订票系统Word文档格式.docx
《数据结构课程设计航空订票系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计航空订票系统Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
航空客运订票的业务活动包括:
查询航线、客票预订和办理退票等。
试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
设计任务:
通过此系统可以实现如下功能:
录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
可以输入起飞抵达城市,查询飞机航班情况;
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
订票:
(订票情况可以存在一个数据文件中,结构自己设定)根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;
若已满员或余票额少于订票额,则需要重新询问客户要求。
若需要,可预约登记排队等候。
如果该航班已经无票,可以提供相关可选择航班;
退票:
根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户……退票成功后修改相关数据文件。
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:
当航班信息改变可以修改航班数据文件
要求:
根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。
测试数据:
由学生任意指定,但报告上要求写出多批数据测试结果。
实现提示:
每条航线应包含的信息有:
终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。
这最后两项显然是一个线性表和一个队列。
为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。
由于预约人数无法预料,队列也应以链表作存储结构。
整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。
每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。
选做内容:
当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其它航线情况。
三、概要设计
1.设计步骤
1)分析问题,给出数学模型,设计相应的数据结构。
提示:
(1)己订票的客户名单可以用线性表来实现。
为查找方便,线性表应按照客户姓名有序,
并且为了插入和删除的方便,应以链表作为存储结构。
(2)等候替补的客户名单可以用队列来实现。
由于预约人数无法预计,所以队列也应以链表作为存储结构。
(3)需将输入的航班情况登录到一张线性表上(用顺序存储结构或链表存储结构)。
为了查询的方便,可以将航班情况按照航班有序或按照终点站名有序建立线性表。
每条航线是这张线性表的一个记录,包含上述8个域,其中已订票的客户名单域是指向己订票的客户名单链表的头指针,等候替补的客户名单域是指向队头和队尾的指针。
2)算法设计
在已经选择好数据结构的前提下,为解决问题设计算法。
(1)确定所需模块
对于稍复杂的程序设计,要充分利用模块化程序设计方法,自顶向下,逐步细化,在整体思路确定的情况下,考虑所需模块数,各模块完成功能以及模块之间的数据联系和调用关系。
(2)各子模块功能描述
给出主要模块的算法描述,用流程图或伪代码表示。
(3)模块之间的调用关系
3)源程序清单
为了提高工作效率,充分利用上机调试程序的时间,要求学生在上机之前给出源程序清单。
4)用测试数据去验证算法及程序的正确性
5)算法分析
经过上机调试,源程序运行正确,并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度。
2.系统整体结构图(功能模块图)
图1.系统整体结构图
3.功能模块及调用关系说明
(1)总航线信息预览:
通过调用display()预览已经建立的全部航线的相关信息(航班号、飞机号、终点站、飞行日期、定额、余票数、排队等候人数),预览完返回主菜单。
(2)查询单条航线信息:
根据乘客提出的终点站名或航班号调用Search()函数来查询并输出此条航线的相关信息(航班号、飞机号、终点站、飞行日期、定额、余票数、已订票乘客名单、排队等候乘客名单)。
并且查询完后询问乘客是否订票,是就调用订票Book()函数来为乘客进行订票,否就返回主菜单。
(3)办理订票业务:
客户先输入的终点站名、订票数、姓名信息再来调用订票Book()函数,Book()函数根据客户提供的终点站名查询到该航线信息,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单链表中添加乘客的信息;
如果暂时余票数不足是,询问客户是否要排队等侯,如果是,则在排队等候的队列中增加该乘客的订票信息。
(4)办理退票业务:
调用tuipiao()查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。
退票成功后,重新将航线名单域指向订票单链表的头指针。
根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。
(5)录入航班信息:
调用CreatPlane()函数,根据输入的航班的相关的信息(航班号、飞机号、终点站、飞行日期、定额、余票数),将此航班加入到原来的航班组中。
(6)退出系统
四、详细设计和源代码
1.实现概要设计中定义数据的存储结构
(1)已订票乘客信息(单链表)
typedefstructCust//已订票乘客信息
{
charName[15];
//乘客姓名
charnumber[10];
//乘客所乘飞机航班号
charend[15];
//乘客终点站
(2)排队等候的乘客信息
typedefstructwaitNode//排队等候客户信息
charname[15];
intticket;
//乘客的订票数
structwaitNode*next;
}waitNode,*waitlink;
typedefstruct
waitlinkfront;
waitlinkrear;
}waitQueue;
(3)航班信息
typedefstructPlane//航班信息
//航班号
intplanenum;
//飞机号
//终点站
chardate[10];
//飞行日期
intdinge;
//成员定额
inttick;
//剩余票数
intk;
//排队等候的人数
Customer*first;
//链接已订票客户
waitQueueQ;
//链接候补客户
}PlaneLink;
2.查询单条航线信息功能的算法设计(Search()函数功能实现的源代码)
intSearch(PlaneLink*p,intN)
inti=0,Q;
cout<
<
"
===========================================\n"
;
1.按终点站名查询\n"
2.按航班号查询\n"
___________________________________________\n"
>
\n"
请选择查询方式(1/2):
cin>
Q;
if(Q==1)
{
charend[10];
cout<
请您输入要查询的航班的终点站名:
"
//按站点名查询航班信息
end;
while(i<
N)
{
if(strcmp(p[i].end,end)==0)//先查看是否存在到该站点的航班
{
cout<
\n*****************您所查询的航班信息如下******************\n"
_________________________________________________________\n"
航班号飞机号终点站飞行日期余票数\n"
p[i].number<
setw(7)<
p[i].planenum<
setw(12)<
p[i].end<
setw(10)<
p[i].date<
p[i].tick<
endl;
\n=========================================================\n"
break;
}
i++;
}
}
elseif(Q==2)
charnum[10];
请您输入要查询的航班的航班号:
num;
if(strcmp(p[i].number,num)==0)//查看是否存在该航班号的航班
\n*****************您所查询的航班信息如下:
****************\n"
航班号终点飞行日期余票数\n"
display_s(p,i,N);
//调用display_s()函数输出该航班的已订票乘客和排队等候乘客的名单信息
if(i<
N)//如果存在该航班,询问客户是否要预定该航班的机票
intj;
是否需要预定该航班的票(1/0):
j;
if(j==1)
charname[10];
请输入订票数目、姓名:
ticket>
name;
Book(p,p[i].end,ticket,name,N);
else{cout<
很抱歉,没有您查询的航班信息!
return0;
}
3.订票功能的算法设计(Book()函数功能实现源代码)
intBook(PlaneLink*p,charend[],intticket,charname[],intN)
inti;
for(i=0;
i<
N;
i++)
{if(strcmp(p[i].end,end)==0)//先找出是否存在要订票的航班
if(p[i].tick>
=ticket)//查看余票数是否>
=订票客户订票数
p[i].tick-=ticket;
Customer*t=(Customer*)malloc(sizeof(Customer));
t->
ticket=ticket;
strcpy(t->
Name,name);
number,p[i].number);
end,p[i].end);
next=p[i].first;
p[i].first=t;
//此使用的是头插法将订票乘客的信息放入到链表中/
cout<
您订票成功!
您的航班信息如下:
__________________________________________________\n"
航班号飞机号终点站飞行日期定额\n"
setw(9)<
setw(6)<
p[i].dinge<
==================================================\n\n"
break;
elseif(p[i].dinge<
ticket)//订票数超出航班的定额时,不能订票,也不能无法排队等候了
{cout<
您预订的票数超过了航班定额,无法为您订票!
break;
else//余票数不足时,询问乘客是否排队等候
charz;
该航班剩余票数为:
很抱歉,剩余的票数不够!
您是否需要排队等候(Y(y)/N(n)):
z;
if(z=='
Y'
||z=='
y'
){Queue(p,end,ticket,name,N,i);
}//调用入队列函数,将乘客信息插入排队等候的人后面
if(i>
=N){cout<
很抱歉,没有您所需要的航班!
intdisplay_s(PlaneLink*p,inti,intN)//输出已定票及排队乘客的名单信息
if(p[i].first!
=NULL)//p[i].first!
=NULL说明已订票链表不为空,输出已订票乘客的名单信息
****该航班的已订票乘客名单如下:
****\n"
____________________________________\n"
姓名订票量\n"
Customer*t=p[i].first;
while(t)
t->
Name<
ticket<
t=t->
next;
N&
&
p[i].Q.front!
=NULL)//p[i].Q.front!
=NULL,输出正在排队等候乘客的名单信息
****该航班等候订票的乘客名单如下:
****\n"
waitlinkS=p[i].Q.front;
while(S!
=NULL)
S->
name<
S=S->
=====================================\n"
附:
入队函数Queue()的源代码
intQueue(PlaneLink*p,charend[],intticket,charname[],intN,inti)//入队函数,将等候排队的乘客放入原来的队列中
system("
cls"
);
color2e"
waitlinkq=(waitlink)malloc(sizeof(waitNode));
//将要的入队的结点,存储将要入队乘客的信息
strcpy(q->
name,name);
q->
next=NULL;
if(p[i].Q.front==NULL)
{
p[i].Q.front=p[i].Q.rear=q;
p[i].k++;
//p[i].k用来记录排队人数
else
p[i].Q.rear->
next=q;
p[i].Q.rear=q;
已为您登记,请耐心等候!
4.退票功能的算法设计(tuipiao()函数实现的源代码)
inttuipiao(PlaneLink*p,intN)
Customer*R,*S;
charnumber[10],Name[15];
请输入您的航班号与姓名:
number>
Name;
if(strcmp(p[i].number,number)==0&
p[i].first!
if(strcmp(p[i].first->
Name,Name)==0)
p[i].tick=p[i].tick+p[i].first->
ticket;
p[i].first=p[i].first->
您已成功退票!
\n\n"
else
R=p[i].first;
S=p[i].first->
while(S!
{
if(strcmp(S->
{
p[i].tick=p[i].tick+S->
R->
next=S->
cout<
您已经成功退票!
}
R=R->
S=S->
}
if(S==NULL)cout<
很抱歉,在该航班上没有找到您的姓名,请核实信息!
if(p[i].Q.front!
waitlinkQ=p[i].Q.front,q;
while(Q!
if(p[i].tick>
=Q->
ticket)
if(Q==p[i].Q.front)
{
cout<
正在为等候的乘客"
Q->
办理订票!
Book(p,p[i].end,Q->
ticket,Q->
name,N);
if(p[i].Q.front==p[i].Q.rear)
{
p[i].Q.front=p[i].Q.rear=NULL;
Q=Q->
}
else
{p[i].Q.front=p[i].Q.front->
Q=Q->
}
else
q->
next=Q->
Q=Q->
else{q=Q;
break;
p[i].first==NULL)
很抱歉,该航班目前没有已订票的乘客,无法为你退票,请核实信息!
=N)cout<
很抱歉,没有该航班信息,无法为你退票,请核实信息!
5.录入功能的算法设计(CreatPlane()函数的源代码)
voidCreatPlane(PlaneLink*p,intn,intN)
inti,j;
for(i=N;
N+n;
p[i].first=NULL;
//带头结点的单链表为空时的条件
p[i].Q.front=p[i].Q.rear=NULL;
//队列为空时的条件
请输入航班号:
p[i].number;
输入终点站名:
p[i].end;
for(j=0;
j<
j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 航空 订票 系统