C++实现一个航空订票程序

这是帮我同学写的一个C++作业,说实话好久没写过C++都有些生疏了。但他们好像还没学面向对象编程,所以只能是简单的结构体和输入输出的逻辑。

题目要求:

编写一个航空订票程序:

假设一等舱5个座位,编号为15,经济舱20个座位,编号为120

具体要求如下:

当程序开始时,提示输入乘客姓名,一个名字只能订一个座位,如果该名字已经订过座位了,则提示该乘客座位已定及座位号,否则提示输入舱位类型;

当输入舱位类型后,如果该舱位已全部订出,则提示此舱全部订完,重新选择舱位类型;否则显示可以选择的座位号,注意已经被订出的座位号不能出现,提示输入座位号;

舱位类型:只能输入"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哈哈~


CatTalk CSDN认证博客专家 技术专家
就职于某一线互联网公司,前端技术专家,目前关注大前端、容器化、动态化,从事AIOT端智能相关业务。公众号CatTalk,知识星球:技术自由之路
相关推荐
©️2020 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页