1 / 24
文档名称:

航空客运订票系统.pdf

格式:pdf   大小:1,009KB   页数:24页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

航空客运订票系统.pdf

上传人:江湖故人 2023/3/27 文件大小:1009 KB

下载得到文件列表

航空客运订票系统.pdf

文档介绍

文档介绍:该【航空客运订票系统 】是由【江湖故人】上传分享,文档一共【24】页,该文档可以免费在线阅读,需要了解更多关于【航空客运订票系统 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
课程设计报告
课程名称数据结构
课题名称航空客运订票系统
专业通信工程
班级
学号
姓名
指导教师
2013年6月29日
:.
湖南工程学院
课程设计任务书
课程名称
数据结构
课题
航空客运订票系统
专业班级
学生姓名
学号
指导老师张鏖烽田娟秀李杰君
审批
任务书下达日期2013年6月23日
任务完成日期2013年6月29日
目录
................................................................1
................................................................1
“航线”类型...................................................2
.............................................................2
...........................................................3
................................................................3
:.
...............................................3
.......................................................3
...........................................................4
.........................................................6
...................................................7
.......................................................7
................................................................7
............................................................8
...............................................................10
...............................................................12
...................................................................13
:.
课题名称航空客运订票系统

航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。试设计一
个航空客运订票系统,以使上述业务可以借助计算机来完成。
【基本要求】
(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行周日(星期几)、
乘员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等
候替补的客户名单(包括姓名、所需票量);
(2)系统能实现的操作和功能如下:
①录入:可以录入航班情况,全部数据可以只放在内存中,最好存储在文件中;
②查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞
行,最近一天航班的日期和余票额;
③承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,
若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则
需重新询问客户要求。若需要,可登记排队候补;
④承办退票业务:根据客户提供的情况(日期、航班),为客户办理退票手续,然后
查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,
则为他办理订票手续,否则依次询问其他排队候补的客户。
初始化航班信息如下:
通过输入0~5这六个数字选择相应的操作,如:查询航班,订票,退票等操作;

两个客户名单可分别由线性表和队列实现。为查找方便,已订票客户的线性表
应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无
法预计,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性
表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每
条航线是这张表上的一个记录,包含上述8个域、其中乘员名单域为指向乘员名单链表
的头指针,等候替补的客户名单域为分别指向队头和队尾的指针。
注:由于“航线”可只用一条单链表记录,故采用全局变量,减少参数的传递。
:.
“航线”类型
ADTLairline{
数据对象:D={ai|ai∈航线链表集,i=1,2,3……,n,n>=0}
数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=1,2,3……,n}
基本操作:
Lairlinesearch_line()//按航班号查找航班
Lairlinesearch_plane()//按飞机号查找航班
Lairlinesearch_date()//按飞行日期查找航班
Lairlinesearch_addr()//按航班终点查找航班
voidboundary()//主菜单界面
voidinsert_line()//插入新航班
voidprint_customer(airline*p)//显示航班客户信息
voidbook()//订票系统
voidwaited(airline*p)//排队订票系统
voidRefund()//退票系统
voidsearch()//航班查询系统
voidInitLine()//初始化航线信息
voidprintline()//显示所有航班信息
}ADTLairline;

voidmain()
{初始化;
do{接受命令;
处理命令(调用相应函数);
}while(“命令”!=“退出”);
}



客户存储结构体
:.
typedefstructcustomer
{charname[20];//姓名
intnum;//订票数量
intlevel;//舱位等级
customer*next;//指向后继乘客
}customer,*Lcustomer;
航线存储结构体
typedefstructairline
{charter_address[20];//终点站
charline_num[10];//航班号
charplane_num[10];//飞机型号
intdate;//飞行日期
inttotal;//总人数
intremain;//余票数
customer*booked;//已定客户信息
customer*wait;//替补客户信息
airline*next;//指向后继航线
}airline,*Lairline;

(1)浏览航线模块:
定义voidprint_customer(airline*p),显示成员的信息;调用voidprintline()函
数输出全部航线信息。
(2)浏览订票客户信息模块:
定义订票客户信息的结构体customer,根据输入航班号调用search()函数寻
找客户信息。
(3)查询航线模块:
顺着单链表查找,如果与航班号(航线)一致,输出相关信息,否则,查
询不成功。
(4)订票模块:
查找乘客要订的航班号,判断此航班是否有空位,有则输入乘客有关信息,
订票成功,否则失败。
:.
(5)退票模块:
输入要退票的乘客姓名,查找乘客资料的链表中是否有这位乘客,有则删
去此节点,并在空位上加1,无则退票失败。如果此时余票额大于等于候补客户
的订票数量,那么候补客户订票成功。


