航空客运订票系统.docx
- 文档编号:10342996
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:25
- 大小:86.43KB
航空客运订票系统.docx
《航空客运订票系统.docx》由会员分享,可在线阅读,更多相关《航空客运订票系统.docx(25页珍藏版)》请在冰豆网上搜索。
航空客运订票系统
滁州学院
课程设计报告
课程名称:
数据结构
设计题目:
航空客运订票系统
系别:
计算机与信息工程学院
专业:
计算机科学与技术
组别:
第三组
起止日期:
2011年11月15日~2011年12月30日
指导教师:
计算机科学与技术系二○一一年制
组长
学号
2011220099
班级
2011级专升本2班
系别
计算机与信息工程学院
专业
计算机科学与技术
组员
指导教师
老师
课程设计目的
熟练掌握数据的存储表示和基本操作的实现,能够利用存储设计算法解决实际的航空订票问题。
课程设计所需环境
1)Windows操作系统平台
2)VC++6.0编译环境
课程设计任务要求
1)实现录入航班信息的功能
2)实现航班信息查询功能(包括通过航班号查询和目的地查询)
3)实现订票功能,订票数大于剩余票数可进行预订票功能
4)实现退票功能,退票后,余票可直接给预订票的客户
课程设计工作进度计划
序号
起止日期
工作内容
分工情况
1
2011年11月15日~2011年11月17日
展开思路讨论工作并搜集相关资料
潘朝君,蒋小三,姬朝配
2
2011年11月18日~2011年11月20日
分析课程设计要求,确定目标
胡海燕,顾海波
3
2011年11月21日~2011年11月27日
设计软件功能模块
潘朝君,蒋小三
4
2011年11月28日~2011年12月20日
编写代码、实现功能模块
潘朝君,姬朝配,桂斌
5
2011年12月21日~2011年12月27日
系统整合以及测试
胡海燕,桂斌,顾海波
6
2011年12月28日~2011年12月30日
完成课程设计文档
潘朝君,蒋小三,桂斌,姬朝配
教研室审核意见:
教研室主任签字:
年月日
课程设计任务书
1.设计目的
课程设计目的:
1、训练我们灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养我们严谨的科学态度和良好的工作作风。
5.熟练掌握数据的存储表示和基本操作的实现,能够利用存储设计算法解决简单的航空订票问题。
2.系统开发分析
2.1系统需求分析
航空客运定票系统为客户提供三个基本的功能:
查询航线、客票预定和办理退票。
全部数据可以只放在内存中。
(一)查询航线:
能够根据客户输入的终点站名或输入的航班号输出相关的信息,包括航班信息、航班号、飞机号、飞行时间、余票量;
(二)客票预定:
根据客户提出的要求(终点站和航班号)查询该航班。
如余票能够满足客户的要求则为客户办理定票手续;若该航班已经满员或余票额少于客户的定票额,则需重新询问客户需求。
若需要可登记排队候补并留下客户的信息,不需要则退出。
在客票预定这一环节里将出现两个客户名单:
已定票客户名单和预定票客户名单。
已定票与预订票均以链表的结构存储。
(三)办理退票:
根据客户提供的信息(姓名,订票数),为客户办理退票手续,同时在系统中删除该客户的基本信息。
然后查询该航班是否有人排队替补,首先访问排在第一的客户,若退票额能够满足他的要求,则为他办理定票手续,否则依次询问其他排队候补的客户。
2.2算法思想
1.定义一个航班管理方法voidhangbanguanli()。
向航线链表添加新信息,intInsertLinklist(LinklistL)向航线链表添加新的结点,依次输入航班号,飞机号,终点站,飞行日期,乘客总数,余票数。
采用链表的头插入法插入新的结点。
2.通定义voidhangbanchaxun()查询航班信息,可以通过目的站进行查询mddselect(),或者通过航班号进行查询hbhselect()。
3.定义订票功能voiddingpiaoguanli(),首先查找是否有输入的航班,没有则输出“对不起,没有你要找的航班”,若找到该航班信息,通过P指向该航班节点。
然后判断余票量是否满足订票量的需求,满足则输入信息,通过头结点插入法将信息存储在链表中。
若余票量小于订票量,系统提示:
1.是否需要订票(可输入小于等于余票量);2.退出;3:
进入预定程序(若先前订票的人退了票,则该票就直接给预定的人)。
4.定义退票功能voidtuipiaoguanli();通过客户输入的姓名,航班号办理退票手续,使用dowhile来查找是否有此航班,找到了则给他办理退票。
重新修改余票数,退票后删除该客户在链表中的存储信息,并将余票给予预订票的客户。
3.系统功能描述与系统模块划分
·3.1系统功能分析
航空订票系统的总体任务是实现航空订票系统的系统化,规范化以及自动化。
要完成的主要功能有:
·航班信息的添加功能,采用链表的存储结构
·航班信息的查询功能
1:
按终点站查询
2:
按航班号查询
•航班的订票功能:
根据客户提出的要求(航班号)查询该航班票额情况,若尚有余票,则为客户办理订票手续;若已满员或余票额少于定票额,则需重新询问客户要求。
若需要,可登记排队候补预定。
已定票功能,采用链表的存储结构。
预定票功能,采用链队列的存储结构。
使用链队列的先进先出的特性,当有人退票时,先预定票的客户可得到余票。
·航班的退票功能
退票后系统的余票数发生改变,剩余的票给预定票链队列中的第一个客户。
·3.2系统模块划分
1.航班信息的添加模块
InitLinklist();//对航线信息链表进行初始化。
//初始化航线信息
LinklistInitLinklist()
{
L=(Linklist)malloc(sizeof(Hangxian));
if(!
L)exit(OVERFLOW);
L->next=NULL;//建立一个带有头结点的单链表
return(L);
}
//插入新的航线
intInsertLinklist(LinklistL)//向航线链表添加新的结点
{……}
通过程序依次插入航班号,飞机号,终点站,飞行日期,乘客总数,余票数。
采用链表的头插入法插入新的结点。
2.航班信息的查询模块
//通过目的地查询
voidmddselect()
{……}
通过输入的要查询的目的地,与(*p).zhongdianzhan相匹配,若查询到则输出航班信息,若不匹配,则输出“对不起没有你要找的目的地”。
//通过航班号查询
voidhbhselect()
{……}
通过输入的要查询的航班号,与(*p).hangbanhao相匹配,若查询到则输出航班信息,若不匹配,则输出“对不起没有你要找的目的地”。
3.航班信息的订票模块
voiddingpiaoguanli(){……}//订票功能
//单链表
typedefstructYidingkehu
{
charname[15];//已订票的客户姓名
intdingpiaoshu;//已订票数量
structYidingkehu*next1;//
}Yidingkehu,*Link;
//单链队
typedefstructYudingkeku
{
charname[15];//预订票的客户姓名
intyudingpiao;//要订票数量
structYudingkeku*next2;//下一个链队结点指针
}Yudingkeku,*Qyudingqueue;
订票功能要实现已定票功能和预定票功能,首先对输入的站点名或航班号进行判断,查找是否有这个航班,若无,则输出“对不起,没有你要找的航班”,若找到此航班,则p指向该航班结点,让客户输入要定的票数,判断余票量可满足客户的订票请求,满足则输入信息,通过头结点插入法将信息存储在链表中,输出“订票成功”。
若余票量小于订票量,系统提示:
1.是否需要订票(可输入小于等于余票量);2.退出;3:
进入预定程序(若先前订票的人退了票,则该票就直接给预定的人)。
进入预定票程序后,将客户信息保存在链队列中。
4.航班信息的退票模块
voidtuipiaoguanli(){……}//退票功能
首先根据客户输入的姓名订票张数,来查找是否有此航班,如果匹配的话则给他办理退票,如果没有找到,即系统中没有该人的信息,提示是否来重新查找,输出“对不起,该航班没有人订票或者是你没有订该航班的票”。
退票成功后重新修改余票数,退票后删除该客户在链表中的存储信息,并将余票给予预订票的客户
4.系统设计详细
4,1程序流程图
4.1.1主界面流程图
4.1.2订票功能流程图
4.1.3退票流程图
4.2程序源码
本次数据结构的课程设计是航空客运订票系统,其功能包括航班信息的录入、查询,订票的管理,退票的管理,鉴于系统的功能的分析,为了便于航班信息的插入,已订票客户信息的插入和删除操作,所以本设计采用链表的结构进行信息的存储和读取,而对于等候排队预订票客户信息因为要根据客户的预定时间的先后顺序进行询问操作,所以预订票客户信息采用链队列的存储结构。
具体设计代码实现如下:
第一步:
首先分别设置3种类型的结构体,以来表示已订票客户信息,预订票客户信息、航班信息:
//已订票客户结构体
typedefstructYidingkehu
{
charname[15];//已订票的客户姓名
intdingpiaoshu;//已订票数量
structYidingkehu*next1;//
}Yidingkehu,*Link;
//预订票客户结构体
typedefstructYudingkeku
{
charname[15];//预订票的客户姓名
intyudingpiao;//要订票数量
structYudingkeku*next2;//下一个链队结点指针
}Yudingkeku,*Qyudingqueue;
//声明队列
typedefstruct
{
Qyudingqueuefront;//单链队头结点
Qyudingqueuerear;//单链队尾结点
}linkQueue;
//航班信息结构体
typedefstructHangxian
{
charhangbanhao[15];//航班号-
charfeijihao[15];//飞机号
intfeixingriqi;//起飞日期
intchenkerenshu;//座位数
intyupiao;//余票
charzhongdianzhai[15];//终点站
structHangxian*next;//指向下一个链结点的指针
structYidingkehu*yiding;//定义一个指向已订票客户的头结点指针
structYudingkeku*yudingqueue;
}Hangxian,*Linklist;
第二步:
初始航班信息的录入:
//航线管理功能的实现,进入航班管理界面:
voidhangbanguanli()
{
intj=1,m;
do
{
if(!
InsertLinklist(L))//向其中加入航班信息
{
printf("内存已满\n");exit(OVERFLOW);
}//向链表中加一结点
printf("\t是否要输入下一个航线记录?
\n");
printf("\t是请输入1\n");
printf("\t否请输入2\n\t");
scanf("%d",&m);//在这里依靠用户来决定是否输入下一条航线记
}while(m==1);
}
//初始化航线信息,此处采用带头结点的链表来存储航班信息,下面是初始化航班信息链表的头指针L:
LinklistInitLinklist()
{
L=(Linklist)malloc(sizeof(Hangxian));
if(!
L)exit(OVERFLOW);
L->next=NULL;//建立一个带有头结点的单链表
return(L);
}
//插入新的航线,链表有头结点.
intInsertLinklist(LinklistL)//02向航线链表添加新的结点
{
Linklistp;
p=(Linklist)malloc(sizeof(Hangxian));//为一个新的结点分配空间
if(!
p)exit(OVERFLOW);
printf("\t请依次输入下面几项内容:
\n\n");//这里的输入采用一个个单独输入,避免了乱赋值的现象
printf("航班号:
");
getchar();
gets(p->hangbanhao);
printf("飞机号:
");
gets(p->feijihao);
printf("终点站:
");
gets(p->zhongdianzhai);
printf("飞行日期:
");
scanf("%d",&((*p).feixingriqi));//'->'运算符的优先级比'&'大。
printf("乘客总数:
");
scanf("%d",&((*p).chenkerenshu));
printf("余票数:
");
scanf("%d",&((*p).yupiao));
p->yiding=(Yidingkehu*)malloc(sizeof(Yidingkehu));
p->yudingqueue=Q.front=Q.rear=(Qyudingqueue)malloc(sizeof(Yudingkeku));
p->next=L->next;
L->next=p;//采用链表的头插入法插入新的结点。
returnok;
}
第三步:
实现查询功能,此处查询功能的实现有两种形式:
一,按目的地进行查询。
二,按航班号进行查询。
//查询功能,进入查询主界面:
voidhangbanchaxun()
{
intn;
printf("\t查找航线信息\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1.通过目的地查询==\n");
printf("\t==>2.通过航班号查询==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:
");
scanf("%d",&n);
printf("\n");
switch(n)
{
case1:
mddselect();//按目的站进行查询。
break;
case2:
hbhselect();//按航班号进行查询。
break;
default:
break;
}
}
//通过目的地查询
voidmddselect()
{
charc[15];
intm;
Linklistp=L;
printf("\t请输入要查询的目的地:
");
getchar();
gets(c);
do{
p=p->next;
if(p)
{
m=strcmpi((*p).zhongdianzhai,c);//如果==的话则m=0;strcmpi()"String.h"内置函数,比较两字符串的大小,不区分大小写。
if(m==0)
{
printf("\t航班信息-->");
printf("航班号:
%s",p->hangbanhao);
printf("\t飞机号:
%s",p->feijihao);
printf("\t飞行时间:
周%d",p->feixingriqi);
printf("\t余票量:
%d\n",p->yupiao);
}
}
else
{//如果不匹配的话就做
printf("\t对不起没有你要找的目的地:
\n\n");m=0;
}
}while(m!
=0);
}
//通过航班号查询
voidhbhselect()
{
charc[15];
intm;
Linklistp=L;
printf("\t请输入要查询的航班号:
");
getchar();
gets(c);
do{
p=p->next;
if(p)
{
m=strcmpi((*p).hangbanhao,c);//如果==的话则m=0;这里的(*p).与p->的作用是一样的
if(m==0)
{
printf("\t航班信息-->");
printf("航班号:
%s",p->hangbanhao);
printf("\t飞机号:
%s",p->feijihao);
printf("\t飞行时间:
周%d",p->feixingriqi);
printf("\t余票量:
%d\n",p->yupiao);
}
}
else
{//如果不匹配的话就做
printf("\t对不起没有你要找的航班号:
\n");m=0;
}
}while(m!
=0);
}
第四步:
实现订票功能,根据客户提供的终点站名进行订票,当信息输入完毕后,若存在该航班的信息,则检测余票量是否满足客户的订票数量请求,若满足,则提示订票成功,同时将该客户订票信息插入至该航班信息的已订票客户链表中,并实现余票数的动态变化。
若客户需订票的数大于该航班的余票量,则询问客户可愿意等待候补票,若愿意,则进行该客户信息登记,包括(姓名、预订票数、指向下一个结点的指针),注意此处预订票客户的信息的插入采用的是链队列的存储结构,因为当有余票时,要采用先来先到的顺序进行查询。
此段代码采用了goto来控制程序的执行流程。
/订票功能
voiddingpiaoguanli()//L,H,Q是全局变量,便于初始化各链表的头结点.
{
Linklistp=L;//航线信息的头指针L.
Yidingkehu*h=H,*h1;//Yidingkehu定义客户的结点,方便插入与删除.
linkQueueq=Q;//预订票客户链表队列.
charc[15];
intm=1,piao,n;//piao存储客户要订的票数
getchar();
printf("请输入终点站名:
");
gets(c);
printf("\n");
p=L->next;
if(p)
{
do{//查找一下,是否有这个航班
if(!
p)
{
printf("对不起,没有你要找的航班:
\n\n");
gotoloop1;
}
m=strcmpi(p->zhongdianzhai,c);
if(m==0)
{
printf("航班信息:
\n");
printf("航班号:
%s\n",p->hangbanhao);
printf("飞机号:
%s\n",p->feijihao);
printf("飞行时间:
周%d\n",p->feixingriqi);
printf("余票量:
%d\n",p->yupiao);
}
elsep=p->next;
}while(m!
=0);//此时若找到此航班,则p指向该航班结点.
if(m==0)
{
do{
printf("\n请输入你要订的票数:
");
scanf("%d",&piao);
if(piao<=p->yupiao)//判断余票量可满足客户的订票请求
{
h=p->yiding;
if(h)
{
h1=h;
//h=h->next1;
h=(Yidingkehu*)malloc(sizeof(Yidingkehu));
printf("请输入你的名字:
");
getchar();
gets(h->name);
h->dingpiaoshu=piao;
h->next1=h1->next1;
h1->next1=h;//采用头结点进行插入,此时h1指向该航班的“已定票客户”信息的头结点。
p->yupiao=p->yupiao-piao;
printf("订票成功:
\n");
m=2;
}
}
else
{
printf("余票量:
%d\n",p->yupiao);
printf("对不起,余票%d张不足,不能完成订票\n\n",p->yupiao);
printf("是否要重新订票?
\n");
printf("需要请输入1否则请按2预订请输入3:
");
scanf("%d",&m);
printf("\n");
if(m==3)gotoloop3;
}
}while(m==1);
}
}
elseif(!
p)
{
loop3:
Yudingkeku*q3;
//printf("对不起,该航班的票已售完\n");
q.front=p->yudingqueue;
if(!
(q.front->next1))
{
printf("没有人预订票,是否要预订?
\n");
}
elseif(q.front!
=q.rear)
{
printf("已有人预订票,是否要预订?
\n");
}
printf("预订请输入1否则输入2:
");
scanf("%d",&n);
printf("\n");
if(n==1)
{
q3=(Qyudingqueue)malloc(sizeof(Yudingkeku));
printf("请输入你的姓名");
getchar();
gets(q3->name);
printf("请输入订票数");
scanf("%d",&q3->yudingpiao);
q3->next2=NULL;
q.rear->next2=q3;
q.rear=q3;
printf("你已经预订了!
\n");
}
}
loop1:
;
}
第四步:
实现退票功能,首先输入航班号,若存在该航班的信息,接下来输入已订票客户的姓名和订票数,当此两条件均满足时,则提示取消订票成功,同时删除该客户在该航班的已订票客户信息链表中信息,与此同时检测该航班的预订票客户信息是否为空,若不为空,则取队头,并检测等待队列中的第一个客户的预订票量是否小于余票量,若满足,则将该客户信息从该等待队列中出队,同时将该客户信息插入到该航班的已订票客户的链表中去。
具体代码实现如下:
//退票功能
voidtuipiaoguanl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 航空 客运 订票 系统