本系统可实现航空客运订票的主要业务活动。例如,浏览和查询航线、客票预订和办理 退等
要求:
(1)航线管理,每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行 周日(星 期几)、乘员定额、余票量
(2)客户管理。有关订票的客户信息(包括姓名、订票量、舱位等级(1,2 和 3) 及等候替补的客户名单(包括姓名、所需票量)
(3)系统实现的主要操作和功能。系统实现的主要操作和功能如下
①查询航线。根据旅客提出的终点站名输出下列信息:航班号、飞机号、飞行日期 、余票额,测试航线至少 5 个;
②承办订票业务。根据客户提出的要求(航班号、订票数额)查询该航班票额情况 ,若有余票,则为客户办理订票手续,输出座位号:若已满或者余票少于订票额,则需要重新 询问客户要求:若需要,可等待排队候补,测试订票订单准备 10 个
③承办退票业务。根据客户提供的情况(日期、航班),为客户办理退票手续,然后查 询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足该客户的要求 则为其办理订票手续,否则依次询问其他排队候补的客户。
1、主界面设计
为了实现“航空订票系统”的各项功能,首先设计一个含有多个菜单项的主控菜单子程序,以链接系统的各项子功能,方便用户使用本系统。本系统主控菜单运行界面如图:
2、数据结构设计
本系统采用链表存储航班信息以及各航班乘客的信息。
3、功能设计
根据需求分析,设计以下 6 个功能模均:
(1)查询总航班。乘客可以查看所有航班信息,方便乘客订票或者退票。
(2)查询航线。顾客可以根据起点和终点查看是否有飞往这两地的航班
(3)订票。输入航班编号,需要定的票数,你想要定的舱位等级,姓名身份证号,星期几这些信息,如果该飞机该舱位还有空余,则订票成功,并输出乘客所有的机位。如果位置不够,则询问乘客意愿,是否愿意候补机票。
(4)退票。由乘客输入的姓名,身份证号,以及飞行的日期,若输入的信息完全对应,则退票成功。否则输出信息不正确。当乘客退票成功之后系统就会更新数据匹配当前候补队伍里面是否有符合条件的乘客。
(5)录入与删除。可以根据情况进行管理员操作,对航班进行录入与删除的操作
(6)退出。退出整个航班订票系统
4、概要设计
1、 根据功能需求设计,设计 14 函数),各函数功能及函数头设计如下:
void printfall(Phangban allflight);//输出所有航班信息
void initflight();//初始化航班
void initHList(HList &waitrank);//初始化候补链表
void initCList(CList &cusLinkList);//初始化乘客链表
int panduan(Phangban allflight,char id[]);//判断是否重复录入
Phangban find();//根据航班号查找航班
void chaxun();//根据起始地查询航班
void dingpiao();//订票系统
void tuipiao();//退票系统
void insanddel();//录入与删除
void addCList(CList &head,int need,char name[],char id[],char day[],int grade);
//增加乘客信息
void houbu(HList &head,char name[],char id[],int need);
//乘客进入候补队伍里
void Houbu(Phangban &info,HList &waitrank,int les,int grade)
//乘客退票之后对候补队伍进行匹配
2、程序结构调用关系(示例)如下:
三、详细设计
1、数据结构的定义
(1)乘客链表
typedef struct CNode{
char name[50];//乘客姓名
char id[30];//乘客身份证
char day[20];//出行日期
int num;//订票数
int rank;//客舱等级
CNode *next;
}CNode,*CList;//乘客节点
(2)乘客候补队列
typedef struct HNode{
char name[50];//候补乘客姓名
char id[30];//候补乘客身份证
int num;//候补票数
HNode *next;
}HNode,*HList;//候补乘客节点
typedef struct Queue{
HList front;
HList rear;
}LinkQueue;
(3)航班链表节点
typedef struct hangban{
char begin[20];//起点
char end[20];//终点
char hbid[20];//航班编号
char planeid[20];//飞机编号
char day[20];//飞行日期
int maxnum;//成员定额
int less;//总余票
int lessrank1;//一等余票
int lessrank2;//二等余票
int lessrank3;//三等余票
hangban *next;//下一个节点
CList cusLinkList;//乘客名单域,指向乘客名单链表的头指针
LinkQueue waitrank1;//候补一等队列
LinkQueue waitrank2;//候补二等队列
LinkQueue waitrank3;//候补三等队列
}hangban,hangbanNode,*Phangban;
(4)全局变量定义
Phangban allflight;//全局航班节点变量
2.设计思路
源代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct CNode{
char name[50];//乘客姓名
char id[30];//乘客身份证
char day[20];//出行日期
int num;//订票数
int rank;//客舱等级
CNode *next;
}CNode,*CList;//乘客节点
typedef struct HNode{
char name[50];//候补乘客姓名
char id[30];//候补乘客身份证
int num;//候补票数
HNode *next;
}HNode,*HList;//候补乘客节点
typedef struct Queue{
HList front;
HList rear;
}LinkQueue;
typedef struct hangban{
char begin[20];//起点
char end[20];//终点
char hbid[20];//航班编号
char planeid[20];//飞机编号
char day[20];//飞行日期
int maxnum;//成员定额
int less;//总余票
int lessrank1;//一等余票
int lessrank2;//二等余票
int lessrank3;//三等余票
hangban *next;//下一个节点
CList cusLinkList;//乘客名单域,指向乘客名单链表的头指针
LinkQueue waitrank1;//候补一等队列
LinkQueue waitrank2;//候补二等队列
LinkQueue waitrank3;//候补三等队列
}hangban,hangbanNode,*Phangban;
Phangban allflight;//全局节点变量
void printfall(Phangban allflight);
void inithangban();//初始化航班
Phangban find();
void chaxun();
void dingpiao();
void tuipiao();
void insanddel();
void addCList(CList &head,int need,char name[],char id[],char day[],int grade);
void houbu(HList &head,char name[],char id[],int need);
hangban flight1[100]={
{"上海","北京","1","A1111","星期一",5,5,2,2,1},
{"北京","武汉","2","B8942","星期三",200,200,50,100,50},
{"武汉","广州","3","C5465","星期无",200,200,50,100,50},
{"广州","福州","4","D5645","星期六",200,200,50,100,50},
{"福州","长沙","5","E4986","星期二",200,200,50,100,50},
{"长沙","武汉","6","F6564","星期四",200,200,50,100,50},
{"杭州","武汉","7","G1575","星期五",200,200,50,100,50},
{"郑州","武汉","8","H6533","星期三",200,200,50,100,50},
{"南京","武汉","9","I4587","星期二",200,200,50,100,50},
{"西安","武汉","10","J8526","星期一",200,200,50,100,50},
{"重庆","武汉","11","K2486","星期四",200,200,50,100,50},
{"成都","武汉","12","L4875","星期日",200,200,50,100,50},
{"昆明","武汉","13","M9812","星期六",200,200,50,100,50},
{"贵阳","武汉","14","N1683","星期二",200,200,50,100,50},
};
void initCList(CList &cusLinkList)
{
CList q=cusLinkList;
cusLinkList=(CNode*)malloc(sizeof(CNode));
cusLinkList->next=NULL;
}
void initQueue(LinkQueue &waitrank)
{
HList p = (HList)malloc(sizeof(HNode));
if(p==NULL)
{
cout<<"内存不足"<<endl;
return;
}
p->next=NULL;
waitrank.front=waitrank.rear=p;
}
void initHList(HList &waitrank)
{
HList p=waitrank;
waitrank=(HNode*)malloc(sizeof(HNode));
if(waitrank==NULL)
{
cout<<"内存不足"<<endl;
return;
}
waitrank->next=NULL;
}
void initflight()
{
allflight = (hangban*)malloc (sizeof(hangban));
if(allflight==NULL)exit(0);
allflight->next=NULL;
Phangban p=allflight,q;
for(int i=0;i<14;i++)
{
q=(hangban*)malloc(sizeof(hangban));
if(q==NULL)return;
strcpy(q->begin,flight1[i].begin);
strcpy(q->end,flight1[i].end);
strcpy(q->hbid,flight1[i].hbid);
strcpy(q->planeid,flight1[i].planeid);
strcpy(q->day,flight1[i].day);
q->maxnum=flight1[i].maxnum;
q->less=flight1[i].less;
q->lessrank1=flight1[i].lessrank1;
q->lessrank2=flight1[i].lessrank2;
q->lessrank3=flight1[i].lessrank3;
initCList(q->cusLinkList);
initQueue(q->waitrank1);
initQueue(q->waitrank2);
initQueue(q->waitrank3);
q->next=p->next;
p->next=q;
}
}
void printfall(Phangban allflight)
{
Phangban p;
p = allflight->next;
printf("起点 终点 航班号 飞机号 飞行日期 乘员定额 总余票 一等余 二等余 三等余\n");
while(p)
{
printf("%4s %4s %2s %5s %8s %8d %8d%8d%8d%5d\n",p->begin,p->end,p->hbid,p->planeid,p->day,p->maxnum,p->less,p->lessrank1,p->lessrank2,p->lessrank3);
p=p->next;
}
printf("\n\n");
}
void chaxun()
{
char begin[20];
char end[20];
int flag=0;
printf("请输入起点站名:");
cin>>begin;
cout<<endl;
printf("请输入终点站名:");
cin>>end;
cout<<endl;
Phangban p;
p = allflight->next;
printf("起点 终点 航班号 飞机号 飞行日期 乘员定额 总余票 一等余 二等余 三等余\n");
while(p)
{
if((strcmp(begin,p->begin)==0)&&(strcmp(end,p->end)==0))
{
flag=1;
printf("%4s %4s %2s %5s %8s %5d %5d %5d %5d\n",p->begin,p->end,p->hbid,p->planeid,p->day,p->maxnum,p->less,p->lessrank1,p->lessrank2,p->lessrank3);
}
p=p->next;
}
if(flag==0)cout<<"该航班不存在!";
cout<<endl<<endl;
}
void houbu(HList &head,char name[],char id[],int need)
{
HList q = (HNode*)malloc(sizeof(HNode));
strcpy(q->name,name);
strcpy(q->id,id);
q->num=need;
q->next=head->next;
head->next=q;
}
LinkQueue enqueue(LinkQueue &q,char name[],char id[],int need)
{
HList new1=(HNode*)malloc(sizeof(HNode));
strcpy(new1->name,name);
strcpy(new1->id,id);
new1->num=need;
new1->next=NULL;
q.rear->next=new1;
q.rear = new1;
return q;
}
void dingpiao()
{
char name[30];
char id[30];
char day[30];
int need,grade;
int num;
Phangban info;
info = find();
if(info==NULL)
{
cout<<"不存在该航班!"<<endl;
return;
}
cout<<"请输入您想要订的舱位等级(1/2/3):";
while(true)
{
cin>>grade;
if(grade<1||grade>3)cout<<"输入有误,请重新输入:";
else
{
if(grade = 1)num=info->lessrank1;
else if(grade = 2)num=info->lessrank2;
else num=info->lessrank3;
break;
}
}
cout<<"请输入您需要订的票数:";
while(true)
{
cin>>need;
if(need<1||need>info->less)cout<<"输入有误,请重新输入:";
else break;
}
if(need<=num)//余票够
{
for(int i=1;i<=need;i++){
cout<<"请输入您的姓名:";
cin>>name;
cout<<endl<<"请输入您的身份证号:";
cin>>id;
cout<<endl<<"请输入您的飞行日期:";
cin>>day;
CList head = info->cusLinkList;
addCList(head,1,name,id,day,grade);
printf("%s 的座位号是:%d\n",name,info->maxnum-info->less+i);
}
info->less -= need;
if(grade == 1)info->lessrank1 -= need;
else if(grade == 2)info->lessrank2 -= need;
else info->lessrank3 -= need;
cout<<"订票成功"<<endl;
}
else
{
char vis;
cout<<"该舱位的余票不足,请问您是否需要候补(Y/N)"<<endl;
while(true)
{
cin>>vis;
if(vis!='Y'&&vis!='N')cout<<"输入错误,请重新输入:";
else
{
if(vis=='Y')
{
for(int i=1;i<=need;i++){
cout<<"请输入您的姓名:";
cin>>name;
cout<<endl<<"请输入您的身份证号:";
cin>>id;
if(grade==1)
{
info->waitrank1= enqueue(info->waitrank1,name,id,1);
}
else if(grade == 2)
{
info->waitrank2= enqueue(info->waitrank2,name,id,1);
}
else info->waitrank3=enqueue(info->waitrank3,name,id,1);
cout<<"排队成功!"<<endl;
}
}
break;
}
}
}
}
void addCList(CList &head,int need,char name[],char id[],char day[],int grade)
{
CList new1 = (CNode*)malloc(sizeof(CNode));
if(new1==NULL)
{
cout<<"内存不足"<<endl;
return;
}
strcpy(new1->name,name);
strcpy(new1->id,id);
strcpy(new1->day,day);
new1->num = need;
new1->rank = grade;
new1->next = head->next;
head->next=new1;
}
Phangban find()
{
char number[20];
cout<<"请输入航班编号: ";
cin>>number;
Phangban p = allflight->next;
while(p)
{
if(!strcmp(number,p->hbid))return p;
p=p->next;
}
return NULL;
}
void Houbu(Phangban &info,LinkQueue &waitrank,int les,int grade)
{
HList p=waitrank.front;
while(p)
{
if(p->num<=les)
{
printf("%s候补成功",p->name);
CList head = info->cusLinkList;
addCList(head,p->num,p->name,p->id,info->day,grade);
printf("您的座位号是:%d\n",info->maxnum-info->less+1);
les-=p->num;
info->less-=p->num;
}
p=p->next;
}
if(grade==1)info->lessrank1=les;
else if(grade==2)info->lessrank2=les;
else info->lessrank3=les;
}
void tuipiao()
{
Phangban info;
int grade;
CList p1,p2,head;
char name[20];
char id[20];
char day[20];
info=find();
if(info==NULL)
{
cout<<"退票失败,该航班不存在!"<<endl;
}
head=info->cusLinkList;
p1=head->next;
cout<<"请输入姓名:";
cin>>name;
cout<<endl<<"请输入身份证号:";
cin>>id;
cout<<endl<<"请输入飞行日期:";
cin>>day;
p2=head;
while(p1)
{
if(strcmp(name,p1->name)==0&&(strcmp(id,p1->id)==0&&(strcmp(day,p1->day)==0)))break;
p2=p1;
p1=p1->next;
}
if(p1==NULL)
{
cout<<"对不起,您没有订过票,或者输入信息有误!"<<endl;
return;
}
else
{
grade = p1->rank;
p2->next=p1->next;
info->less+=p1->num;
printf("%s 退票成功!\n",p1->name);
if(grade == 1)
{
info->lessrank1+=p1->num;
Houbu(info,info->waitrank1,info->lessrank1,grade);
}
else if(grade == 2)
{
info->lessrank2+=p1->num;
Houbu(info,info->waitrank2,info->lessrank1,grade);
}
else
{
info->lessrank3+=p1->num;
Houbu(info,info->waitrank3,info->lessrank1,grade);
}
free(p1);
}
}
int panduan(Phangban allflight,char id[])
{
Phangban p = allflight;
while(p)
{
if(!strcmp(id,p->hbid))
{
return 0;
}
p=p->next;
}
return 1;
}
void insanddel()
{
int vis;
cout<<"请选择录入(1)或者删除(0):";
cin>>vis;
if(vis==1)
{
Phangban q;
Phangban p = allflight;
int y=1;
while(y)
{
q=(hangbanNode*)malloc(sizeof(hangban));
if(q==NULL)return;
cout<<"请输入航班编号"<<endl;
cin>>q->hbid;
int t=panduan(allflight,q->hbid);
if(t==0)
{
printf("该航班编号已存在,请重新输入航班编号\n");
continue;
}
cout<<"请输入起点站名:";
cin>>q->begin;
cout<<endl<<"请输入终点站名:";
cin>>q->end;
cout<<endl<<"请输入航班编号:";
cin>>q->hbid;
cout<<endl<<"请输入飞机编号:";
cin>>q->planeid;
cout<<endl<<"请输入飞行日期:";
cin>>q->day;
cout<<endl<<"请输入乘客定额:";
cin>>q->maxnum;
q->less = q->maxnum;
cout<<endl<<"请输入一等余票:";
cin>>q->lessrank1;
cout<<endl<<"请输入二等余票:";
cin>>q->lessrank2;
q->lessrank3=q->less-q->lessrank1-q->lessrank2;
initCList(q->cusLinkList);
initQueue(q->waitrank1);
initQueue(q->waitrank2);
initQueue(q->waitrank3);
q->next=p->next;
p->next=q;
cout<<endl<<"是否继续录入航班信息(1/0)";
cin>>y;
}
}
else
{
char id[20];
cout<<"请输入航班id:";
cin>>id;
Phangban pre=allflight;
Phangban p=pre->next;
while(p)
{
if(!strcmp(id,p->hbid))
{
pre->next=p->next;
free(p);
}
pre=p;
p=p->next;
}
}
}
void menu()
{
int res;
printf("\n\n");
printf(" 航空订票系统\n");
printf("***********************************************************\n");
printf(" 1. 总航班 \n");
printf(" 2. 查询航线 \n");
printf(" 3. 订票 \n");
printf(" 4. 退票 \n");
printf(" 5. 录入与删除 \n");
printf(" 6. 退出 \n");
printf("***********************************************************\n");
printf(" 输入需要办理的业务:");
scanf("%d",&res);
switch (res)
{
case 1:
printfall(allflight);//打印全部航班信息
menu();
break;
case 2:
chaxun();//查询航班
menu();
break;
case 3:
dingpiao();//订票
menu();
break;
case 4:
tuipiao();//退票
menu();
break;
case 5:
insanddel();//管理员操作
menu();
break;
default:
exit(0);
}
}
int main()
{
initflight();//初始化航班链表
menu();
return 0;
}