17、售票处的服务系统(***)

                                                       售票处的服务系统(***)

此报告要用到文件操作,本人使用CodeBlocks,建议放到同一目录下

17、售票处的服务系统(***)

[问题描述]

航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。

[系统要求]

  1. 设民航售票处的计算机系统可以为客户提供下列各项服务:
  2. 查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
  3. 承办订票业务:根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。若需要,可预约登记排队等候。
  4. 承办退票业务:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户。

[测试数据]

由学生任意指定,但报告上要求写出多批数据测试结果。

[实现提示]

每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。

[文件内容]

                           17、售票处的服务系统(***)

[设计思路]

 

  1. 从文件读入航班信息
  2. 结构使用栈和队列
  3. 链式储存乘客信息
  4. 处理座位关系

[代码及注释]

#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;
}

[简单展示]

17、售票处的服务系统(***)