1. 程式人生 > >C++實現一個航空訂票程式

C++實現一個航空訂票程式

這是幫我同學寫的一個C++作業,說實話好久沒寫過C++都有些生疏了。但他們好像還沒學面向物件程式設計,所以只能是簡單的結構體和輸入輸出的邏輯。

題目要求:

編寫一個航空訂票程式:

假設一等艙5個座位,編號為1~5,經濟艙20個座位,編號為1~20

具體要求如下:

當程式開始時,提示輸入乘客姓名,一個名字只能訂一個座位,如果該名字已經訂過座位了,則提示該乘客座位已定及座位號,否則提示輸入艙位型別;

當輸入艙位型別後,如果該艙位已全部訂出,則提示此艙全部訂完,重新選擇艙位型別;否則顯示可以選擇的座位號,注意已經被訂出的座位號不能出現,提示輸入座位號;

艙位型別:只能輸入”F”或”E”,一等艙為F,經濟艙為E,如果輸入其它字元則提示輸入無效。

座位號:只能輸入前面列出可以選擇的座位號,若輸入其它則提示輸入無效。

程式可以為多個乘客訂票,直到輸入名字為”.”;

最後程式按照艙位型別與座位號排序打印出所有訂票資訊(座位號及對應乘客姓名)

最終實現效果:

這裡寫圖片描述

1,變數

不過既然提到了結構體用來儲存票的資訊(其實這就是面向物件思想的早期)。聯絡實際,一個結構體代表一個事物,結構體中的欄位代表這個事物的屬性;這樣的話,我們可以提取出兩個結構體:座位Seat和票Ticket,由於題目給定總共25個座位,意味著25張票,則將它們宣告成全域性變數。

    //座位,那麼座位有3個基本屬性:座位型別(F/E),座位編號,座位預定狀態(是否已經被預定)
struct Seat{ char type; int number; bool isReservation; }seats[25]; //票,票有兩個屬性,即票需要表明:誰預定了哪個座位,第一個Seat就是我們前面定義的那個結構體。 struct Ticket{ Seat seat; string passenger_name; }tickets[25];

2,函式

我們需要將一些輸出輸入的操作提取成函式,簡化我們的程式碼,這裡之所以將輸入提取成input()函式,是因為我們需要不斷輸入,即使出錯,所以為了便於遞迴呼叫就封裝成函式;

    bool check(string name);//檢測是否已購票
    void input();//用於執行輸入
    void printSeat(char seatType);//顯示剩餘座位
    void reservation(string name,int seatNumber,char seatType);//購票
    void printTickets(string name);//顯示已購票資訊
    void printError();//顯示輸入不合法

3,主體邏輯

main函式非常簡單,首先需要將座位和票資訊初始化,即將它們編號,預定狀態全為“未預定”,然後執行輸入,一個while迴圈,如果不符合條件就直接跳出while,執行printTickets()打印出所有的訂票資訊;

    int main()
    {
    //初始化艙位和票
    for(int i=0;i<25;i++){
        if(i<5){
            seats[i].type='F';
            seats[i].number=i+1;
        }else{
            seats[i].type='E';
            seats[i].number=i+1-5;
        }
        seats[i].isReservation=false;
        tickets[i].seat=seats[i];
        tickets[i].passenger_name=" ";
    }

    cout<<"================================================="<<endl;
    cout<<"               歡迎使用CT票務系統                   "<<endl;
    cout<<"================================================="<<endl;
    cout<<"乘客姓名:";
    while(cin>>name){
            if(name==".")break;
            if(surplusF+surplusE==0){
                cout<<"\n很遺憾所有票已購完!\n";
                break;
            }
            if(check(name)){
                cout<<"\n您已購票,購票資訊:\n"<<endl;
                printTickets(name);
            }else{
                cout<<"\n艙位型別 F:一等艙 E:經濟艙\n";
                input();
            }
            cout<<"\n乘客姓名:";
    }
    printTickets("");
    return 0;

    }

4,具體函式實現

具體的函式實現邏輯我就不講了,就看程式碼吧~

5,完整程式碼:

main.cpp

#include<iostream>
using namespace std;

//定義全域性變數,艙位,票,各型別艙位剩餘數,便於其它函式全域性訪問
int surplusF=5;
int surplusE=20;

int flag=0;
char seat_type;
int seatNumber;
string name;

//座位
struct Seat{
    char type;
    int number;
    bool isReservation;
}seats[25];

//票
struct Ticket{
    Seat seat;
    string passenger_name;
}tickets[25];

bool check(string name);//檢測是否已購票
void input();//用於執行輸入
void printSeat(char seatType);//顯示剩餘座位
void reservation(string name,int seatNumber,char seatType);//購票
void printTickets(string name);//顯示已購票資訊
void printError();//顯示輸入不合法

