저번에 작업하던 영화 예매 프로그램 중간과정의 마지막 단계인 영화 티켓 예매 파트를 완성했고, 코드가 난잡하게 널려있던 부분을 정리했다.


불필요한 필드 및 메소드는 모두 주석 처리를 했다.


1. 상영관 관리 프로그램 O

2. 영화 상영일정 관리 프로그램 O

3. 영화 티켓 예매 프로그램 O


이로써 완성~


예외처리 할게 널려있지만 일단은 정상적으로 입력시 정확히 작동하는 것을 확인했다.


아래는 각 클래스의 소스코드.


ps. 영화 예매 관리 프로그램에서 예매시 유저를 구분할 수 있는 고유 넘버는 10000으로 시작해서 유저가 추가 될 때마다 +1 씩 고유 넘버가 증가한다.





블로그 이미지

irostub

iro의 잡화상점

,


적당한 과제로 영화 예매 프로그램을 작성하게 되었다.


과정은 1~3단계로 나뉘어져 있고 모든 단계가 개체에 대한 적절한 이해가 필요한 과제였다. 현재는 1~2단계까지 코드를 완성했고, 마지막 제출까지 3단계를 끝마쳐야한다.


영화 예매 프로그램은 파트별로 크게 3가지로 나뉘어져있다.


1. 상영관 관리 프로그램

2. 영화 상영일정 관리 프로그램

3. 영화 티켓 예매 프로그램


각각 기능별로

0- 메인은 MovieReservation 클래스

1- 상영관 관리 프로그램은 Sceen, ScreenManager 클래스

2- 영화 상영일정 관리 프로그램은 Movie, MovieTimetable, TimetableManager 클래스

3- 영화 티켓 예매 프로그램은 Seat, Ticket, TicketManager클래스


를 필요로 한다. 현재는 1, 2 만 구현했으며 내부 메소드 중에 3과 연관 되는 메소드는 틀만 작성했다.


객체를 생성해서 배열을 뒤지는 과정에서 계산을 잘못해서 NullPointException이 엄~청 많이 발생했으나 환기 한번하고 천천히 다시 건드려보니 모두 해결되었다.


무식하게 복사 붙여넣기해서 길어졌던 코드도 중복을 제거하고 최대한 간결하게 정돈했다.


2파트 까지는 만족! 3파트까지 모두 완성되면 최종 편집본으로 다시 한번 글을 작성할 생각이다.


아래는 각 클래스별 코드이다. 코드가 적잖이 기므로 접기.




1. 상영관 관리 프로그램에 대한 Screen, ScreenManager 클래스







2. 영화 상영일정 관리 프로그램 Movie, MovieTimetable, TimetableManager 클래스



블로그 이미지

irostub

iro의 잡화상점

,
학교에서 내준 실습과제다 예제와 일치하도록 코딩은 한 것 같은데,

가만보니 테이블 삭제했을 때 뭔가 이상할 것 같다.  

실제로 2번 테이블 손님 그냥 나갔다고 삭제하면, 3번 테이블 손님이 2번 테이블로 오는건 아니잖아?
 
아무래도 예제가 잘못된거같다. 

차라리 포인터 배열을 당기는 형식이아니라. 

cnt 변수도 필요도록 삭제한 뒤 NULL로 포인터 배열 초기화하고, 객체는 delete 하는 방식이 더 옳아보인다.  

추가 할 땐 대신 NULL이 아니면 그 자리에 추가가 안되도록 하고 삭제를 하라고 안내해 주는 방법이 훨씬 현실적일 것. 

그래도 재미는 있었다. 포인터가지고 짱구 굴리는게 다중포인터 이해엔 확실히 도움이된다.
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

#define MIN_TABLE 0
#define MAX_TABLE 10
struct Menu {
	int food_num = 0;
	string food_name = "";
	int price = 0;
};

struct Order {
	Menu *food = NULL;
	int *food_quantity = 0;
	int table_num = 0;
	int order_count = 0;
	int total_price = 0;
	bool isChecked = false;
};

//start function 
void print_order();
void new_order(Menu*, Order**, int&);
void find_order(Order**, int);
void check_order(Order**, int);
void del_order(Order**, int&);
//end function

int main()
{
	Menu menu[6] = { { 1,"그린샐러드",18000 },{ 2,"치킨샐러드",19000 },{ 3,"찹스테이크",32000 },
	{ 4,"티본스테이크",30000 },{ 5,"치즈파스타",17000 },{ 6,"치즈피자",15000 } };
	Order *order[10] = { NULL };

	int selectMenu = 0;
	int cnt = 0;

	while (selectMenu != -1)
	{
		print_order();
		cin >> selectMenu;

		switch (selectMenu)
		{
		case 1:
			//if (order[cnt] == NULL)
			//{
			new_order(menu, order, cnt);
			//}
			break;
		case 2: find_order(order, cnt); break;
		case 3: check_order(order, cnt); break;
		case 4: del_order(order, cnt); break;
		case 0:
			delete(order);
			selectMenu = -1;
		default: cout << "비정상적인 입력입니다." << endl; break;
		}
	}
}

