航空客运订票系统.docx
《航空客运订票系统.docx》由会员分享,可在线阅读,更多相关《航空客运订票系统.docx(20页珍藏版)》请在冰点文库上搜索。
![航空客运订票系统.docx](https://file1.bingdoc.com/fileroot1/2023-7/17/68a92e70-fde8-4b79-8310-a65116bf1a07/68a92e70-fde8-4b79-8310-a65116bf1a071.gif)
航空客运订票系统
数据结构课程设计报告
课程名称___数据结构课程设计_
题目名称航空客运订票系统
一、需求分析
『问题描述』
航空订票系统的业务活动包括:
查询航线、客票预定和办理退票等。
试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
『基本要求』
(1)每条航线所涉及的信息有:
终点站名、航班号、飞机号、飞行周日(星期几)、成员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量);
(2)作为示意系统,全部数据可以只放在内存中;
(3)系统能实现的操作和功能如下:
①查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行、最近一天航班的日期和余票额;
②承办订票业务:
根据客户提出的要求(航班号、订票余额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求。
若需要,可登记排队候补;
③承办退票业务:
根据客户提供的情况(日期、航班),为客户办理退票数需,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。
『选做内容』
当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其他航线情况。
读者还可以充分发挥自己的想象力,增加你的系统的功能和其他服务项目。
2、设计思路及流程图
『思路』
①存储结构:
两个客户名单可以由线性表和队列实现,即已定票的客户名单用线性表存储,排队等候的客户名单用队列存储。
而飞行航班用固定长度的结构体数组按航班的大小顺序表示(因为这个系统是给客户订票用的,所以没有设置增加航班的功能,如果是主机的服务系统要设置)。
②构造框架:
(1)将大概功能一一列举出来:
显示航线信息、查询航线信息、显示订票客户信息、显示排队等候的客户信息、显示余票信息、订票功能、退票功能(按照顺序逐一实现,比较主要的是订票和退票功能)。
③功能实现:
根据第二点构造的框架,将里面的功能逐一实现出来。
『系统运行流程图』
该订票系统的基本执行流程以及各功能之间的关系:
递归
实现
订票
更新
更新更新更新更新更新
3、头文件以及存储结构
Head.h
#include
#include
#include
#include
//航线信息:
----------------------------------------------------------------------------------
#defineMAXSIZE4
typedefstructwat_ros
{
charname[10];/*姓名*/
charid[10];
intreq_amt;/*订票量*/
intgrade;/*舱位等级*/
structwat_ros*next;
}qnode,*qptr;
typedefstructpqueue
{
qptrfront;/*等候替补客户名单域的头指针*/
qptrrear;/*等候替补客户名单域的尾指针*/
}linkqueue;
typedefstructord_ros
{
charname[10];/*客户姓名*/
charid[10];
intord_amt;/*订票量*/
intgrade;/*舱位等级*/
structord_ros*next;
}linklist;
typedefstructairline
{
charter_name[10];/*终点站名*/
charair_num[10];/*航班号*/
charplane_num[10];/*飞机号*/
chardate[7];/*飞行日期(星期几)*/
inttkt_amt;/*乘员定额*/
inttkt_sur;/*余票量*/
linklist*order;/*乘员名单域,指向乘员名单链表的头指针*/
linkqueuewait;/*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/
}lineinfo;
externstructairline*start;
externstructairlineair[];
externvoiddisplay(structairline*info);
externvoidlist();
externvoidsearch();
externstructairline*find();
externvoidprtlink();
externlinklist*insertlink(linklist*head,intamount,charname[],intgrade,charid[]);
externlinkqueueappendqueue(linkqueueq,charname[],intamount,intgrade,charid[]);
externvoidorder();
externvoidreturn_tkt();
externvoidshowremain_tickets();
externintmenu_select();
externvoidshowwaiters();
externintissameID(charid[],structairline*info);
4、关键算法
『订票功能算法』
该方法采用了递归的思想,实现了订票功能、排队等候咨询自动订票以及选做内容:
客户订票要求不满足的时候给用户提供到达同意目的地的不同航线信息,并可再次进入订票(即递归)
#include"head.h"
voidorder()/*办理订票业务*/
{
structairline*info;
intamount,grade;
charname[10];
charid[10];
info=start;
system("CLS");
printf("\n******************预定机票******************\n");
if(!
(info=find()))return;/*根据客户提供的航班号进行查询,如为空,退出该模块*/
printf("*输入订票数量:
");
intt=scanf("%d",&amount);
while(t==0)
{
printf("\n对不起,您输入的票的数量不是正规数字!
请重新输入:
");
fflush(stdin);
t=scanf("%d",&amount);
}
if(amount>info->tkt_amt)/*若客户订票额超过乘员定票总额,退出*/
{
printf("\n对不起,您输入的票的数量已经超过乘员定额!
");
return;
}
if(amount<=info->tkt_sur)/*若客户订票额未超过余票量,订票成功并等记信息*/
{
inti;
printf("*输入客户姓名:
");
scanf("%s",name);
printf("*输入客户ID:
");
scanf("%s",id);
while(issameID(id,start))
{
printf("\n对不起,您输入ID已存在!
请重新输入:
");
fflush(stdin);
scanf("%s",id);
}
printf("*输入舱位等级(1-3):
");
inta=scanf("%d",&grade);
while(a==0||((grade<1||grade>3)&&a==1))
{
printf("\n对不起,您输入的舱位等级不是正规数字!
舱位等级是子啊1-3之间,请重新输入:
");
fflush(stdin);
a=scanf("%d",&grade);
}
info->order=insertlink(info->order,amount,name,grade,id);/*在订票乘员名单域中添加客户信息*/
for(i=0;iprintf("*%s的座位号是:
%d\n",name,info->tkt_amt-info->tkt_sur+i+1);
info->tkt_sur-=amount;/*该航线的余票量应减掉该客户的订票量*/
printf("\n祝您乘坐愉快!
\n");
}
else/*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/
{
system("CLS");
printf("******************预定机票******************\n");
fflush(stdin);
charr;
printf("\n此航班已经没有更多的票,您是否要排队,让系统自动帮您订票并分配座位,完成后系统会将机票信息发到您的手机上?
(Y/N)");
r=getch();
printf("%c\n",r);
if(r=='Y'||r=='y')
{
printf("\n\t\t\t输入客户姓名:
");
scanf("%s",name);
printf("\n\t\t\t输入客户ID:
");
scanf("%s",id);
while(issameID(id,start))
{
printf("\n对不起,您输入ID已存在!
请重新输入:
");
fflush(stdin);
scanf("%s",id);
}
printf("\n\t\t\t输入订票数量:
");
intb=scanf("%d",&amount);
while(b==0)
{
printf("\n对不起,您输入的票的数量不是正规数字!
请重新输入:
");
fflush(stdin);
b=scanf("%d",&amount);
}
if(amount>info->tkt_amt)/*若客户订票额超过乘员定票总额,退出*/
{
printf("\n对不起,您输入的票的数量已经超过乘员定额!
");
return;
}
printf("\n\t\t\t输入舱位等级(1-3):
");
intc=scanf("%d",&grade);
while(c==0||((grade<1||grade>3)&&c==1))
{
printf("\n对不起,您输入的舱位等级不是正规数字!
舱位等级是在1-3之间,请重新输入:
");
fflush(stdin);
c=scanf("%d",&grade);
}
info->wait=appendqueue(info->wait,name,amount,grade,id);/*在排队等候乘员名单域中添加客户信息*/
printf("\n\t\t\t登记成功!
\n");
}
else//选做内容:
客户订票要求不满足的时候给用户提供到达同意目的地的不同航线信息。
{
structairline*info1;
info1=start;
intflag=0;
printf("\t**********************************************************\n");
printf("终点站名航班号飞机号飞行日期乘员定额余票量\n");
for(inti=0;i{
if(!
strcmp(info->ter_name,info1->ter_name)&&strcmp(info->air_num,info1->air_num)&&(info1->tkt_sur>=amount))
{
display(info1);
flag=1;
}
info1++;
}printf("\t**********************************************************\n");
if(!
flag)
{
printf("已无其他到达您所要到达目的地的航班信息!
\n");
return;
}
else
{
printf("以上航班也能达到您的目的地是否需要继续订票(Y/N)\n");
r=getch();
printf("%c",r);
if(r=='Y'||r=='y')
{
order();
}
else
{
printf("\n欢迎下次再购票!
\n");
}
}
}
}
}
5、测试分析
本程序是在win764位系统使用VC++6.0编译执行的。
进入系统主界面:
『三个基本要求的实现以及选做功能』
(1)查询航线:
(2)订票
1)订票功能:
2)查询订票客户名单(有序排列):
3)满员或者余票不足时询问,进入排队等候系统自动订票:
(3)退票
1)退票功能:
2)依次从队头开始查找符合要求的排队客户,自动为其订票,在上图可看到已经更新完毕,我们可以到订票用户的信息那里看:
选做内容:
当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其他航线情况。
1)显示满足要求的航线:
2)客户选择再次订票(递归回到订票功能):
『三个自己附加的功能』
(1)所有航信信息:
(2)显示余票:
(3)查看排队等候的名单:
6、总结与体会
经过了1个星期的课程设计,我体验到了很多东西,例如做一个程序要很细心,不然会漏洞百出,不过就算很细心了也能难免会出错。
此时需要我们耐心的调试与寻找错误的地方进行修改。
在大一的时候我是C语言A班的学生,因此比B班的多做了一个课程设计,在当时我不会用自己建立的头文件去包装整个工程,所以那时候只能把所有的东西都写在一个.cpp文件里面,看起来都杂的要命,这次的课程设计让我学会了如何写头文件,如何将方法都分开写。
然后汇总到一起。
这样让整个程序代码看起来很严谨又清晰,修改的时候也很方便。
做这个课程设计我学到,做一个好的程序要跟黄老师说的一样:
要先想好大体的框架再进行编程,逐一去实现。
这个设计本身不难,不过也让我学到了一些之前没有学到的知识,也养成了一个比较好的编程风格。
总之一句话:
没有想不出的算法,只有不愿去想的心!