int main()
{
    //初始化艙位和票
    for(int i=0;i<25;i++){
        if(i<5){
            seats[i].type='F';
            seats[i].number=i+1;
        }else{
            seats[i].type='E';
            seats[i].number=i+1-5;
        }
        seats[i].isReservation=false;
        tickets[i].seat=seats[i];
        tickets[i].passenger_name=" ";
    }

    cout<<"================================================="<<endl;
    cout<<"               歡迎使用CT票務系統                   "<<endl;
    cout<<"================================================="<<endl;
    cout<<"乘客姓名:";
    while(cin>>name){
            if(name==".")break;
            if(surplusF+surplusE==0){
                cout<<"\n很遺憾所有票已購完!\n";
                break;
            }
            if(check(name)){
                cout<<"\n您已購票,購票資訊:\n"<<endl;
                printTickets(name);
            }else{
                cout<<"\n艙位型別 F:一等艙 E:經濟艙\n";
                input();
            }
            cout<<"\n乘客姓名:";
    }
    printTickets("");
    return 0;

}

bool check(string name)
{
    for(int i=0;i<25;i++){
        if(name==tickets[i].passenger_name)
            return true;
    }
    return false;
}

//負責輸入,之所以單獨寫成函式,是因為非法輸入的時候需要遞迴呼叫
void input()
{
    flag=0;
    cout<<"\n艙位型別(F/E):";
    cin>>seat_type;
    cin.get();
    switch(seat_type){
        case 'F':
            if(surplusF>0)
                cout<<"\n可選座位號:";
            printSeat('F');
            if(flag!=0)break;
            cin>>seatNumber;
            cin.get();
            reservation(name,seatNumber,'F');
            break;
        case 'E':
            if(surplusE>0)
                cout<<"\n可選座位號:";
            printSeat('E');
            if(flag!=0)break;
            cin>>seatNumber;
            cin.get();
            reservation(name,seatNumber,'E');
            break;
        default:
            printError();
            input();
            break;
        }
}

//輸出可選的座位號
void printSeat(char seatType)
{
    int full=0;
    for(int i=0;i<25;i++){
        if(seats[i].isReservation==false){
            if(seatType=='F'){
                if(surplusF==0){
                    cout<<"\n此艙位全部訂完,請重新選擇艙位型別:\n";
                    full++;
                    break;
                }
                cout<<seats[i].number<<" ";
                if(i==4) break;
            }
            if(seatType=='E'){
                if(surplusE==0){
                    cout<<"\n此艙位全部訂完,請重新選擇艙位型別:\n";
                    full++;
                    break;
                }
                if(i>4){
                    cout<<seats[i].number<<" ";
                }
            }
        }
    }
    if(full==0){
        cout<<"\n";
        cout<<"\n座位號:";
    }else{
        input();
        flag++;
    }

}

//輸入無效
void printError()
{
    cout<<"\n輸入無效!"<<endl;
}

//購票,即改變seats tickets 屬性值
void reservation(string name,int seatNumber,char seatType)
{
    if(seatNumber<1&&seatNumber>20){
        printError();
    }
    else{
        switch(seatType){
            case 'F':
                if(seatNumber>0&&seatNumber<6){
                    if(seats[seatNumber-1].isReservation==false){
                        seats[seatNumber-1].isReservation=true;
                        tickets[seatNumber-1].seat=seats[seatNumber-1];
                        tickets[seatNumber-1].passenger_name=name;
                        surplusF--;
                        cout<<"\n 恭喜 "+name+" 訂票成功!"<<endl;
                        break;
                    }else{
                        printError();
                        //input();
                    }
                }else
                    printError();
                break;
            case 'E':
                if(seatNumber>0&&seatNumber<=20){
                    if(seats[seatNumber+4].isReservation==false){
                        seats[seatNumber+4].isReservation=true;
                        tickets[seatNumber+4].seat=seats[seatNumber+4];
                        tickets[seatNumber+4].passenger_name=name;
                        surplusE--;
                        cout<<"\n 恭喜 "+name+" 訂票成功!"<<endl;
                        break;
                    }else{
                        printError();
                    }
                }else
                    printError();
                break;
        }
    }
}

void printTickets(string name)
{
    cout<<"================================================="<<endl;
    cout<<"               訂  票  信  息                    "<<endl;
    cout<<"================================================="<<endl;
    cout<<"  艙位型別        座位號        乘客姓名         "<<endl;
    cout<<"\n";
    for(int i=0;i<25;i++){
        if(name==tickets[i].passenger_name){
                switch(tickets[i].seat.type){
                case 'F':
                    cout<<"  頭等艙           ";
                    break;
                case 'E':
                    cout<<"  經濟艙           ";
                    break;
                }
            cout<<tickets[i].seat.number<<"             "<<tickets[i].passenger_name<<endl;
            cout<<"\n";
            break;
        }
        else if(name==""){
            if(tickets[i].seat.isReservation==true){
            switch(tickets[i].seat.type){
                case 'F':
                    cout<<"  頭等艙           ";
                    break;
                case 'E':
                    cout<<"  經濟艙           ";
                    break;
            }
            cout<<tickets[i].seat.number<<"             "<<tickets[i].passenger_name<<endl;
            cout<<"\n";
            }
        }
    }
    cout<<"================================================="<<endl;
}

Tips:

如果某些偷懶的傢伙正好是做這個課程大作業搜到這兒了,希望你能在看懂的基礎上自己多改改,畢竟這是我替同學寫的,要是你們都一樣,豈不要尷尬了,O(∩_∩)O哈哈~