飞机订票系统
摘要
随着时代的进步社会分工的不断细化,各个行业联系的不断密切,人们出行越来越多,出行的方式也是多种多样,作为空中重要的交通工具,飞机航空系统也在不断地得到优化,其中重要的一项就是航空飞机订票系统,因此好的订票系统关系着人们的日常出行方便与否,设计并编制出符合人们需要的航空订票系统是一项繁重而艰巨的任务。
本文使用Dev-C++ 作为程序代码的实现软件,进行飞机订票系统的数据结构课程设计。首先,根据课程设计内容进行需求分析,确定主要的功能模块。然后进行数据结构、各功能模块算法以及它们之间的调用关系的概要设计,做出各信息模块的数据结构表,并给出所用的结构体和结点类型。在此基础上,进行各功能模块的详细算法设计,做出各算法的流程图。最后,对系统进行测试,分为合法数据测试和非法数据测试,并对测试结果截图保存。本系统包含浏览航线信息(信息的录入在main函数中)、浏览已订票客户信息,查询航线、订票、退票和退出系统6 个基本功能,经测试性能良好。
关键词:飞机订票系统 数据结构 C语言 队列 单链表
目录
飞机订票系统… 1
摘 要… 1
目 录… 2
§1项目背景… 3
§2项目分析… 3
§3需求分析… 4
3.1、用户需求分析… 4
3.2、功能需求分析… 4
§4概要设计… 5
§5详细设计… 6
5.1、浏览航线信息… 7
5.2、浏览已订票客户信息… 8
5.3、查询航线… 9
5.4、办理订票业务… 10
5.5、办理退票业务… 11
5.6、菜单界面的制定… 12
§6编码实现… 13
§7实验结果与分析… 14
§8总结… 15
1.项目背景
飞机订票系统是一种新兴的现代商务方式,近几年来得到了迅速发展,显现了巨大的现代业价值。有理由相信,订票系统将逐渐方便社会生活,也将成为数字化社会的一种重要体现。它改变了传统的买卖双方面堆满的交流方式,也打破了旧有工作经营模式,它通过网络使航空公司面对整个世界,为用户提供每周
7
天,每天 24 小时的全天候服务订票的规模正在逐年迅速增长,它带来的商机是巨大而深远的。订票系统研究的主攻方是通过公共计算机通信网络进行网上订票活动,突破传统商务在时间、地域上的限制,为方便、快捷、安全可靠的新兴电子化商务活动模式。是网上订票活动更安全、可靠、快速、明确和方便。
对航空公司来说,航空订票管理系统既能扩大服务范围,扩大公司影响,减少营业费又对稳固航空公司的客源有着重要的辅助作用;站在旅客的角度,航空公提供的这种服务提供了更多的方便,节省了很多时间。建设航空订票管理系统是体现和提高航空公领导业绩的一条捷径。
2.项目分析
通过此系统可以实现如下功能:
本系统包含浏览航线信息(信息的录入在main函数中)、浏览已订票客户信息,查询航线、订票、退票和退出系统6 个基本功能,经测试性能良好。
录入:可以录入航班情况(数据可以存储在一个数文件中,数据结构、具体数据自定)
查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;
订票:可以订票,如果该航班已经无票,可以提供相关可选择航班;(订票情况可以存在一个数据文件
中,结构自己设定)
退票:可退票,退票后修改相关数据文件;
修改航班信息:当航班信息改变可以修改航班数据文件
3.需求分析
3.1用户需求分析
用户使用此程序所要完成的工作主要为:录入和查询所有航线信息、查看已订票客户信息、查询航线、办理订票业务、办理退票业务。通过此系统可以方便的进行上述工作。每条航线所涉及的信息有:终点站名、航班号、飞行时间、票价、乘员定额、余票量。已订票的客户名单信息包括姓名、订票量、舱位等级( 1, 2 或 3)。等候替补的客户名单信息包括姓名、所需票量。查询航线功能可以根据旅客提出的终点站名输出航班号、飞行时间、票价、乘员定额、余票量。订票业务功能根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚
有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于定票额,则需重新询问客户要求。若需要,可登记排队候补购票。退票业务功能根据客户提供的情况(航班号、姓名)为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户
3.2功能需求分析
1.功能模块内容
(1).将航班的基本信息录入到系统中。
(2)根据航班号或者根据起飞地点、降落地点查询所需航班信息。
(3)输入姓名和所要订航班的航班号订票。
(4)输入姓名和所订航班的航班号办理退票
(5)输入航班号,修改该航班的起飞和降落时间以修改航班的起降时间。
(6)退出的同时将信息写入文件。
(注:上述功能需求分析在本设计的系统中的并不是全部体现出来)
4.概要设计
1.航班的信息:航班的情况存储结构采用单链表和单链队列,每个元素表示一个航班的情况,包括航班号、终点站名、飞机号、飞行日期、乘员定额、余票量六个数据项,即:
struct airline
{
char ter_name[10];/*终点站名 */
char air_num[10];/航班号/
char plane_num[10];/飞机号/
char day[7];/飞行周日(星期几)/
int tkt_amt;/乘员定额/
int tkt_sur;/余票量/
linklist *order;/乘员名单域,指向乘员名单链表的头指针/
linkqueue wait;/等候替补的客户名单域,分别指向排队等候名单队头队尾的指针/
}lineinfo;
struct airline *start;
2.乘客的订票信息:乘客的情况储存结构采用单链表,有客户姓名、舱位等级、订票量三个数据项,即:
typedef struct ord_ros
{
char name[10];/客户姓名/
int ord_amt;/订票量/
int grade;/舱位等级/
struct ord_ros *next;
}linklist;
订票系统数据结构表:
数据项
数据类型
航班号
字符串(char)
终点站名
字符串(char)
飞机号
字符串(char)
飞行日期
字符串(char)
乘员定额
整型(int)
余票量
整型(int)
客户姓名
字符串(char)
舱位等级
整型(int)
订票量
整型(int)
5.详细设计
根据3中的功能需求分析和4中的概要设计,以及数据类型结构,进行下述的详细设计:
5.1浏览航线信息
在飞机订票系统中,功能1就是航线信息的浏览,在编译时输入“1”查询航线信息。首先,定义函数void display(struct airline
*info)打印出每条航线的基本信息,
(info->ter_name,info->air_num,info->plane_num,info->day,info->tkt_amt,info->tkt_sur),然后根据函数void list()调用函数void display打印出全部航线信息,总共有MAXSIZE条航线,根据函数display中的指针info,由info=start输出信息printf(“终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n”)。
/打印全部航线信息/
void list()
{
struct
airline *info;
int i=0;
info=start;
printf(“终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n”);
while(i display(info); info++; i++; } printf("\n\n"); } 5.2浏览已订票客户信息 在飞机订票系统中,功能2就是浏览已订票客户的信息,在编译时输入“2”查询已订票客户信息。已订票的客户信息是根据航班号来查询的,找寻所有航班中的客户姓名,订票数,舱位等级。定义struct airline *find()来查询航班号是否存在,语句while(i /打印订票乘员名单域的客户名单信息/ void prtlink() { linklist struct airline *info; info=find(); p=info->order; if(p!=NULL){ printf("%s\t\t%d\t%d\n",p->name,p->ord_amt,p->grade); else printf(“该航线没有客户信息!!\n”); } 5.3查询航线 在飞机订票系统中,功能3就是查询航线,在编译时输入“3”查询航线信息。查询航线时是根据客户提出的终点站名查询航线信息,因此需要输入的终点站进行判断,如果终点站名字不对,则会报错。然后调用函数display()输出所有航线信息,代码如下: void search() { char name[10]; int i=0; info=start; printf(“请输入终点站名:”); scanf("%s",name); while(i if(!strcmp(name,info->ter_name)) break; info++; i++; } if(i>=MAXSIZE) printf(“对不起,该航线未找到!\n”); else{ printf(“终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n”); display(info); } } 5.4办理订票业务 1.在飞机订票系统中,功能4就是办理订票业务,在编译时输入“4”进行订票业务办理。在办理订票时可能存在余票不足的情况,因此咨询用户是否愿意排队等候。定义linklist *insertlink(linklist *head,int amount,char name[],int NEW->ord_amt=amount;NEW->grade=grade; NEW->next=NULL;head=NEW; /增加订票乘员名单域的客户信息/ linklist *insertlink(linklist *head,int { linklist p1=head; NEW=(linklist *)malloc(sizeof(linklist)); if(!NEW) {printf("\nOut of memory!!\n");return NULL;} strcpy(NEW->name,name); NEW->ord_amt=amount; NEW->grade=grade; NEW->next=NULL; if(head==NULL)/若原无订票客户信息/ {head=NEW;NEW->next=NULL;} else head=NEW; NEW->next=p1; return head; }//insertlink ending 2.当航班票的剩余量还足够时,办理订票业务要根据客户提供的航班号进行查询 if(!(info=find())) ,如为空,退出该模块。如果客户订票额超过乘员定票总额,退出if(amount>info->tkt_amt)。如果客户订票额末超过余票量if(amount<=info->tkt_sur),然后添加订票成功并等记信息,在订票乘员名单 域中添加客户信息info->order=insertlink(info->order,amount,name, grade); 再依次输出该订票客户的座位号,用语句遍历for(i=0;i 5.5办理退票业务 在飞机订票系统中,功能5就是办理退票业务,在编译时输入“5”进行退票业务办理。 用查询函数,根据客户提供的航线进行搜索if(!(info=find())) 然后根据客户提供的姓名到订票客户名单域进行查询while(p1!=NULL) 若信息查询成功,删除订票客户名单域中的信息 info->tkt_sur+=num; 若未找到,退出本模块。info->order=head;重新将航线名单域指向订票单链表的头指针 。f=(info->wait).front;f指向排队等候名单队列的头结点 r=(info->wait).rear;r指向排队等候名单队列的尾结点;t=f;t为当前满点条件的排队候补名单域。 找到匹配航班号的航班结点,根据航班号,姓名,退票数量修改退票删除要退票的客户订单。如果没有找到匹配的客户结点,输出提示信息,定义函数删除客户信息,同时修改后插入到订票客户名单链表中info->order=insertlink(info->order,t->req_amt,t->name,grade);完成退票。 /退票模块/ void return_tkt() { qnode *t,*back,*f,*r; int grade,num; linklist *p1,*p2,*head; char cusname[10]; if(!(info=find())) return;/调用查询函数,根据客户提供的航线进行搜索/ head=info->order; p1=head; printf(“请输入你的姓名(退票客户):”); scanf("%s",cusname); while(p1!=NULL) {/根据客户提供的姓名到订票客户名单域进行查询/ if(!strcmp(cusname,p1->name)) break; p2=p1;p1=p1->next; } if(p1==NULL){ printf(“对不起,你没有订过票!\n”);return;}/若未找到,退出本模块/ else{/若信息查询成功,删除订票客户名单域中的信息/ printf(“您的订票量为:%d\n”,p1->ord_amt); printf(“请输入您的退票数量:”); scanf("%d",&num); if(p1==head) { grade=p1->grade; if(p1->ord_amt==num) {head=p1->next;free(p1);} else { if(p1->ord_amt>num) head->ord_amt-=num; } } else { if(p1->ord_amt==num) {p2->next=p1->next;free(p1);} else { if(p1->ord_amt>num) p1->ord_amt-=num; } } info->tkt_sur+=num; printf("\n成功退票!\n"); } info->order=head;/*重新将航线名单域指向订票单链表的头指针 */ f=(info->wait).front;/f指向排队等候名单队列的头结点/ r=(info->wait).rear;/r指向排队等候名单队列的尾结点/ t=f;/t为当前满点条件的排队候补名单域/ while(t) { if(info->tkt_sur>=info->wait.front->req_amt){/若满足条件者为头结点/ int i; printf("%s订票成功!\n",t->name); for(i=0;ireq_amt;i++)/输出座位号/ printf("%s的座位号是:%d\n",t->name,(info->tkt_sur)-i); info->tkt_sur-=t->req_amt; info->order=insertlink(info->order,t->req_amt,t->name,grade);/插入到订票客户名单链表中/ free(t); break; } back=t;t=t->next; if((info->tkt_sur)>=(t->req_amt)&&t!=NULL)/若满足条件者不为头结点/ { int i; back->next=t->next; printf("\n\t%s订票成功!\n",t->name); for(i=0;ireq_amt;i++)/输出座位号/ printf("<%s>'s seat number info->tkt_sur-=t->req_amt; info->order=insertlink(info->order,t->req_amt,t->name,grade);/插入到订票客户名单链表中/ free(t);break; } if(f==r) break; } } 5.6菜单界面的制定 根据上述的五大功能,最后为飞机订票系统制定退出系统功能模块,制作系统界面,使得整个界面系统化,界面示意图如下: 6.编码实现 整个飞机订票系统的设计,各功能模板函数之间的调用关系如下: void display(struct airline *info) /打印每条航线的基本信息/ void list() /*打印全部航线信息 */ void search()/根据客户提出的终点站名输出航线信息/ struct airline *find()/根据系统提出的航班号查询并以指针形式返回/ void prtlink()/打印订票乘员名单域的客户名单信息/ linklist *insertlink(linklist *head,int linkqueue appendqueue(linkqueue q,char void order()/办理订票业务/ void return_tkt()/退票模块/ int menu_select()/菜单界面/ 7.实验结果与分析 (1)输入菜单号“1”,浏览全部航班信息 (2)输入菜单号“2”,浏览已订票客户信息 当输入的航班号不存在时,会出现报错的信息并退出系统。 根据输入航线的终点站名查询航线的信息,当输入的航线终点站名不在已有的航线内时,会出现报错信息。 订票时,需要根据客户的所要乘的航班、订票数量和舱位等级决定。 当有乘客已经购票时,此时使用功能“2”查询已购票的客户信息,就会一一呈现出来客户姓名、订票数量和舱位等级。 (5)输入菜单号“5”,办理退票业务 8.总结 在设计飞机订票系统时,总体功能把握良好,系统的使用性能一般。其中出现了下列问题:(1)在录入乘客的信息时是通过功能“4”办理订票业务间接录入的,应从新需要设计一个功能录入乘客信息会更好。(2)在办理订票业务时,发现没有根据客户的证件信息。(3)在办理订票业务时,对舱位的要求设计出现问题,舱位等级超出已有的等级没有用报错,可能是此处在实际生活中只有三个等级的原因。 这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了对数据结构的理解,提高宗合运用本课程所学知识的能力。2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。发现做一个项目设计是非常不简单的。 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 撤销:Ctrl/Command + Z 直接输入1次#,并按下space后,将生成1级标题。 强调文本 强调文本 加粗文本 加粗文本 标记文本 引用文本 H2O is是液体。 210 运算结果是 1024. 链接: link. 图片: 带尺寸的图片: 居中的图片: 居中并且带尺寸的图片: 当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。 去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 一个简单的表格是这么创建的: 使用 SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如: 一个具有注脚的文本。2 Markdown将文本转换为 HTML。 您可以使用渲染LaTeX数学表达式 KaTeX: Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分 Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt. 你可以找到更多关于的信息 LaTeX 数学表达式here. 可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:: 这将产生一个流程图。: 我们依旧会支持flowchart的流程图: 如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。 如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入, mermaid语法说明 ↩︎ 注脚的解释 ↩︎
prtlink()来查询订票客户名单信息,同时此处需要调用struct airline *find()得知航线,定义链表元素linklist *p;,并判空,指向下一个指针p=p->next;,找出所有乘客printf(“客户姓名 订票数额 舱位等级\n”);
*p; printf("客户姓名 订票数额 舱位等级\n");
while(p){
p=p->next;
}
}
struct airline *info,*find();
grade)来加订票乘员名单域的客户信息,用 malloc 函数申请一个航班结点, 并将客户信息赋到新申请的结点中
NEW->next=p1; 该操作将该结点插入航班链表中。在由此增加排队等候的客户名单linkqueue
appendqueue(linkqueue q,char name[],int amount)
amount,char name[],int grade)
*p1,*NEW;
return;
struct airline *info;info->wait.front=t->next;
is:%d\n",t->name,(info->tkt_sur)-i);
amount,char name[],int grade) /增加订票乘员名单域的客户信息/
name[],int amount) /增加排队等候的客户名单域/
根据设置的MAXSIZE值为3,总共有3条航线,同时每一条航线的相关信息都展示出来。
观察上述三条航线的订票客户信息,发现每一条航线都没有客户信息,因此推测是没有录入客户信息。那么,客户信息如何录入?在本系统中,客户信息测录入是通过功能“4”办理订票业务录入的。
在办理退票时,如果输入的姓名和航班号不对,则系统会提醒您出现没有购票。退票过程是根据订票人的姓名和航班号决定的。欢迎使用Markdown编辑器
新的改变
功能快捷键
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G合理的创建标题,有助于目录的生成
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。如何改变文本的样式
删除文本
插入链接与图片
如何插入一段漂亮的代码片
代码片
.// An highlighted block
var foo = 'bar';
生成一个适合你的列表
创建一个表格
项目
Value
电脑
$1600
手机
$12
导管
$1
设定内容居中、居左、居右
:---------:
居中
使用:----------
居左
使用----------:
居右
第一列
第二列
第三列
第一列文本居中
第二列文本居右
第三列文本居左
SmartyPants
TYPE
ASCII
HTML
Single backticks
'Isn't this fun?'
‘Isn’t this fun?’
Quotes
"Isn't this fun?"
“Isn’t this fun?”
Dashes
-- is en-dash, --- is em-dash
– is en-dash, — is em-dash
创建一个自定义列表
如何创建一个注脚
注释也是必不可少的
KaTeX数学公式
新的甘特图功能,丰富你的文章
UML 图表
FLowchart流程图
导出与导入
导出
导入
继续你的创作。