#include <iostream>
#include <iostream>
#include <vector>
#include <string>
#include <list>
// 어드민 패스워드
#define ADMIN_PSSWORD 1111
// 영화관 크기
#define ROW 5
#define COL 5
using namespace std;
enum UserMenu { MOVIE_SEARCH = 1, RESERVE_LIST, RESERVE, RESERVE_CANCEL, ADMIN_MODE, EXIT };
enum AdminMenu { ADD_MOVIE = 1, DELETE_MOVIE, GO_MAIN};
// 상영관
class Theater {
private:
int seat[ROW][COL]; // 좌석
public:
int a;
Theater() {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
seat[i][j] = -1;
}
}
}
// 시트정보 세팅
void setSeat(int v, int row, int col) {
seat[row][col] = v;
}
// 시트정보 조회
int getSeat(int row, int col) {
return seat[row][col];
}
// 시트정보 출력
void printSeat() {
cout << "=========== 스크린 방향 =============\n";
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (seat[i][j] == -1) cout << "□";
else cout << "■";
cout << "\t";
}
cout << "\n";
}
cout << "===================================\n";
}
};
// 영화
class Movie {
private:
int id; // 영화 고유 번호
string name; // 영화이름
string genre; // 장르
Theater theater; // 상영관
public:
Movie(int _id, string _name, string _genre, Theater _theater) {
id = _id;
name = _name;
genre = _genre;
theater = _theater;
}
int getId() { return id; }
string getName() { return name; }
Theater* getTheater() { return &theater; }
string getGenre() { return genre; }
Movie() {}
};
// 영화관
class Cinema {
private :
int genId = 1000; // 발급용 아이디
list<Movie> movieList; // 영화목록
public:
Cinema() {}
// 아이디 생성
int generateId() {
return genId++;
}
// 타이틀 호출
void showTitle() {
cout << "=========== ○○○○ 시네마 영화 예약관리스템 =============\n";
}
// 메뉴출력
void showMenu() {
cout << "=====================\n";
cout << "1. 영화검색\n";
cout << "2. 예약목록\n";
cout << "3. 예약\n";
cout << "4. 예약취소\n";
cout << "5. 관리자모드\n";
cout << "6. 종료\n";
cout << "=====================\n";
}
// 관리자 메뉴 출력
void showAdminMenu() {
cout << "=====================\n";
cout << "1. 영화추가\n";
cout << "2. 영화삭제\n";
cout << "3. 메인으로\n";
cout << "=====================\n";
}
// 메뉴입력
int inputMenu() {
int menuNum = -1;
cout << "입력 >> ";
cin >> menuNum;
return menuNum;
}
// 종료
void _exit() {
exit(0);
}
// 영화검색
void searchMovie() {
cout << "( 영화검색 )\n";
cout << "==================================================\n";
cout << "고유번호" << "\t\t" << "제목" << "\t\t" << "장르" << "\n";
list<Movie>::iterator it;
for (it = movieList.begin(); it != movieList.end(); ++it) {
cout << it->getId() << "\t\t" << it->getName() << "\t\t" << it->getGenre() << "\n";
}
cout << "--------------------------------------------------\n";
}
// 예약조회
void listReserve(int _tempId) {
int tempId;
cout << "( 예약조회 )\n";
searchMovie();
if (movieList.size() == 0) {
cout << "< 상영중인 영화가 없습니다. >\n";
return;
}
if (_tempId == -1) {
cout << "예약조회 할 영화 고유번호 >> ";
cin >> tempId;
}
else {
tempId = _tempId;
}
list<Movie>::iterator it;
for (it = movieList.begin(); it != movieList.end(); ++it) {
if (it->getId() == tempId) {
Theater* theater = it->getTheater();
(*theater).printSeat();
break;
}
}
}
// 예약
void reserveMovie() {
int tempId;
int row, col;
cout << "( 영화예약 )\n";
cout << "예약 할 영화 고유번호 >> ";
cin >> tempId;
listReserve(tempId);
cout << "좌석번호(행^열) >> ";
cin >> row >> col;
list<Movie>::iterator it;
for (it = movieList.begin(); it != movieList.end(); ++it) {
if (it->getId() == tempId) {
Theater* theater = it->getTheater();
if ((*theater).getSeat(row, col) == 1) {
cout << "이미 예약된 좌석입니다.\n";
goto EXIT;
}
(*theater).setSeat(1, row, col);
cout << "예약되었습니다.\n";
break;
}
}
EXIT: NULL;
}
// 예약취소
void reserveCancel() {
int tempId;
int row, col;
cout << "( 예약취소 )\n";
cout << "예약 취소 할 영화 고유번호 >> ";
cin >> tempId;
listReserve(tempId);
cout << "좌석번호(행^열) >> ";
cin >> row >> col;
list<Movie>::iterator it;
for (it = movieList.begin(); it != movieList.end(); ++it) {
if (it->getId() == tempId) {
Theater* theater = it->getTheater();
if ((*theater).getSeat(row, col) == -1) {
cout << "예약되지 않은 좌석은 취소 할 수 없습니다.\n";
goto EXIT;
}
(*theater).setSeat(-1, row, col);
cout << "예약취소 되었습니다.\n";
break;
}
}
EXIT: NULL;
}
// 영화추가
void addMovie() {
string name;
string genre;
cout << "( 영화추가 )\n";
cout << "제목 >> ";
cin >> name;
cout << "장르 >> ";
cin >> genre;
Movie movie = Movie(generateId(), name, genre, Theater());
movieList.push_back(movie);
}
// 영화삭제
void deleteMovie() {
int tempId;
cout << "( 영화삭제 )\n";
searchMovie();
cout << "삭제 할 영화 고유번호 >> ";
cin >> tempId;
list<Movie>::iterator it;
for (it = movieList.begin(); it != movieList.end(); ++it) {
if (it->getId() == tempId) {
movieList.erase(it);
break;
}
}
}
// 관리자 모드
void changeAdminMode() {
int password = 0;
cout << "관리자 암호를 입력 >> ";
cin >> password;
if (password != ADMIN_PSSWORD) {
cout << "패스워드가 일치하지 않습니다.\n";
return;
}
while (true) {
showAdminMenu();
int menuNum = inputMenu();
switch (menuNum) {
case ADD_MOVIE:
addMovie();
break;
case DELETE_MOVIE:
deleteMovie();
break;
case GO_MAIN:
return; break;
default:
break;
}
}
}
// 초기화
void initialize() {
// 타이틀 출력
showTitle();
while (true) {
// 메뉴출력
showMenu();
// 사용자로 부터 메뉴 번호 입력받음.
int menuNum = inputMenu();
// 메뉴에 따른 메소드 실행
switch (menuNum)
{
case MOVIE_SEARCH:
searchMovie();
break;
case RESERVE_LIST:
listReserve(-1);
break;
case RESERVE:
reserveMovie();
break;
case RESERVE_CANCEL:
reserveCancel();
break;
case ADMIN_MODE:
changeAdminMode();
break;
case EXIT:
_exit();
break;
default:
break;
}
}
}
};
int main()
{
Cinema cinema = Cinema();
cinema.initialize();
}