1. 문제

 

9. 비행기 예약 프로그램을 작성하라. 이 문제는 여러 개의 클래스와 객체들을 다루는 연습을 위한 것이다. 클래스 사이의 상속 관계는 없다. 항공사 이름은 '한성항공'이고, 8개의 좌석을 가진 3대의 비행기로 서울 부산 간 운항 사업을 한다. 각 비행기는 하루에 한 번만 운항하며 비행 시간은 7시, 12시, 17시이다. 비행기 예약 프로그램은 다음의 기능을 가진다.

-예약 : 비행 시간, 사용자의 이름, 좌석 번호를 입력받아 예약한다.

-취소 : 비행 시간, 사용자의 이름, 좌석 번호를 입력받고 예약을 취소한다.

-예약 보기 : 예약된 좌석 상황을 보여준다.

 

 

2. 결과

 

 

3. 코드

#include <iostream>
#include <string>
using namespace std;

class Console {
public:
	int menu() {
		int num;
		cout << "\n예약:1, 취소:2, 보기:3, 끝내기:4 >>";
		cin >> num;
		return num;
	}
	int time_menu() {
		int num;
		cout << "7시:1, 12시:2, 17시:3 >>";
		cin >> num;
		return num;
	}

};

class Seat {
	string name;
	int number;
public:
	Seat() { this->name = "---"; this->number = -1; }
	void setName(string name) { this->name = name; }
	string getName() { return name; }
};

class Schedule {
	Seat *seat;
public:
	Schedule() {
		seat = new Seat[8];
	}
	void show(int num) {
		if (num == 1) cout << "7시:";
		else if (num == 2) cout << "12시:";
		else if (num == 3) cout << "17시:";

		for (int i = 0; i<8; i++)
			cout << "\t" << seat[i].getName();
		cout << endl;
	}
	void setN(int num, string name) { seat[num - 1].setName(name); }
	string getN(int num) { return seat[num - 1].getName(); }
};

class AirlineBook {
	Schedule *s;
public:
	AirlineBook() {
		s = new Schedule[3];
	}
	void program() {
		bool exit = true;
		int num;
		Console c;
		int seat_num;
		string name;

		while (exit) {
			num = c.menu();
			if (num == 1) {
				num = c.time_menu();

				if (num == 1 || num == 2 || num == 3) {
					s[num - 1].show(num);
					cout << "좌석 번호 >>"; cin >> seat_num;
					cin.ignore(1);
					cout << "이름 입력 >>"; getline(cin, name);
					s[num - 1].setN(seat_num, name);
				}
				else
					cout << "숫자를 잘못 입력하셨습니다." << endl;
			}
			else if (num == 2) {
				num = c.time_menu();

				if (num == 1 || num == 2 || num == 3) {
					s[num - 1].show(num);
					cout << "좌석 번호 >>"; cin >> seat_num;
					cin.ignore(1);
					cout << "이름 입력 >>"; getline(cin, name);
					if (name != s[num - 1].getN(seat_num))
						cout << "해당 좌석에 예약되어 있는 이름과 일치하지 않습니다." << endl;
					else
						s[num - 1].setN(seat_num, "---");
				}
				else
					cout << "숫자를 잘못 입력하셨습니다." << endl;
			}
			else if (num == 3) {
				s[0].show(1);
				s[1].show(2);
				s[2].show(3);
			}
			else if (num == 4) {
				cout << "예약 시스템을 종료합니다." << endl;
				exit = false;
			}
			else
				cout << "숫자를 잘못 입력하셨습니다." << endl;
		}
	}
};



int main() {
	AirlineBook *Air = new AirlineBook();

	cout << "*** 한성한공에 오신것을 환영합니다. ***\n";
	Air->program();
}

 

 

4. 설명

 

 힌트에서 설명했듯이 AirlineBook 클래스, Schedule 클래스, Seat 클래스, Console 클래스, 이 4개의 클래스 함수를 작성하였습니다. 

 

 지금은 편의상 한 cpp 파일에 다 작성을 하였지만 본래 문제에서도 말하였듯이 여러 개의 클래스를 다루는 연습을 하기 위해서라도 각 클래스를 각각 다른 파일의 구현하는 것이 좋습니다. 여기서는 하나의 파일의 다 작성하였고, 어느 클래스의서는 다른 클래스 변수를 사용하기 때문에 클래스를 선언하는 순서가 중요합니다.

 

 

 

- Console 클래스 : 메뉴를 물어보고 선택한 숫자를 return 해주는 menu 멤버 함수와 시간 대를 물어보고 어느 시간 대를 선택하였는지 return 해주는 time_menu 멤버 함수를 구현하였습니다.

 

- Seat 클래스 : 좌석 클래스로서 name, number를 멤버 변수로 가집니다. name은 이름을, number은 각각 좌석 번호를 저장하는 변수 입니다. 또한 생성자에서 name = "---"로 초기화 해주므로서 예약되지 않은 좌석이 출력될 때 "---"가 출력되도록 합니다. 그 밖에 이름을 변경하는 setName 멤버 함수와 이름을 return하는 getName 멤버 함수를 가집니다.

 

- Schedule 클래스 : Seat 변수를 가지며, 생성자에서 크기가 8인 동적 배열을 선언합니다. 그리고 좌석을 예약할 시 또는 취소할 시 해당하는 시간 대의 좌석 상황을 보여주기 위한 show 멤버 함수를 가집니다. show 멤버 함수는 num 매개변수를 하나 입력 받아서 해당하는 시간 대의 좌석 현황만 보여줍니다. 그 밖에 좌석을 예약, 취소 시 이름을 수정하기 위한 setN 멤버 함수와 해당 좌석에 이름을 return하는 getN 멤버 함수를 가집니다.

 

- AirlineBook 클래스 : Schedule 변수를 가지며, 생성자에서 크기가 3인 동적 배열을 선언합니다. 전체적인 프로그램을 구현한 program 멤버 함수를 가지며, program 멤버 함수에서 전체 프로그램을 작성하였기 때문에 main 함수에서는 AirlineBook 변수를 동적으로 생성한 후 "->"를 사용하여서 program 멤버 함수를 실행하기만 하면 됩니다.

 

 

 

 이건 여담이지만 파일이 날라가서 코드를 다시 작성하였는데 문제를 안 읽고해서인지는 몰라도 상속관계로 구현하였다가 실패하고 잠시 해매면서 다시 작성하였내요 ㅎㅎ; 그래도 느낌상 처음보다 더 잘 만든 코드인 것 같습니다. 여러분들도 나중에 한번 씩 다시 해보시는 것이 좋을 것 같습니다.

 

+ Recent posts