1、航空客运订票系统实验报告 实习报告题目:设计一个包括查询航线、客票预订和办理退票等业务的航空客运订票系统班级: 姓名: 学号: 完成日期:一、需求分析 1 每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日(星期几)、乘员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量); 2 全部数据可以只放在内存中; 3 系统能实现的操作和功能如下: a) 查询航线: 根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额; b) 承办订票业务: 根据客户提出的要求(航班号、订票数额)查询该航班票额情
2、况,若尚有余票,则为客户办理订票手续, 输出座位号;若已满员或余票额少于定票额,则需重新询问客户要求。若需要,可登记排队候补; c) 退票业务: 根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询 问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。 4.测试数据:1.查看航线信息2.办理订票业务: 航班号:5 订票数量:5 姓名:1 舱位等级:13.办理订票业务: 航班号:5 订票数量:6 是否候票:y 姓名:24.办理订票业务: 航班号:5 订票数量:3 是否候票:y 姓名:35.办理退票业务: 航班号:
3、5 姓名:16查询航线: 终点站名:haerbin7查看已定票客户信息:航班号:58查询航线: 终点站名:shanghai详细测试数据见调试分析。 二、概要设计 1本程序含有订票客户结构体,候补队列,航线结构体等3个主要模块。Main 和菜单menu也是重要模块。客户结构采用链表存储,主要操作有插入insert;队列采用链队列存储,主要操作有插入add,航线结构采用顺序存储。 2功能模块说明(1)显示已初始化的全部航线信息利用airlinelist()函数。(2)浏览已订票客户信息利用Viewlink()函数。(3)根据客户提出的终点站名,调用search()函数输出航线信息。(4)order
4、()办理订票业务:根据客户提供的航班号进行查询航线信息,若客户订票额超过乘员定票总额,退出,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单域中添加客户信息;如果暂时没有票,询问客户是否要排队等侯,如果是,则在等候队列增加该客户的订票信息。(5)refund()办理退票业务:调用查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。退票成功后,重新将航线名单域指向订票单链表的头指针。根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。(6)退出本系统三、详细设计1.主程序中需要的全程量#define FLIGHT_NU
5、MBER 5 /*给定5条航线*/#define MAX 200 /*给定座位号最大为200*/int seatMAX=0,0;/*初始化每条航线200个座位号为0,即未被预定*/int seat_numMAX; /*暂时存放已发给客户的座位号,为存放到客户名单域的媒介*/2.链队列类型(1)结点类型typedef struct QNode char name10;/*等候替补客户姓名*/ int Wnumber;/*订票量*/ struct QNode *next;QNode,*Queueptr;(2)队列类型typedef struct WaitQueue Queueptr front;
6、/*等候替补客户名单域的头指针*/ Queueptr rear; /*等候替补客户名单域的属指针*/LinkQueue; /*等候替补客户用链队列存储*/LinkQueue AddQueue(LinkQueue q,char name,int amount)return q;返回等候替补的客户名单域为分别指向队头和队尾的指针3.链表类型typedef struct LNode /*定义已定票客户的线性链表结构*/ char name10;/*客户姓名*/ int Book_num;/*订票量*/ int grade;/*舱位等级*/ int numMAX;/*订票客户的座位号*/ struct
7、 LNode *next;LinkList;LinkList *InsertLink(LinkList *head,int amount,char name,int grade,int *seat_num)return head返回链表头指针4.线性表类型typedef struct airline /*定义航线的结构*/ char terminus10;/*终点站名 */ char flight_num10;/*航班号*/ char plane_num10;/*飞机号*/ char day7;/*飞行周日(星期几)*/ int total_num;/*乘员定额数量*/ int remain_
8、num;/*余票量*/ int seatMAX; /*每条航线的座位数额为MAX设定大于乘员定额数量*/ LinkList *order;/*乘员名单域,指向乘员名单链表的头指针*/ LinkQueue wait;/*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/SqList;struct airline *first; /*定义指向航线结构的指针*/5程序伪码:#include #include #include #include#define FLIGHT_NUMBER 5 /*给定5条航线*/#define MAX 200 /*给定座位号最大为200*/int seatMA
9、X=0,0;/*初始化每条航线200个座位号为0,即未被预定*/int seat_numMAX; /*暂时存放已发给客户的座位号,为存放到客户名单域的媒介*/typedef struct QNode char name10;/*等候替补客户姓名*/ int Wnumber;/*订票量*/ struct QNode *next;QNode,*Queueptr;typedef struct WaitQueue Queueptr front; /*等候替补客户名单域的头指针*/ Queueptr rear; /*等候替补客户名单域的属指针*/LinkQueue; /*等候替补客户用链队列存储*/ty
10、pedef struct LNode /*定义已定票客户的线性链表结构*/ char name10;/*客户姓名*/ int Book_num;/*订票量*/ int grade;/*舱位等级*/ int numMAX;/*订票客户的座位号*/ struct LNode *next;LinkList;typedef struct airline /*定义航线的结构*/ char terminus10;/*终点站名 */ char flight_num10;/*航班号*/ char plane_num10;/*飞机号*/ char day7;/*飞行周日(星期几)*/ int total_num
11、;/*乘员定额数量*/ int remain_num;/*余票量*/ int seatMAX; /*每条航线的座位数额为MAX设定大于乘员定额数量*/ LinkList *order;/*乘员名单域,指向乘员名单链表的头指针*/ LinkQueue wait;/*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/SqList;struct airline *first; /*定义指向航线结构的指针*/void display(struct airline *info) /*输出每条航线的基本信息*/printf(%8st%3st%4st%5stt%5dt%12dn,info-term
12、inus,info-flight_num,info-plane_num,info-day,info-total_num,info-remain_num);void airlinelist()/*显示全部航线信息*/ struct airline *info; /*定义指向航线结构的指针*/ int i=0; info=first; /*将指向第一条航线的指针赋给info*/ printf(终点站名t航班号t飞机号t飞行周日t乘员定额t余票量n); while(iFLIGHT_NUMBER) display(info); info+; /*指向下一条航线的指针,即查找下一条航线*/ i+; /w
13、hile printf(nn);/airlinelistvoid search() /*搜索客户提出的终点站名,若存在,则输出该航线基本信息*/ struct airline *info; char name10; int i=0; int j=0; /*j用来记录与客户提出的终点站名相同的航线条数*/ info=first; /*将指向第一条航线的指针赋给info*/ printf(请输入终点站名:); scanf(%s,name); while(iterminus) if(j=0) printf(终点站名t航班号t飞机号t飞行周日t乘员定额t余票量n); display(info); j+
14、; info+; i+; /if elseinfo+; i+; /while if(j=0) printf(Sorry,没有该终点站!n);/searchstruct airline *find() /*根据客户提出的航班号查询并以指针形式返回*/ struct airline *info; char number10; int i=0; info=first; printf(请输入航班号:); scanf(%s,number); while(iflight_num) return info; info+; i+; /while return NULL;/find void Viewlink(
15、) /*显示订票乘员名单域的客户名单信息*/ LinkList *p; struct airline *info; info=find(); /*将find()函数返回的指针赋给info*/ if(info=NULL) printf(对不起,没有该航班号!n); else p=info-order; if(p!=NULL) printf(客户姓名 订票数额 舱位等级n); while(p) printf(%st%8dt%dn,p-name,p-Book_num,p-grade); p=p-next; /while /if else printf(该航线没有客户信息!n); /ViewlinkL
16、inkList *InsertLink(LinkList *head,int amount,char name,int grade,int *seat_num)/*增加订票乘员名单域的客户信息*/ LinkList *q,*p;int j; q=head; p=(LinkList *)malloc(sizeof(LinkList); /*向系统要空间存放新增的乘员名单域*/ if(!p) printf(nOut of memory!n); return NULL; strcpy(p-name,name); p-Book_num=amount; p-grade=grade; p-next=NUL
17、L; for(j=0;jnumj=(*seat_num)+;/*记录该乘员座位号,若其退票则可以回收对应的座位号*/ if(head=NULL) /*若原无订票客户信息*/ head=p;p-next=NULL; else /*新增订票客户从订票乘员链表前面插入*/ head=p; p-next=q; return head; /*返回链表头指针,该头指针此时指向新增乘员名单域*/LinkQueue AddQueue(LinkQueue q,char name,int amount)/*增加排队等候的客户名单域*/ Queueptr p; p=(Queueptr)malloc(sizeof(Q
18、Node);/*向系统要空间存储排队客户*/ strcpy(p-name,name); p-Wnumber=amount; p-next=NULL; if(q.front=NULL)/*若原排队等候客户名单域为空*/ q.front=p; else q.rear-next=p; q.rear=p; return q;void order() /*办理订票业务*/ struct airline *info; int amount,grade; char name10; info=find(); if(info=NULL)printf(对不起,没有该航班号);return ;/*根据客户提供的航班
19、号进行查询,如为空,退出该模块*/ printf(请输入你订票所需要的数量:); scanf(%d,&amount); if(amountinfo-total_num)/*若客户订票额超过乘员定票总额,退出*/ printf(n对不起,您输入的票的数量已经超过乘员定额!); return; if(amountremain_num)/*若客户订票额末超过余票量,订票成功并等记信息*/ int i,j; j=0; printf(请输入您的姓名(订票客户):); scanf(%s,name); printf(请输入%s票的舱位等级:,name); scanf(%d,&grade); for(i=1;
20、itotal_num;i+)/*依次输出该订票客户的座位号*/ if(j=amount) break; while(info-seati=0)/*查找未被定去的座位号*/ info-seati=info-seati-1+1; printf(%s的座位号是:%dn,name,info-seati);/*将还没被订走的座位号发给订票客户*/ seat_numj=info-seati;/*将刚发出的座位号存放到数组seat_num再存放到订票乘员名单域中,为其退票回收座位号做准备*/ j+; info-order=InsertLink(info-order,amount,name,grade,sea
21、t_num);/*在订票乘员名单域中添加客户信息*/ info-remain_num-=amount;/*该航线的余票量应减掉该客户的订票量*/ printf(n订票成功,祝你乘坐愉快!n); else /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/ char r; printf(n已经没有更多的票,您需要排队等候吗?(Y/N); r=getch(); printf(%c,r); if(r=Y|r=y) printf(n请输入您的姓名(排队订票客户):); scanf(%s,name); info-wait=AddQueue(info-wait,name,amount);/*在
22、排队等候乘员名单域中添加客户信息*/ printf(n注册成功!n); else printf(n欢迎您下次再次订购!n); void refund() /*退票模块*/ struct airline *info; QNode *m,*back,*n,*p; int grade; LinkList *p1,*p2,*head; char cusname10; info=find(); if(info=NULL) printf(对不起,没有该航班号);return;/*调用查询函数,根据客户提供的航线进行搜索*/ head=info-order; p1=head; printf(请输入你的姓名(
23、退票客户):); scanf(%s,cusname); while(p1!=NULL) /*根据客户提供的姓名到订票客户名单域进行查询*/ if(!strcmp(cusname,p1-name) break; p2=p1;p1=p1-next; if(p1=NULL) printf(对不起,你没有订过票!n);return;/*若未找到,退出本模块*/ else/*若信息查询成功,删除订票客户名单域中的信息*/ int j,k; for(j=0;jBook_num;j+)/*将退票座位号初始为0即未被预定*/ k=p1-numj; info-seatk=0; if(p1=head) head=
24、p1-next; else p2-next=p1-next; info-remain_num+=p1-Book_num; grade=p1-grade; printf(%s成功退票!n,p1-name); free(p1); info-order=head;/*重新将航线名单域指向订票单链表的头指针 */ n=(info-wait).front;/*n指向排队等候名单队列的头结点*/ p=(info-wait).rear;/*p指向排队等候名单队列的尾结点*/ m=n;/*m为当前满点条件的排队候补名单域*/ while(m) if(m=(info-wait).front) if(info-r
25、emain_num=info-wait.front-Wnumber)/*若满足条件者为头结点*/ int i,j; info-wait.front=m-next; printf(%s订票成功!n,m-name); for(i=1,j=0;itotal_num;i+)/*依次输出该等候替补客户的座位号*/ if(j=m-Wnumber) break; while(info-seati=0) info-seati=info-seati-1+1; printf(%s的座位号是:%dn,m-name,info-seati); seat_numj=info-seati; j+; /*while*/ /*
26、for*/ info-remain_num-=m-Wnumber; info-order=InsertLink(info-order,m-Wnumber,m-name,grade,seat_num);/*插入到订票客户名单链表中*/ free(m); m=info-wait.front; /*if*/ else back=m; m=m-next; /*if*/ else if(info-remain_num)=(m-Wnumber)/*若满足条件者不为头结点*/ int i,j; back-next=m-next; printf(%s订票成功!n,m-name); for(i=1,j=0;it
27、otal_num;i+)/*依次输出该替补订票客户的座位号*/ if(j=m-Wnumber) break; while(info-seati=0)info-seati=info-seati-1+1; printf(%s的座位号是:%dn,m-name,info-seati); seat_numj=info-seati; j+; /*while*/ /*for*/ info-remain_num-=m-Wnumber; info-order=InsertLink(info-order,m-Wnumber,m-name,grade,seat_num);/*插入到订票客户名单链表中*/ free(
28、m); m=back-next; /*if*/ else back=m; m=m-next; /*else*/ /*else if*/ /*while*/ /*refund*/int menu()/*菜单界面*/ int a; char b20; printf(ntt航空客运订票系统n); printf(=n); printf(1.查看航线信息: |n); printf(2.查看已订票客户信息: |n); printf(3.查询航线: |n); printf(4.办理订票业务: |n); printf(5.办理退票业务: |n); printf(6.退出系统: |n); printf(=n); do printf(请选择你需要的功能(例如:你想办理订票业务就
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1