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 멤버 함수를 실행하기만 하면 됩니다.
이건 여담이지만 파일이 날라가서 코드를 다시 작성하였는데 문제를 안 읽고해서인지는 몰라도 상속관계로 구현하였다가 실패하고 잠시 해매면서 다시 작성하였내요 ㅎㅎ; 그래도 느낌상 처음보다 더 잘 만든 코드인 것 같습니다. 여러분들도 나중에 한번 씩 다시 해보시는 것이 좋을 것 같습니다.
'명품 C++ programming' 카테고리의 다른 글
명품 C++ programming 실습문제 9장 1번, 2번 (0) | 2019.05.02 |
---|---|
명품 C++ programming 8장 Open Challenge (0) | 2019.04.29 |
명품 C++ programming 실습문제 8장 8번 (0) | 2019.04.28 |
명품 C++ programming 실습문제 8장 7번 (0) | 2019.04.28 |
명품 C++ programming 실습문제 8장 6번 (0) | 2019.04.28 |