void new_order(Menu* m, Order **ptr_array_order, int& pos)
{
	Order *o = new Order;
	bool search = false;
	cout << "*주문받을 테이블번호(1-10) 선택 : "; cin >> o->table_num;

	//start input error check
	if (o->table_num <= MIN_TABLE || o->table_num > MAX_TABLE)
	{
		cout << "테이블 번호 입력오류입니다. 처음화면으로 돌아갑니다." << endl;
		delete(o); return;
	}
	//end input error check

	cout << "* 주문할 음식 수 입력 : "; cin >> o->order_count;

	o->food = new Menu[o->order_count];
	o->food_quantity = new int[o->order_count];

	for (int i = 0; i < o->order_count; i++)
	{
		cout << "주문 " << (i + 1) << " 을 입력하세요 : ";
		string name; cin >> name;

		//start copy food object
		for (int j = 0; j < 6; j++)
		{
			if (name == m[j].food_name)
			{
				o->food[i] = m[j];
				search = true;
				break;
			}
		}
		if (search == false)
		{
			cout << "해당하는 주문은 없습니다. 처음화면으로 돌아갑니다." << endl;
			break;
		}
		//end copy

		//start input to food_quantitiy 
		cout << "수량을 입력하세요" << (i + 1) << " : ";
		cin >> o->food_quantity[i];
		//end input

		o->total_price += o->food[i].price * o->food_quantity[i];//acc in total_price
	}
	if (search == false)
	{
		delete(o);
		return;
	}
	*(ptr_array_order + pos++) = o; //reg order

	cout << "주문이 등록됬습니다." << endl << endl;
	search = false;
}

void find_order(Order **ptr_array_order, int pos)
{
	int table_num = 0;

	cout << "*검색할 테이블번호(1-10) 선택 : "; cin >> table_num;

	if (table_num <= MIN_TABLE || table_num > MAX_TABLE)
	{
		cout << "테이블 번호 입력오류입니다. 처음화면으로 돌아갑니다." << endl;
		return;
	}

	for (int i = 0; i < pos; i++)
	{
		if (table_num == ptr_array_order[i]->table_num)
		{
			//start print 
			for (int j = 0; j < ptr_array_order[i]->order_count; j++)
			{
				cout << ptr_array_order[i]->food[j].food_name << " : " <<
					ptr_array_order[i]->food[j].price << " * " <<
					ptr_array_order[i]->food_quantity[j] << " = " <<
					ptr_array_order[i]->food[j].price * ptr_array_order[i]->food_quantity[j] << endl;
			}//end print

			cout << "주문금액 = " << ptr_array_order[i]->total_price << endl;
			int vat = ptr_array_order[i]->total_price * 0.1;
			cout << "부가세 = " << vat << endl;
			cout << "결제예정금액 = " << ptr_array_order[i]->total_price + vat << endl;
		}
	}
}

void check_order(Order** ptr_array_order, int pos)
{
	int table_num = 0;
	int received_money = 0;

	cout << "*결제할 테이블번호(1-10) 선택 : "; cin >> table_num;

	if (table_num <= MIN_TABLE || table_num > MAX_TABLE)
	{
		cout << "테이블 번호 입력오류입니다. 처음화면으로 돌아갑니다." << endl;
		return;
	}
	cout << "받은 금액 입력 : "; cin >> received_money;

	for (int i = 0; i < pos; i++)
	{
		if (table_num == ptr_array_order[i]->table_num)
		{
			if (received_money >= ptr_array_order[i]->total_price + ptr_array_order[i]->total_price*0.1)
			{
				cout << "반환 금액 = " << received_money - ((ptr_array_order[i]->total_price) + (ptr_array_order[i]->total_price*0.1)) << endl;
				ptr_array_order[i]->isChecked = true;
				cout << "결제가 완료되었습니다." << endl;
				break;
			}
			else
			{
				cout << "결제 금액이 부족합니다. 다시 결제해주세요." << endl;
				break; return;
			}
		}
	}
}

void del_order(Order** ptr_array_order, int& pos)
{
	int table_num = 0;
	cout << "*삭제할 테이블번호(1-10) 선택 : "; cin >> table_num;

	if (table_num <= MIN_TABLE || table_num > MAX_TABLE)
	{
		cout << "테이블 번호 입력오류입니다. 처음화면으로 돌아갑니다." << endl;
		return;
	}

	for (int i = 0; i < pos; i++)
	{
		if (ptr_array_order[i]->table_num == table_num)
		{
			if (ptr_array_order[i]->isChecked == false)
			{
				//ptr_array_order[i] = NULL;

				delete(ptr_array_order[i]);
				//start swap pointer
				for (int j = i; j < pos - 1; j++)
				{
					cout << "here";
					ptr_array_order[j] = ptr_array_order[j + 1];
					ptr_array_order[j]->table_num -= 1;
				}
				//end swap pointer
				pos -= 1;
				cout << "삭제를 완료하였습니다." << endl;
				break;
			}
			else
			{
				cout << "결제완료한 주문은 삭제할 수 없습니다." << endl;
				break;
			}
		}
	}
}

void print_order()
{
	cout << "**** 해피 패밀리 레스토랑 ****" << endl;
	cout << "\t1.주문입력" << endl;
	cout << "\t2.주문검색" << endl;
	cout << "\t3.주문결제" << endl;
	cout << "\t4.주문삭제" << endl;
	cout << "\t0.종료" << endl;
	cout << "******************************" << endl;
}


블로그 이미지

irostub

iro의 잡화상점

,