數據結構課程設計:17、售票處的服務系統(***)

                                                       售票處的服務系統(***)

要用到文件操作,使用CodeBlocks,建議放到同一目錄下

[問題描述]

航空客運訂票的業務活動包括:查詢航線、客票預訂和辦理退票等。試設計一個航空客運訂票系統,以使上述業務可以藉助計算機來完成。

[系統要求]

  1. 設民航售票處的計算機系統可以爲客戶提供下列各項服務:
  2. 查詢航線:根據旅客提出的終點站名輸出下列信息:航班號、飛機號、星期幾飛行,最近一天航班的日期和餘票額;
  3. 承辦訂票業務:根據客戶提出的要求(日期、航班號、訂票數額)查詢該航班票額情況,若尚有餘額,則爲客戶辦理訂票手續,輸出座位號;若已滿員或餘票額少於訂票額,則需要重新詢問客戶要求。若需要,可預約登記排隊等候。
  4. 承辦退票業務:根據客戶提供的情況(日期、航班、退票數額),爲客戶辦理退票手續,然後查詢該航班是否有人預約登記,首先詢問排在第一的客戶,若所退票額能滿足他的要求,則爲他辦理訂票手續,否則依次詢問其他排隊預約的客戶。

[測試數據]

由學生任意指定,但報告上要求寫出多批數據測試結果。

[實現提示]

每條航線應包含的信息有:終點站名、航班號、飛機號、飛行日期(星期幾)、乘員定額、餘票額、已訂票的客戶名單(包括姓名、訂票額、座位號)和預約登記的客戶名單(包括日期、姓名、所需票額)。這最後兩項顯然是一個線性表和一個隊列。爲查找方便、已訂票客戶的線性表應按客戶姓名有序,並且,爲插入和刪除方便,應以鏈表作存儲結構。由於預約人數無法預料,隊列也應以鏈表作存儲結構。整個系統需彙總各條航線的情況登錄在一張線性表上,由於航線基本不變,可採用順序存儲結構,並按航班有序或按終點站名有序。每條航線是這張表上的一個記錄,包含上述八個域,其中乘員名單域爲指向乘員名單鏈表的頭指針,預約登記客戶名單域爲分別指向隊頭和隊尾的指針。

[文件內容]

                           

[設計思路]

 

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

[簡單展示]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章