航空订票系统实验报告.docx
- 文档编号:1761460
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:23
- 大小:305.93KB
航空订票系统实验报告.docx
《航空订票系统实验报告.docx》由会员分享,可在线阅读,更多相关《航空订票系统实验报告.docx(23页珍藏版)》请在冰点文库上搜索。
航空订票系统实验报告
开发说明书
开发人员:
2010年4月20日
一.设计题目
航空客运订票的业务活动包括:
查询航线、客票预订和办理退票等运订票系统,以使上述业务可以借助计算机来完成。
二.需求分析
(一)功能描述
(1)每条航线所涉及的够息有:
终点站名、航班号、星期几、乘员定额、众票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票层);
(2)作为示意系统,全部数据可以只放在内存中;
(3)系统能实现的操作和功能如下:
①查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额。
②承办订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续.输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求。
若需要,可登记排队候补;
③承办退票业务:
根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询
该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求.则为他
力、理订票手续,否则依次询问其它排队候补的客户。
(二)实现提示
两个客户名单可分别由线性表和队列实现。
为查找方便.已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。
由于预约人数无法预计,队列也应以链表作存储结构。
整个系统需汇总各条航线约情况登录在一张线性表上,由于航线基本不变.可采用顺序存储结构,并按航班有序或按终点站名有序。
每条航线是这张表上的—个记录,包含上述8个域,其中乘员名单域为指向乘员名单链表的头指针,等侯替补的客户名单域为分别指向队头和队尾的指针。
(三)功能结构图
(四)模块划分
1)航班查询
根据旅客提出的终点站名输出航班号、星期几飞行,最近一天航班的日期以及余票额情况。
2)用户订票
根据客户提出的要求查询该航班票额情况,若尚有余票,则为客户办理订票手续.输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求。
若需要,可登记排队候补。
3)用户退票
根据客户提出的要求查询该客户的订票情况,若情况属实则可确认退票。
4)开发简介
表明产品名及开发人员情况。
三.概要设计
(一)数据类型定义
a)已订票人员的结点:
typedefstructEdNode
{
charEname[15];//已订客户姓名
intEnum;//订票数
charEgrade;//航等号
charELocate[8];//座位号,形式1-2,表示订了两张票,其一张是1号位,另一张是2号位
b)候补客户人员的结点:
typedefstructIngNode
{
charIname[15];
intInum;
charIgrade;
}IngNode,*IngList;
C)航班结点:
structFlight//航班结点
{
charID[7];//航班号
charEndName[10];//终点站名
charday[4];//起飞的日期如表示Mon,其为星期一
intdaytimetoint;//加入的日期转成数值如Sun,则它为0;Mon,它为1
intdinger[3];//各舱等的定额票
intlast[3];//各舱等的余票量
EdListE;//已订客户名单的指针
IngQueueI;//候补客户名单的指针
}F;
(二)函数定义
候补结点队列的一系列函数
函数名:
intInitQueue(IngQueue*Q);
intDeleteQueue(IngQueue*Q,IngList*x);
intEnterQueue(IngQueue*Q,IngNode*x);
intEmptyQueue(IngQueue*Q);
初始条件:
InitQueue(&Q);
操作结果:
队列初始化
出队列
进队列
判空
在Refund函数暂用的候补栈的一系列函数
函数名:
voidInitStack(IngStack*S);
intPush(IngStack*S,IngNode*x);
intPop(IngStack*S,IngList*x);
intIsEmpty(IngStack*S);
初始条件:
InitStack(&S);
操作结果:
栈的初始化
进栈
出栈
判空
已订票客户结点的单链表初始化函数
函数名:
intInitList(EdList*L);
初始条件:
InitList(&L);
操作结果:
单链表初始化
主菜单控制函数
函数名:
intMenu(FlightF[]);
初始条件:
FlightF里面队列,单链表的初始化
操作结果:
(1)航班查询
(2)用户订票
(3)用户退票
(4)开发简介
航班查询函数
函数名:
intQuery(FlightF[]);
操作结果:
进行航班信息查询
用户订票函数
函数名:
intBook(FlightF[]);
操作结果:
进行用户订票操作
用户退票函数
函数名:
intRefund(FlightF[]);
操作结果:
进行用户退票操作
开发简介函数
函数名:
voidIntroduce(FlightF[]);
操作结果:
展现开发信息
各模块的界面菜单的一系列函数
函数名:
voidBookMenu();
voidQueryMenu();
voidRefundMenu();
操作结果:
订票操作的界面
查询操作的界面
退票操作的界面
(三)
主程序流程
(四)各模块各函数调用
四.详细设计
(一)数据定义
a)已订票人员的结点:
typedefstructEdNode
{
charEname[15];//已订客户姓名
intEnum;//订票数
charEgrade;//航等号
charELocate[8];//座位号,形式1-2,表示订了两张票,其一张是1号位,另一张是2号位
b)候补客户人员的结点:
typedefstructIngNode
{
charIname[15];
intInum;
charIgrade;
}IngNode,*IngList;
C)航班结点:
structFlight//航班结点
{
charID[7];//航班号
charEndName[10];//终点站名
charday[4];//起飞的日期如表示Mon,其为星期一
intdaytimetoint;//加入的日期转成数值如Sun,则它为0;Mon,它为1
intdinger[3];//各舱等的定额票
intlast[3];//各舱等的余票量
EdListE;//已订客户名单的指针
IngQueueI;//候补客户名单的指针
}F;
(二)主要算法
主菜单控制函数
intMenu(FlightF[])//主菜单函数
{
while(YN=='Y'||YN=='y')
{
system("cls");
printf("\n");
printf("\t\t\t数据结构课程设计");
printf("\n\n");
printf("\t\t\t航空订票系统");
printf("\n\n");
printf("\t\t\t(Q)uery\t航班查询\n");
printf("\n");
printf("\t\t\t(B)ook\t用户订票\n");
printf("\n");
printf("\t\t\t(R)efund\t用户退票\n");
printf("\n");
printf("\t\t\t(I)ntroduce\t开发简介\n");
printf("\n");
printf("\t\t\t(E)xit\t退出系统\n");
printf("\n\n请键入您需要的操作——");scanf("%c",&temp);
getchar();
switch(temp)
{
case'Q':
case'q':
{
Query(F);
YN='N';
break;
}
case'B':
case'b':
{
Book(F);
YN='N';
break;
}
……
return1;
}
订票函数
intBook(FlightF[])//订票函数
{
charzhongjiezifu[4];
intbiaozhi=1;
intzhongjie;
IngNode*p;
EdNode*q,*s;
while(biaozhi)
{
BookMenu();
printf(""\n\n请输入航班号:
");
scanf("%s",ID);
while(i<11)
{
if(strcmp(ID,F[i].ID)==0)
{
flag=1;
break;
}
i++;
}
if(flag==1)
{
while(grade<'1'||grade>'3')
{
printf("请输入您要订的舱等号(1-3):
");
scanf("%c",&grade);
}
printf("请输入您要订票数额:
");
scanf("%d",&count);
if(count>F[i].last[grade-'0'-1])
{
printf("很抱歉,您所要求的机票数大于此班机的余票量!
!
!
\n\n");
printf("您希望列入到候补名单吗?
请输入(Y|N):
");
scanf("%c",&YN);
if(YN=='Y'||YN=='y')
{
printf("请输入您的姓名:
");
scanf("%s",name);
p=(IngNode*)malloc(sizeof(IngNode));
strcpy(p->Iname,name);
p->Inum=count;
p->Igrade=grade;
EnterQueue(&(F[i].I),p);
}
else
{
printf("\n按B返回主菜单,按R重新订票:
\n");
……
}//else
}//if
else
{
printf("请输入您的姓名:
");
scanf("%s",name);
q=(EdNode*)malloc(sizeof(EdNode));
strcpy(q->Ename,name);
q->Enum=count;
q->Egrade=grade;
if(count==1)
{
//使得已订票结点中的座位charELocate[8]格式化
//将其内容填充为%的形式,其座位号就是一个字符数值
//(如12,代表一张12号位子的票)
}
else。
{
//使得已订票结点中的座位charELocate[8]格式化
//将其内容填充为%-%形式(如2-3,就是2号、3号两张座位的号;
}
s=F[i].E;
while(s->next!
=NULL)
{
if(strcmp(name,s->next->Ename))
s=s->next;
else
break;
}
q->next=s->next;
s->next=q;
printf("\n\n订票成功!
!
!
\n\n");
printf("\n您的座位号是——%s\n\n",q->ELocate);
}//else
}//if
else
{
printf("很抱歉,没有此航班!
!
!
\n\n");
printf("\n按B返回主菜单,按R重新订票:
\n");
}//else
}//while
return1;
}//Book
查询函数
intQuery(FlightF[])
{
structtm*local;//系统时间的结构体
time_tt;
t=time(NULL);
local=localtime(&t);
……
for(;k { printf("%8s%9s%10s%8d%6d%7d\n",EndName,ID,day,last123); judge=F[biaoji[k]].daytimetoint-local->tm_wday; if(flag) { nearer=judge; nearday=biaoji[k]; flag=0; } if(nearer<0&&judge<0&&judge { nearer=judge; nearday=biaoji[k]; } elseif(nearer>0&&judge>0&&judge { nearer=judge; nearday=biaoji[k]; } elseif(judge>=0&&nearer<0) { nearer=judge; nearday=biaoji[k]; } } printf("\n\n最近的一趟航班\n\n");printf("%8s%9s%10s%8d%6d%7d\n",EndName,ID,day,last123); …… } 退票函数 intRefund(FlightF[])//退票函数 { //以下介绍的是一个人退票之后,而在候补人员中询问订票的情况 …… while(! EmptyQueue(&(F[i].I))//将候补队列的结点依次出队, {//判断他人退票之后的余票能否给予DeleteQueue(&(F[i].I),&r);//候补队列结点。 if(不能满足候补人员的要求)//如不满足要求,进入S栈; Push(&S,r);//如满足要求,则当前结点成为已订票人员, else { temp=(EdNode*)malloc(sizeof(EdNode)); strcpy(temp->Ename,r->Iname); temp->Egrade=r->Igrade; temp->Enum=r->Inum; 将其座位号填充格式化; s=F[i].E; while(s->next! =NULL) { if(strcmp(temp->Ename,s->next->Ename)) s=s->next; else break; } temp->next=s->next; s->next=temp; printf("\n\n候补名单中%s订票成功! ! ! \n\n",temp->Ename); printf("\n%s的座位号是: %s\n\n",temp->Ename,temp->ELocate); }//else }//while while(! IsEmpty(&S))//把S栈的结点出栈,依次进入候补队列 { Pop(&S,&r); EnterQueue(&(F[i].I),r); } …… } 五调试分析 (一)空间复杂度分析 此程序中的数据结构有单链表,栈和队列及一维数组。 其空间复杂度均为一维的,O(n). (二)时间复杂度分析 此程序中的数据结构有单链表,栈和队列及一维数组。 所以其的时间复杂度均为O(n). 六.用户使用说明 查询 共有有11趟内置航班,具体情况参见该产品的FlightHelp.xls文件。 订票 退票 开发简介 七.测试结果 参见六.用户使用说明(图) 八.附录 (一)各模块的完成人员 数据类形,结构设计: 吴若雪 基于数据结构的栈,队列系列函数: 张莎莎,段美园,刘蒙,赵丹 主菜单函数: 吴若雪 订票函数: 张莎莎,吴若雪 查询函数: 吴若雪,段美园 退票函数: 赵丹,张莎莎 开发简介: 刘蒙,段美园 (二)产品 产品包: 航空订票系统.rar 开发说明书: 航空订票系统开发说明书 产品源代码名: 航空订票系统.cpp 开发文档: 开发成员名单.xls 帮助文档: 帮助.xls
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 航空 订票 系统 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)