Lairlinesearch_line()
{
chara[10];airline*p;p=L->next;
P("Pleaseinputthenumberofline:");S("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->line_num))break;
returnp;
}
注:通过建立节点p实现链表的遍历,利用for循环挨个查找,直到找
到为止,再返回找到的这个节点,实现传递。

voidbook()
{inti;intflag=0;airline*p;customer*cst,*c;
P("Pleasechoosethewayofviewing:\n");//查询方式选择
P("Thenumberoftheflight============================>1\n
");
P("Theaddressofthefinal
destination=====================>2\n");
P("Thedateofthe
flight===============================>3\n");
for(;!flag;)//flag为0时一直在循环
{S("%d",&i);
switch(i)//三种方式查询航班
{case1:p=search_line();flag=1;break;
case2:p=search_address();flag=1;break;
:.
case3:p=search_date();flag=1;break;
default:P("WrongPleaseinputagain!\n");break;}
注:输入1,2,3选择操作方式,先进行查询,在通过调用函数实现购票。

voidInitLine()//初始化航线信息
{初始化航线,先建立3条航线方便测试;}

voidsearch()
{inti;intflag=0;airline*p;
P("Pleaseinputthewayofviewingtheflight:\n");
P("Thenumberoftheflight------------>1\n");//航班号
P("Thenumberoftheplane------------->2\n");//飞机号码
P("Thedateoftheflight-------------->3\n");//航班日期
P("Thefinaladdressoftheflight----->4\n");//航班终点
S("%d",&i);for(;!flag;)
switch(i)//按照选择项进行操作
{case1:p=search_line();flag=1;break;
case2:p=search_plane();flag=1;break;
case3:p=search_date();flag=1;break;
case4:p=search_address();flag-=1;break;
default:P("Wrong,inputagain!\n");break;
}if(p)
{P("终点站航班号飞机号飞行周日余票量\n");
P("%-9s%9s%13s%10d%15d\n",p->ter_address,p->line_num,p->plane
_num,p->date,p->remain);
P("Bookingthetickets?(Sure,pleaseinput1;Elseinputanynumber!)");
S("%d",&i);
if(i==1)book();
ElseP("\n\n\n\n");boundary();}
ElseP("Theflightisnotexist╮(╯_╰)╭\n\n\n");}
voidprintline()
{intflag;airline*p;p=L->next;
:.
P("终点站航班号飞机号飞行周日余票量\n");
for(;p;p=p->next)
{P("%s%s%s%d%d\n",p->ter_address,p->line_num,p->plane_num,p->
date,p->remain);}
P("\n\n\n\n\n");boundary();}
注:通过输入1,2,3,4进行选择查询的方式,分别为飞机型号,航班
号,目的地位置,飞行日期进行查询。

voidmain()
{
intflag=1;boundary();InitLine();
do
{switch(getchar())
{
case'1':printline();break;//显示所有航线
case'2':search();break;//
case'3':book();break;
case'4':Refund();break;
case'5':system("cls");boundary();break;
case'0':flag=0;break;
}}while(flag);}
包括显示航线,查询信息,订票,退票,清屏这五个功能。

:
航班的信息:为了便于查找,航班情况的存储结构采用单链表,每个元素表示一个航
班的情况,包括终点站名、航班号、飞机号、星期几、乘员定额和余票量,共六个数据
项:

终点站名航班号飞机号星期几余票量


:.

1、在编程过程中,起先使用的是局部变量,每次调用函数都需要进行参数的传
递,很麻烦,而且还容易出现错误;后意识到航线的链表只有一条,很多函数都需要对
其数据进行修改,故航线信息采用了全局变量,方便数据的修改,减少了参数的传递。
2、因为排队订票的客户信息列表没有设置头结点,在退票后询问排队订票客户
是否订票时,出现了操作错误,在没有头结点的情况下判断等操作很麻烦,故在wait(p)
函数里询问排队客户是否订票时,为排队订票的客户信息列表增加了头结点,方便操作。
3、在开始的时候,排队订票客户信息使用的是队列进行数据存储,但测试的时
候,发现当第一名排队订票客户不满足需求时询,往后依次询问客户时,队列完全没用,
而且还需进行尾节点的各项操作,故弃用队列存储结构。
4、由于本程序涉及的知识单链表的查找,插入和删除,故时间复杂度为O
(n),辅助空间为O(1)。
5、经验和体会:,这么长的代码,让我深刻认识到断点调试的
必要性;同时让我了解到动手的重要性,开始的时候,明明有满脑子的想法和算法,就
是很难把想法和算法用代码实现;通过此次课程设计,我的动手能力和算法设计能力有
了明显的提高。由于忘记了一些c语言的规范使得在调试过程中一些错误没有发现。例
如,调用函数时,数组只需要传递数组名即可;字符‘0’和整形的0是不同的文明不
可以直接对其画等号。程序在起初设计的时候,经常出现溢出错误,而且不只一处。为
了修正这些溢出错误,耗费了大量的时间,修正解释之后再看源程序,才发现原来只是
因为开始的函数定义的数据类型出现了问题,对函数的定义不清楚,字符的不正确定义
造成了后期大量的纠错工作,
6、时间复杂度分析
浏览遍历整张航线线性表的时间复杂度:O(1);
线性表的插入和删除操作的时间复杂度:O(n);
查询为线性表的查找,时间复杂度:O(n);
订票为线性表的查找,时间复杂度:O(n);
退票是查找两张线性表,时间复杂度为:O(n*e),其中n为航班总数,e为
对应航班已订票人数。

按数字(0-5)
1=>即可显示所有航线信息;
:.
显示现有的所有航线信息,包括目的地,航班号,飞机号,飞行日期,余票量。
2=>查看某个航线订票余票情况
根据飞行日期,目的地,航班号,飞机号查询飞机的各项信息,如果想要购票
可以实现购票功能。
3=>办理订票业务
根据飞行日期,目的地,航班号,飞机号查询飞机的各项信息进行选择购票,
再输入购票张数,舱位等级,购票人姓名,进行购票。首先输入航班号,如果没有该航
班号。则会输出“对不起,该航线未找到!"系统会给出你的座位号;如果你订票数量
大于总数,则会输出“对不起。您输入的票的数量已经超过成员定额!”;如果你订票
的数量大于剩余票数,那么系统会提示你是否需要排队。如果你需要,则输入排队的客
户信息
4=>办理退票业务
如果有该航班,则按照输入顺序。输入订票数量,订票客户,舱位等级。先输入航
班号,如果你输入的航班号不存在,那么系统会输出“对不起。该航线未找到!”
如果你输入的航班号存在,那么系统会让你输入你退票客户的名字。如果有该客户,那
么退票成功。
如果没有该客户。那么系统会输出“对不起。你没有定过票”。
0=>退出系统
直接退出购票系统。
5=>清理屏幕
清理屏幕上的信息。

主菜单界面
图6-1客服系统主界面
显示所有航线的信息
图6-2显示所有航线的信息
进入订票系统后的操作界面
图6-3按照飞行日期订票
进入查询系统后的操作界面
:.
图6-4订票后再查询此航线
注:由图6-3和图6-4可以看出顾客定了三十张票后剩余90张票。
进入退票系统后的操作界面
图6-5当输入错误的航班时退票失败
图6-6正确输入航班号进行退票成功
退票后的航线查询
图6-7退票后再次查询此航线
注:结合上面的退票信息图可以观察出退票成功后票又变回了原来的张数
多位顾客购票后的余票查询
图6-8多人购票后余票查询

短短一周的数据结构课程设计结束了,本次课程设计遇到了很多困难,但是在
老师的帮助下都一一解决了,首先感谢老师对我的帮助。开始学****数据结构时感觉和C
语言没什么不一样,而且还认为数据结构做不出什么实质性的东西出来。但是这次课程
设计改变了我的看法,也让我深深体会到自己学****的不足。通过这次课程设计,我感觉
数据结构的核心应该是算法,无论什么程序,只要掌握了核心算法,程序基本都能编写
出来。在敲源代码时,发现航班结构体中的已定票乘客信息和等待订票乘客信息的结构
不太好操作,经过一番思考最终改为源代码中所定义的结构体。从中知道了结构体的定
义决定了源程序的难易。?在打程序时,没有把文件操作的代码打进源程序。在调试没
有文件操作的代码时,没有很多错误,但是犯了一个大错,就是在有一个字符串的复制
中使用了赋值,调试过程指出错错误半天都不知道改,后来看了整个程序才反应过来。
在运行调试过程中浏览信息没有输出想要的输出结果,检查程序原来是格式控制字符串
中的一个字符打成了大写;查询信息只能查询链表中的第一条航线,检查程序原来是多
用了break造成过早跳出循环,不能查找后面的航线;乘客订多张票后浏览信息发现余
票只减了一张,检查程序发现乘客订票后只对余票做了自减,在运行调试过程中就出现
了这么些大的错误,在这过程中还对输出窗口界面做了一些调整。?
加入文件操作代码后进行调试,没有出现什么错误。最终运行时老在文件操作时终止程
:.
序,经过调试和自己的摸索原来是文件检测函数运用错误,改正后程序正常运行。运行
程序后打开所写的文件,发现航班信息的余票量没有随乘客的订票而减少,还是初始值,
这时才发现每进行一次订票后都要重新对航班信息的文件重新写入,改后最终就确定了
上交源代码。?
在敲代码和在程序的调试、运行过程中我们发现我们半天才能想出几句语句,整个代码
敲了二十几个小时,调试调了二三十个小时,主要原因使我们练得还不够,C语言功底
还不是很扎实,要增加敲的代码量。
此次课程设计,使我们对链表和链队列的基本操作更加熟练,让我们深深地体
会到要学好数据结构需要多练,多编程,多思考。

#include<>
#include<>
#include<>
#include<>
#definePprintf
#defineSscanf
/****************客户信息**************/
typedefstructcustomer
{
charname[20];//姓名
intnum;//订票数量
intlevel;//舱位等级
customer*next;//指向后继乘客
}customer,*Lcustomer;
/****************航线信息**************/
typedefstructairline
{
charter_address[20];//终点站
charline_num[10];//航班号
charplane_num[10];//飞机型号
intdate;//飞行日期
:.
inttotal;//总人数
intremain;//余票数
customer*booked;//已定客户信息
customer*wait;//替补客户信息
airline*next;//指向后继航线
}airline,*Lairline;
airline*L;//全局变量:航班信息
/*****************按照航班号查找航班********************/
Lairlinesearch_line()
{
chara[10];airline*p;p=L->next;
P("Pleaseinputthenumberofline:");S("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->line_num))break;
returnp;
}
/**********三种方式查找航班**************/
Lairlinesearch_plane()//
{
chara[10];airline*p;p=L->next;
P("Pleaseinputthenumberofplane:");
S("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->plane_num))break;
returnp;
}
Lairlinesearch_date()//
{
inta;airline*p;p=L->next;P("Pleaseinputthedateofplane:");
S("%d",&a);//注意这里加取址符
for(;p;p=p->next)
:.
if(a==p->date)break;//当找到找到与a相同的节点时跳出循环
returnp;
}
Lairlinesearch_address()//
{chara[20];airline*p;p=L->next;
P("Pleaseinputthefinaladdressoftheplane:");S("%s",a);
for(;p;p=p->next)
if(!strcmp(a,p->ter_address))break;
returnp;
}
/******************主界面******************/
voidboundary()
{
P("***********欢迎您进入航空订票客服系统***********\n");
P("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
P("O(∩_∩)O请选择您要进行的业务:\n");
P("\t\t显示所有航线==>请输入1\n");
P("\t\t查询航线信息==>请输入2\n");
P("\t\t进入订票系统==>请输入3\n");
P("\t\t进入退票系统==>请输入4\n");
P("\t\t退出客服系统==>请输入0\n");
P("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
P("\t\t清除屏幕信息==>请输入5\n");
P("请按照以上的信息提示进行操作:\t");
}
/*********显示乘客信息*****************/
voidprint_customer(airline*p)
{
customer*c;
if(p->booked)
{c=p->booked;
P("已经购票的乘客的信息\n\t票数\t姓名\t\n");
:.
for(;c;c=c->next)
P("%5d\t\t%s\n",c->num,c->name);P("\n\n");
}
elseP("╮(╯_╰)╭暂时没有客户订票!\n\n");
if(p->wait)
{
c=p->wait;
P("排队购票的乘客的信息\n\t票数\t姓名\t\n\n");
for(;c;c=c->next)
P("%5d\t\t%s\n",c->num,c->name);
P("\n\n");
}
else
P("暂时没有客户排队订票\n\n");
}
/*********插入新航班(创建链表)*****************/
voidinsert_line()
{airline*p,*q;intflag=1;
for(;flag;)
{
q=(La