售票处的服务系统(***)
要用到文件操作,使用CodeBlocks,建议放到同一目录下
[问题描述]
航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
[系统要求]
- 设民航售票处的计算机系统可以为客户提供下列各项服务:
- 查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
- 承办订票业务:根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。若需要,可预约登记排队等候。
- 承办退票业务:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户。
[测试数据]
由学生任意指定,但报告上要求写出多批数据测试结果。
[实现提示]
每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。
[文件内容]
[设计思路]
- 从文件读入航班信息
- 结构使用栈和队列
- 链式储存乘客信息
- 处理座位关系
[代码及注释]
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
#define MAXSIZE 111 /*最大航班数*/
#define MAXNUM 3 /*最大座位数*/
int flag=0; /*判断结束标志*/
//结构
typedef struct QNode{
string name; /*乘客姓名*/
string id; /*乘客身份证*/
int num; /*乘客排队等待号*/
struct QNode *next; /*指针域*/
}QNode,*QueuePtr; /*结点类型,结点指针类型*/
typedef struct{
QueuePtr Front; /*头指针*/
QueuePtr Real; /*尾指针*/
}LinkQueue; /*链队类型*/
typedef struct people{
string name; /*乘客姓名*/
string id; /*乘客身份证*/
int seat; /*乘客座位*/
people *next; /*指针域*/
}People,*LinkList; /*结点类型,结点指针类型*/
typedef struct{
string name; /*飞机号*/
string id; /*航班号*/
string to; /*目的地*/
string date; /*日期*/
int sum; /*总座位数*/
int use; /*使用的座位数*/
int remain; /*剩余的座位数*/
int waitnum; /*等待总数*/
LinkList L; /*购票的乘客,使用链表*/
LinkQueue Q; /*排队等待的乘客,使用链队*/
}Single; /*结点类型*/
typedef struct{
Single air[MAXSIZE]; /*MAXSIZE个飞机结点*/
int num; /*航班总数*/
}FLight; /*使用顺序表表示航班系统*/
//子函数
void SinglePrint(FLight &F); /*打印单一航班信息*/
bool Read(FLight &F); /*从文件读入数据并初始化*/
bool EmptyQueue(FLight &F,int index); /*判断队列是否为空*/
void EnQueue(FLight &F,int index); /*进队*/
void DeQueue(FLight &F,int index,LinkList &S);/*出队*/
void SingleBooking(FLight &F,int index); /*单一乘客订票*/
void Booking(FLight &F); /*订票总操作*/
void SingleBack(FLight &F,int index); /*单一乘客退票*/
void Back(FLight &F); /*退票总操作*/
void Print(FLight &F); /*打印全部航班信息*/
void Show(FLight &F); /*打印具体航班信息*/
void Menu(FLight &F); /*操作汇总*/
//具体内容
void SinglePrint(FLight &F)
{
cout<<"输入目的地:";
string TO;
cin>>TO;
int vis=0; /*判断标志*/
for(int k=1;k<=F.num;++k)
if(F.air[k].to==TO)
{
vis=1;
break;
}
if(!vis)
{
cout<<"没有查询到此航班"<<endl;
return;
}
cout<<" ---------------------------------------------------------------------"<<endl;
cout<<"|查询到目的地为"<<TO<<"的航班如下! |"<<endl;
cout<<"| 飞机号"<<" 航班号"<<" 目的地"<<" 日期"<<" 总座位数"<<" 剩余座位数"<<" 排队等待数 |"<<endl;
for(int k=1;k<=F.num;++k)
if(F.air[k].to==TO)
cout<<"| "<<F.air[k].name<<" "<<F.air[k].id<<" "<<F.air[k].to<<" "<<F.air[k].date<<" "
<<F.air[k].sum<<" "<<F.air[k].remain<<" "<<F.air[k].waitnum<<" |"<<endl;
cout<<" ---------------------------------------------------------------------"<<endl;
}
bool Read(FLight &F)
{
ifstream in("in.txt");
int k=1;
while(1)
{
in>>F.air[k].name>>F.air[k].id>>F.air[k].to>>F.air[k].date;
if(F.air[1].name=="")
{
cout<<"文件读取失败"<<endl;
cout<<"-------------------------------------"<<endl;
return false;
}
F.air[k].sum=MAXNUM;
F.air[k].use=0;
F.air[k].remain=MAXNUM;
F.air[k].waitnum=0;
F.air[k].L=new People;
F.air[k].L->next=NULL;
F.air[k].Q.Front=F.air[k].Q.Real=new QNode;
F.air[k].Q.Front->next=NULL;
/*初始化*/
if(F.air[k].name=="")break;
++k;
}
F.num=k-1; /*航班数量*/
cout<<"文件读取成功"<<endl;
return true;
}
bool EmptyQueue(FLight &F,int index)
{
if(F.air[index].Q.Front==F.air[index].Q.Real)return true;
return false;
}
void EnQueue(FLight &F,int index)
{
cout<<"输入登机人的姓名与身份证号(空格隔开):";
QueuePtr S=new QNode;
cin>>S->name>>S->id;
S->next=NULL;
F.air[index].waitnum++;
F.air[index].Q.Real->next=S;
F.air[index].Q.Real=S;
S->num=F.air[index].waitnum;
cout<<endl;
cout<<"恭喜您,预约成功,您的信息如下,请牢记!"<<endl;
cout<<"--------------------"<<endl;
cout<<"|飞机号:"<<F.air[index].name<<endl;
cout<<"|航班号:"<<F.air[index].id<<endl;
cout<<"|姓 名:"<<S->name<<endl;
cout<<"|身份证:"<<S->id<<endl;
cout<<"|等待号:"<<S->num<<endl;
cout<<"--------------------"<<endl;
}
void DeQueue(FLight &F,int index,LinkList &S)
{
QueuePtr T=F.air[index].Q.Front->next;
while(T)
{
T->num--;/*该乘客后面的乘客等待号减1*/
T=T->next;
}
T=F.air[index].Q.Front->next;
S->name=T->name;
S->id=T->id;
F.air[index].Q.Front->next=T->next;
if(T==F.air[index].Q.Real)
F.air[index].Q.Real=F.air[index].Q.Front;
/*如果出队的是队尾元素,重新赋值*/
delete T;
}
void SingleBooking(FLight &F,int index)
{
cout<<"输入登机人的姓名与身份证号(空格隔开):";
LinkList S=new People;
S->next=NULL;
cin>>S->name>>S->id;
LinkList P=F.air[index].L;
while(P->next)P=P->next;/*找到链表队尾指针*/
F.air[index].use++;
F.air[index].remain--;
P->next=S;
P=S; /*尾插法*/
S->seat=F.air[index].use;
cout<<endl;
cout<<"恭喜您,订票成功,您的信息如下,请妥善保存!"<<endl;
cout<<"--------------------"<<endl;
cout<<"|飞机号:"<<F.air[index].name<<endl;
cout<<"|航班号:"<<F.air[index].id<<endl;
cout<<"|姓 名:"<<S->name<<endl;
cout<<"|身份证:"<<S->id<<endl;
cout<<"|座位号:"<<S->seat<<endl;
cout<<"--------------------"<<endl;
}
void Booking(FLight &F)
{
Print(F);
cout<<endl;
cout<<" <订票业务>"<<endl<<endl;
string DATE,ID;
int SUM;
cout<<"输入日期、航班号及订票数(空格隔开):";
cin>>DATE>>ID>>SUM;
int index=0;
for(int i=1;i<=F.num;++i)
if(F.air[i].id==ID&&F.air[i].date==DATE)
{
index=i;
break;
}
if(!index)
{
cout<<"<<<<没有此航班"<<endl;
return;
}
if(F.air[index].remain>=SUM)
while(SUM--)SingleBooking(F,index);
else
{
cout<<"<<<<该航班余额票小于您的订票额,还剩下"<<F.air[index].remain<<"张票,是否继续购买?(y/n)";
char ch;
cin>>ch;
if(ch=='y')
{
int others=SUM-F.air[index].remain;
int k=F.air[index].remain;
while(k--)SingleBooking(F,index);
cout<<endl;
cout<<"<<<<剩下的"<<others<<"人已经自动进入预约业务"<<endl;
cout<<" <预约业务>"<<endl<<endl;
while(others--)EnQueue(F,index);
}
else return;
}
}
void SingleBack(FLight &F,int index)
{
cout<<"登机人的姓名与身份证号(空格隔开):";
string NAME,ID;
cin>>NAME>>ID;
LinkList T=F.air[index].L;
int vis=0;
while(T->next)
{
if(T->next->id==ID&&T->next->name==NAME)
{
vis=1;
LinkList p=T->next;
T->next=p->next;
F.air[index].use--;
F.air[index].remain++;
delete p;
cout<<"<<<<退票成功"<<endl;
break;
}
T=T->next;
}
QueuePtr p=F.air[index].Q.Front;
if(!vis)/*从已经购票的乘客没有找到要退票的乘客,进入预约订票寻找*/
{
while(p->next)
{
if(p->next->id==ID&&p->next->name==NAME)
{
vis=1;
QueuePtr t=p->next;
while(t){t->num--;t=t->next;}/*此人后面的等待号减1*/
t=p->next;
p->next=t->next;
if(t==F.air[index].Q.Real)
F.air[index].Q.Real=F.air[index].Q.Front;
delete t;
cout<<"<<<<退票成功"<<endl;
break;
}
p=p->next;
}
if(!vis)cout<<"<<<<没有该乘客,输入信息有误"<<endl;
}
else
{
if(!EmptyQueue(F,index))
{
cout<<"已经有人退票!"<<endl;
cout<<"姓名为"<<F.air[index].Q.Front->next->name;
cout<<"身份证为"<<F.air[index].Q.Front->next->id<<"的用户现在是否订票?(y/n)";
char op;
cin>>op;
if(op!='y')return;
LinkList S=new People;
S->next=NULL;
DeQueue(F,index,S);
F.air[index].use++;
F.air[index].remain--;
LinkList P=F.air[index].L;
while(P->next)P=P->next;
P->next=S;
P=S;/*尾插法*/
F.air[index].waitnum--;/*总等待人数减1*/
for(int i=1;i<=MAXNUM;++i)
{
LinkList p=F.air[index].L->next;
while(p)
{
if(p->seat==i)
break;
p=p->next;
}
if(!p)
S->seat=i;
}/*为新订票的乘客分配座位*/
cout<<"订票成功,您的信息如下"<<endl;
cout<<"----------------------------------"<<endl;
cout<<"姓名"<<S->name<<endl;
cout<<"身份证"<<S->id<<endl;
cout<<"航班"<<F.air[index].id<<endl;
cout<<"座位号"<<S->seat<<endl;
cout<<"----------------------------------"<<endl;
}
}
}
void Back(FLight &F)
{
Print(F);
cout<<endl;
cout<<" <退票业务>"<<endl<<endl;
string DATE,ID;
int SUM;
cout<<"输入日期、航班号及退票数(空格隔开):";
cin>>DATE>>ID>>SUM;
int index=0;
for(int i=1;i<=F.num;++i)
if(F.air[i].id==ID&&F.air[i].date==DATE)
{
index=i;
break;
}
if(!index){cout<<"<<<<没有此航班"<<endl;return;}
while(SUM--)SingleBack(F,index);
}
void Print(FLight &F)
{
cout<<" ---------------------------------------------------------------------"<<endl;
cout<<"| 航班总数:"<<F.num<<" |"<<endl;
cout<<"| 飞机号"<<" 航班号"<<" 目的地"<<" 日期"<<" 总座位数"<<" 剩余座位数"<<" 排队等待数 |"<<endl;
for(int k=1;k<=F.num;++k)
cout<<"| "<<F.air[k].name<<" "<<F.air[k].id<<" "<<F.air[k].to<<" "<<F.air[k].date<<" "
<<F.air[k].sum<<" "<<F.air[k].remain<<" "<<F.air[k].waitnum<<" |"<<endl;
cout<<" ---------------------------------------------------------------------"<<endl;
}
void Show(FLight &F)
{
for(int k=1;k<=F.num;++k)
{
cout<<"--------------------航班号:"<<F.air[k].id<<"--------------------"<<endl<<endl;
cout<<" <已订票的乘客>"<<endl<<endl;
LinkList p=F.air[k].L->next;
while(p)
{
cout<<"|姓 名:"<<p->name<<endl;
cout<<"|身份证:"<<p->id<<endl;
cout<<"|座位号:"<<p->seat<<endl<<endl;
p=p->next;
}
cout<<" <预约排队的乘客>"<<endl<<endl;
QueuePtr q=F.air[k].Q.Front->next;
while(q)
{
cout<<"|姓 名:"<<q->name<<endl;
cout<<"|身份证:"<<q->id<<endl;
cout<<"|座位号:"<<q->num<<endl<<endl;
q=q->next;
}
}
}
void Menu(FLight &F)
{
cout<<" -----------------------------------"<<endl;
cout<<" | 欢迎来到航空客运订票系统 |"<<endl;
cout<<" |-----------------------------------|"<<endl;
cout<<" | 1--查询航线 |"<<endl;
cout<<" | 2--订票 |"<<endl;
cout<<" | 3--退票 |"<<endl;
cout<<" | 4--查询全部航班 |"<<endl;
cout<<" | 5--查询各航班具体情况 |"<<endl;
cout<<" | 其他--退出 |"<<endl;
cout<<" -----------------------------------"<<endl;
int op;
cout<<"输入你的选择:";
cin>>op;
switch(op)
{
case 1:SinglePrint(F);break;
case 2:Booking(F);break;
case 3:Back(F);break;
case 4:Print(F);break;
case 5:Show(F);break;
default :flag=1;cout<<"欢迎下次再来!"<<endl;
}
}
int main()
{
FLight F;
if(Read(F))
while(1)
{
Menu(F);
if(flag)break;
system("pause");
system("cls");
}
return 0;
}
[简单展示]