Contents
- 1.
- 2. menu : 3
- 3. while loop - 1
- 4. choice != 0 : 2
- 5. MENU 부 대 : 2
- 6. MENU 부과 관련(choice >= 0 && choice <= 4), 못된 메뉴 골라기 : 1, 2
- 7. Menu 부 - 1
- 8. Vending Machine 기 부 - 4
- 9. vending_machine::GetMoney () - 1, 3, 4
- 10. temp_money - 4
- 11. vending_machine::Buy () - 1,3,4
- 12. vending_machine::InsertDrink - 3,4
- 13.
1. ¶
다과 같 2개 만 봤다.
- 명 는 변/&메드 대 - 다르게 바꿔다. 또는 무 기 것가 각, /메드 로 다.
- magic number (ex : 배 범를 는 들) 라 리는 것들 대 - const 변
- 긴 메드 - & 메드를 따로 . , 나 내 는 들 많다고 각될 때.
- 복 - 복되는 부 대 & 메드로 .
2. menu : 3 ¶
~cpp void printMenu () { cout << "\n기 다\n"; cout << "1. 는다\n"; cout << "2.물 다\n"; cout << "3. 러 는다\n"; cout << "4.료를 다\n"; cout << "0.료다\n"; cout << "메뉴를 : "; }
3. while loop - 1 ¶
~cpp bool isEndMenu (int choice) { return choice != 0; }
~cpp while(isEndMenu (choice)) { printMenu (); cin >> choice; . .
4. choice != 0 : 2 ¶
~cpp enum { MENU_END = 0, };
~cpp bool isEndMenu (int choice) { return choice != MENU_END; }
5. MENU 부 대 : 2 ¶
~cpp enum { MENU_END = 0, MENU_GET_MONEY, MENU_BUY, MENU_TAKEBACK_MONEY, MENU_INSERT_DRINK };
~cpp switch(choice) { case MENU_GET_MONEY: VendingMachine.GetMoney(); break; case MENU_BUY: VendingMachine.Buy(); break; case MENU_TAKEBACK_MONEY: VendingMachine.TakeBackMoney(); break; case MENU_INSERT_DRINK: VendingMachine.InsertDrink(); break; case MENU_END: cout << "기를 료다!!\n\n"; break; }
6. MENU 부과 관련(choice >= 0 && choice <= 4), 잘못된 메뉴 선택 골라주기 : 1, 2번 ¶
~cpp bool isValidMenu (int choice) { return choice >= 0 && choice <= 4; }
기 2 다 면
~cpp bool isValidMenu (int choice) { return choice >= MENU_END && choice <= MENU_INSERT_DRINK; }근데.. 명 보 는군. enum 된 것 면
~cpp enum { MENU_ENDCODE = 0, MENU_START = 0, MENU_GET_MONEY, MENU_BUY, MENU_TAKEBACK_MONEY, MENU_INSERT_DRINK, MENU_END = MENU_INSERT_DRINK };MENU_END 뜻 달라므로, MENU_END를 던 다른 것들 고다.
~cpp case MENU_ENDCODE: cout << "기를 료다!!\n\n"; break; }
~cpp bool isEndMenu (int choice) { return choice != MENU_ENDCODE; }그러면,
~cpp isValidMenu
를 다과 같 고 다. (놓고 보 그리 맘 들 만, 단 만 두겠다. -_-;)~cpp bool isValidMenu (int choice) { return choice >= MENU_START && choice <= MENU_END; }
7. Menu 부 - 1 ¶
~cpp case MENU_ENDCODE: VendingMachine.EndMachine(); break; } } else VendingMachine.PrintErrorMessage (); }
부 것.. Vending Machine 내 UI 부 게 되 다는 다. (만 Requirement 가 변경되, MFC 그래 로 만든다면? 디 된다면, Vending Machine 드 UI 드만 '가' 될 겁다. 는 기 Vending Machine 드 '변경' 미 다.)
만 Vending Machine 메드를 다른 래게로 면 UI 부과 관련 래를 낼 것 같다고 각다. 기는 록 겠다.
디 때 보 Input / Output 구 바뀌므로 단 메 Vending Machine 드가 되고 난 뒤, Vending Machine 맞 Input / Output 드를 나 는 것 다.
8. Vending Machine 기 부 - 4 ¶
~cpp const int DRINKNAME_MAXLENGTH = 255; const int TOTAL_DRINK_TYPE = 5;
~cpp vending_machine::vending_machine() { money = temp_money = 0; select_money = 1; max_num = TOTAL_DRINK_TYPE; char drinkNames[TOTAL_DRINK_TYPE][DRINKNAME_MAXLENGTH] = {"coke", "juice", "tea", "cofee", "milk"}; int price[TOTAL_DRINK_TYPE] = {400, 600, 500, 450, 350}; for (int i=0; i<max_num; i++) { strcpy(s_drink[i].name , drinkNames[i]); s_drink[i].price = price[i]; s_drink[i].amount = 10; } }
단 기까 는 대강 러다. 뭐 그리 변는 느껴 다.
(나머 다가 교 뒤 ;)

~cpp #include <iostream> using namespace std; enum { MENU_ENDCODE = 0, MENU_START = 0, MENU_GET_MONEY, MENU_BUY, MENU_TAKEBACK_MONEY, MENU_INSERT_DRINK, MENU_END = MENU_INSERT_DRINK }; const int DRINKNAME_MAXLENGTH = 255; const int TOTAL_DRINK_TYPE = 5; class vending_machine { private: int money; int temp_money; int select_money, select_drink, insert_amount; struct drink { char name[DRINKNAME_MAXLENGTH]; int price, amount; }; drink s_drink[5]; int max_num; public: vending_machine(); void GetMoney(); void Buy(); void TakeBackMoney(); void InsertDrink(); void EndMachine(); void PrintErrorMessage (); }; vending_machine::vending_machine() { money = temp_money = 0; select_money = 1; max_num = TOTAL_DRINK_TYPE; char drinkNames[TOTAL_DRINK_TYPE][DRINKNAME_MAXLENGTH] = {"coke", "juice", "tea", "cofee", "milk"}; int price[TOTAL_DRINK_TYPE] = {400, 600, 500, 450, 350}; for (int i=0; i<max_num; i++) { strcpy(s_drink[i].name , drinkNames[i]); s_drink[i].price = price[i]; s_drink[i].amount = 10; } } void vending_machine::GetMoney() { cout << " . 10, 50, 100, 500, 1000만 가능 : "; cin >> temp_money; if(temp_money == 10 || temp_money == 50 || temp_money == 100 || temp_money == 500 || temp_money == 1000) money = money + temp_money; else cout << "10, 50, 100, 500, 1000만 가능다. 다 \n"; cout << money << " 다\n"; } void vending_machine::Buy() { cout << "료\t\t가격\t량\n"; cout << "------------------------------------\n"; for(int i = 0 ; i < max_num ; i++) cout << i + 1 << "." << s_drink[i].name << "\t\t" << s_drink[i].price << "\t" << s_drink[i].amount << "\n"; cout << "\n " << money << " \n"; cout << "는 료를 : "; cin >> select_drink; switch(select_drink) { case 1: if((money - s_drink[select_drink - 1].price) >= 0 && s_drink[select_drink - 1].amount >= 1) { s_drink[select_drink - 1].amount--; money = money - s_drink[select_drink - 1].price; } else cout << " 부나 량 부\n"; break; case 2: if((money - s_drink[select_drink - 1].price) >= 0 && s_drink[select_drink - 1].amount >= 1) { s_drink[select_drink - 1].amount--; money = money - s_drink[select_drink - 1].price; } else cout << " 부나 량 부\n"; break; case 3: if((money - s_drink[select_drink - 1].price) >= 0 && s_drink[select_drink - 1].amount >= 1) { s_drink[select_drink - 1].amount--; money = money - s_drink[select_drink - 1].price; } else cout << " 부나 량 부\n"; break; case 4: if((money - s_drink[select_drink - 1].price) >= 0 && s_drink[select_drink - 1].amount >= 1) { s_drink[select_drink - 1].amount--; money = money - s_drink[select_drink - 1].price; } else cout << " 부나 량 부\n"; break; case 5: if((money - s_drink[select_drink - 1].price) >= 0 && s_drink[select_drink - 1].amount >= 1) { s_drink[select_drink - 1].amount--; money = money - s_drink[select_drink - 1].price; } else cout << " 부나 량 부\n"; break; } cout << money << " 남\n"; } void vending_machine::TakeBackMoney() { cout << "" << money << " 돌려드립다\n"; money = 0; } void vending_machine::InsertDrink() { for(int i = 0 ; i < max_num ; i++) cout << i + 1 << "." << s_drink[i].name << "\t" << s_drink[i].amount << "\n"; cout << "길 는 료를 : "; cin >> select_drink; cout << "길 는 료 량 력 : "; cin >> insert_amount; switch(select_drink) { case 1: s_drink[select_drink - 1].amount += insert_amount; break; case 2: s_drink[select_drink - 1].amount += insert_amount; break; case 3: s_drink[select_drink - 1].amount += insert_amount; break; case 4: s_drink[select_drink - 1].amount += insert_amount; break; case 5: s_drink[select_drink - 1].amount += insert_amount; break; } cout << "료를 다\n"; for(i = 0 ; i < max_num ; i++) cout << i + 1 << "." << s_drink[i].name << "\t" << s_drink[i].amount << "\n"; } void vending_machine::EndMachine() { cout << "기를 료다!!\n\n"; } void vending_machine::PrintErrorMessage () { cout << "못된 메뉴 다. 메뉴를 다 력\n"; } void printMenu () { cout << "\n기 다\n"; cout << "1. 는다\n"; cout << "2.물 다\n"; cout << "3. 러 는다\n"; cout << "4.료를 다\n"; cout << "0.료다\n"; cout << "메뉴를 : "; } bool isEndMenu (int choice) { return choice != MENU_ENDCODE; } bool isValidMenu (int choice) { return choice >= MENU_START && choice <= MENU_END; } int main() { vending_machine VendingMachine; int choice = -1; while(isEndMenu (choice)) { printMenu (); cin >> choice; if(isValidMenu (choice)) { switch(choice) { case MENU_GET_MONEY: VendingMachine.GetMoney(); break; case MENU_BUY: VendingMachine.Buy(); break; case MENU_TAKEBACK_MONEY: VendingMachine.TakeBackMoney(); break; case MENU_INSERT_DRINK: VendingMachine.InsertDrink(); break; case MENU_ENDCODE: VendingMachine.EndMachine(); break; } } else VendingMachine.PrintErrorMessage (); } return 0; }
9. vending_machine::GetMoney () - 1, 3, 4 ¶
'무 는가' 라고 때 InsertMoney 또는 InsertCoin 더 라 각되다. 그리고, 는 대 메드로 로 comment 를 대 다.
~cpp bool vending_machine::isValidMoney (int money) { return (temp_money == 10 || temp_money == 50 || temp_money == 100 || temp_money == 500 || temp_money == 1000); } void vending_machine::InsertMoney() { cout << " . 10, 50, 100, 500, 1000만 가능 : "; cin >> temp_money; if (isValidMoney (temp_money)) { money = money + temp_money; } else cout << "10, 50, 100, 500, 1000만 가능다. 다 \n"; cout << money << " 다\n"; }
그리고, 메드로 면 , 드를 고 부 메드 내로 다. 메드라 두면 나 다 메드를 모나, 복 기가 리다.
~cpp bool vending_machine::isValidMoney (int money) { int validMoneys[5] = {10, 50, 100, 500, 1000}; for (int i=0;i<5;i++) { if (money == validMoney[i]) return true; } return false; }
단, 러 복기 & 반는 복 발되때 (2 or 3 strike) 는 것 다. 부 모든 복될 부 다 낼 는 다.
부 , 더 극단 를 든다면 다과 같 만, 꼭 는 다. (그대 보면 미다) 단 게 게 보는 것 더 기 때문.
~cpp const int validMoney[5] = {10, 50, 100, 500, 1000}; void vending_machine::printInsertCoinMenu () { cout << " . 10, 50, 100, 500, 1000만 가능 : "; } void vending_machine::printErrorInvalidCoinMessage () { cout << "10, 50, 100, 500, 1000만 가능다. 다 \n"; } void vending_machine::printCurrentMoney () { cout << money << " 다\n"; } bool vending_machine::isValidMoney (int money) { for (int i=0;i<5;i++) { if (money == validMoney[i]) return true; } return false; } void vending_machine::InsertMoney() { printInsertCoinMenu (); cin >> temp_money; if (isValidMoney (temp_money)) { money = money + temp_money; printCurrentMoney (); } else printErrorInvalidCoinMessage (); }
것 더 복 면
~cpp void vending_machine::printInsertCoinMenu () { cout << " . "; for (int i=0;i<4;i++) { cout << validMoneys[i] << "," } cout << valiMoneys[4] << "만 가능 : "; }
10. temp_money - 4 ¶
temp_money 가 는 보면 가 만 다.
~cpp void vending_machine::InsertMoney() { printInsertCoinMenu (); cin >> temp_money; if (isValidMoney (temp_money)) { money = money + temp_money; printCurrentMoney (); } else printErrorInvalidCoinMessage (); }만, private 멤로 다. 러 력 기 변는 그냥 멤 면 됩다.
~cpp void vending_machine::InsertMoney() { int temp_money = 0; printInsertCoinMenu (); cin >> temp_money; if (isValidMoney (temp_money)) { money = money + temp_money; printCurrentMoney (); } else printErrorInvalidCoinMessage (); }
11. vending_machine::Buy () - 1,3,4 ¶
1단 - menu 부 린 & i -> drinkIndex 로 변경.
~cpp void vending_machine::printBuyMenu () { cout << "료\t\t가격\t량\n"; cout << "------------------------------------\n"; for(int drinkIndex = 0 ; drinkIndex < max_num ; drinkIndex++) cout << drinkIndex + 1 << "." << s_drink[drinkIndex].name << "\t\t" << s_drink[drinkIndex].price << "\t" << s_drink[drinkIndex].amount << "\n"; cout << "\n " << money << " \n"; cout << "는 료를 : "; } void vending_machine::Buy() { printBuyMenu (); . .2단 - switch & case
부 대 미 반 공 만들 구고 switch & case 문 다. 부 대는 많 드를 겠다.
~cpp void vending_machine::Buy() { printBuyMenu (); cin >> select_drink; if((money - s_drink[select_drink-1].price) >= 0 && s_drink[select_drink-1].amount >= 1) { s_drink[select_drink-1].amount--; money = money - s_drink[select_drink-1].price; } else cout << " 부나 량 부\n"; cout << money << " 남\n"; }
그리고, select_drink-1 로 것 많데, 는 를 1,2,3,4 ... 로 기 것다. 그리고 select_drink 또 vending_machine 멤데, 는 는 변로 두는것 낫다.
12. vending_machine::InsertDrink - 3,4 ¶
~cpp void vending_machine::InsertDrink() { int select_drink; int insert_amount; printCurrentDrinkStatus (); cout << "길 는 료를 : "; cin >> select_drink; cout << "길 는 료 량 력 : "; cin >> insert_amount; if (select_drink-1 > 0 && select_drink-1 <=5) s_drink[select_drink-1].amount += insert_amount; cout << "료를 다\n"; printCurrentDrinkStatus (); }
13. ¶
~cpp #include <iostream> using namespace std; enum { MENU_ENDCODE = 0, MENU_START = 0, MENU_GET_MONEY, MENU_BUY, MENU_TAKEBACK_MONEY, MENU_INSERT_DRINK, MENU_END = MENU_INSERT_DRINK }; const int DRINKNAME_MAXLENGTH = 255; const int TOTAL_DRINK_TYPE = 5; const int validMoney[5] = {10, 50, 100, 500, 1000}; class vending_machine { private: int money; struct drink { char name[DRINKNAME_MAXLENGTH]; int price, amount; }; drink s_drink[TOTAL_DRINK_TYPE]; int max_num; public: vending_machine(); void InsertMoney(); void Buy(); void TakeBackMoney(); void InsertDrink(); void EndMachine(); bool isValidMoney (int money); void PrintErrorMessage (); void PrintErrorInvalidCoinMessage (); void PrintInsertCoinMenu(); void PrintCurrentMoney (); void PrintBuyMenu (); void PrintCurrentDrinkStatus (); }; vending_machine::vending_machine() { money = 0; max_num = TOTAL_DRINK_TYPE; char drinkNames[TOTAL_DRINK_TYPE][DRINKNAME_MAXLENGTH] = {"coke", "juice", "tea", "cofee", "milk"}; int price[TOTAL_DRINK_TYPE] = {400, 600, 500, 450, 350}; for (int i=0; i<max_num; i++) { strcpy(s_drink[i].name , drinkNames[i]); s_drink[i].price = price[i]; s_drink[i].amount = 10; } } void vending_machine::PrintInsertCoinMenu () { cout << " . "; for (int i=0;i<4;i++) cout << validMoney[i] << "," ; cout << validMoney[4] << "만 가능 : "; } void vending_machine::PrintErrorInvalidCoinMessage () { cout << " . "; for (int i=0;i<4;i++) cout << validMoney[i] << ","; cout << validMoney[4] << "만 가능다. 다 \n"; } void vending_machine::PrintCurrentMoney () { cout << money << " 다\n"; } bool vending_machine::isValidMoney (int money) { for (int i=0;i<5;i++) if (money == validMoney[i]) return true; return false; } void vending_machine::InsertMoney() { int temp_money = 0; PrintInsertCoinMenu (); cin >> temp_money; if (isValidMoney (temp_money)) { money = money + temp_money; PrintCurrentMoney (); } else PrintErrorInvalidCoinMessage (); } void vending_machine::PrintBuyMenu () { cout << "료\t\t가격\t량\n"; cout << "------------------------------------\n"; for(int drinkIndex = 0 ; drinkIndex < max_num ; drinkIndex++) cout << drinkIndex + 1 << "." << s_drink[drinkIndex].name << "\t\t" << s_drink[drinkIndex].price << "\t" << s_drink[drinkIndex].amount << "\n"; cout << "\n " << money << " \n"; cout << "는 료를 : "; } void vending_machine::Buy() { PrintBuyMenu (); int select_drink; cin >> select_drink; if((money - s_drink[select_drink-1].price) >= 0 && s_drink[select_drink-1].amount >= 1) { s_drink[select_drink-1].amount--; money = money - s_drink[select_drink-1].price; } else cout << " 부나 량 부\n"; cout << money << " 남\n"; } void vending_machine::TakeBackMoney() { cout << "" << money << " 돌려드립다\n"; money = 0; } void vending_machine::PrintCurrentDrinkStatus () { for(int drinkIndex = 0 ; drinkIndex < max_num ; drinkIndex++) cout << drinkIndex + 1 << "." << s_drink[drinkIndex].name << "\t" << s_drink[drinkIndex].amount << "\n"; } void vending_machine::InsertDrink() { int select_drink; int insert_amount; PrintCurrentDrinkStatus (); cout << "길 는 료를 : "; cin >> select_drink; cout << "길 는 료 량 력 : "; cin >> insert_amount; if (select_drink-1 > 0 && select_drink-1 <=5) s_drink[select_drink-1].amount += insert_amount; cout << "료를 다\n"; PrintCurrentDrinkStatus (); } void vending_machine::EndMachine() { cout << "기를 료다!!\n\n"; } void vending_machine::PrintErrorMessage () { cout << "못된 메뉴 다. 메뉴를 다 력\n"; } void PrintMenu () { cout << "\n기 다\n"; cout << "1. 는다\n"; cout << "2.물 다\n"; cout << "3. 러 는다\n"; cout << "4.료를 다\n"; cout << "0.료다\n"; cout << "메뉴를 : "; } bool isEndMenu (int choice) { return choice != MENU_ENDCODE; } bool isValidMenu (int choice) { return choice >= MENU_START && choice <= MENU_END; } void vending_machine::Run () { int choice = -1; while(isEndMenu (choice)) { PrintMenu (); cin >> choice; if(isValidMenu (choice)) { switch(choice) { case MENU_GET_MONEY: InsertMoney(); break; case MENU_BUY: Buy(); break; case MENU_TAKEBACK_MONEY: TakeBackMoney(); break; case MENU_INSERT_DRINK: InsertDrink(); break; case MENU_ENDCODE: EndMachine(); break; } } else PrintErrorMessage (); } } int main() { vending_machine VendingMachine; VendingMachine.Run (); return 0; }
문 - vending_machine God 래다. 로그램 가 vending_machine 객 동급 되리.
력부과 Vending Machine 리
~cpp #ifndef _VENDINGMACHINE_H_ #define _VENDINGMACHINE_H_ #include <iostream> #include <string> #include <vector> #include <map> #include <algorithm> using namespace std; class Drink { public: string name; int price; int amount; Drink (string name, int price, int amount) { this->name = name; this->price = price; this->amount = amount; } }; class VendingMachine { public: int money; vector <Drink*> drinks; vector <int> validMoney; VendingMachine() { this->money = 0; string drinkNames[] = {"coke", "juice", "tea", "cofee", "milk"}; int price[] = {400, 600, 500, 450, 350}; int defaultAmount = 10; int TOTAL_DRINK_TYPE = 5; int validMoneyList[] = {10, 50, 100, 500, 1000}; int TOTAL_MONEY_TYPE = 5; Drink* drink; for (int drinkIndex=0; drinkIndex<TOTAL_DRINK_TYPE; drinkIndex++) { drink = new Drink(drinkNames[drinkIndex], price[drinkIndex], defaultAmount); registerDrink (drink); } for (int moneyIndex=0; moneyIndex<TOTAL_MONEY_TYPE; moneyIndex++) { registerMoneyType (validMoneyList[moneyIndex]); } } ~VendingMachine () { for (int i=0; i< drinks.size(); i++) { delete drinks[i]; } drinks.clear(); } void registerMoneyType (int moneyType) { validMoney.push_back(moneyType); } bool isValidDrinkIndex (int drinkIndex) { return (drinkIndex>=0 && drinkIndex <5); } void chargeDrink (int drinkIndex, int amount) { drinks[drinkIndex]->amount += amount; } vector<int> getValidMoneyTypes(void) { return this->validMoney; } bool VendingMachine::isBuyable(int drinkId) { return ((getMoney() - drinks[drinkId]->price >= 0) && (drinks[drinkId]->amount >= 1)); } vector<Drink*> getRegisteredDrinks () { return this->drinks; } void VendingMachine::buy (int drinkId) { drinks[drinkId]->amount--; chargeMoney (drinks[drinkId]->price); } void registerDrink (Drink* drink) { drinks.push_back(drink); } bool isValidMoneyType (int money) { for (int i=0; i<validMoney.size();i++) { if (validMoney[i] == money) return true; } return false; } int takeBackMoney() { int takeBackMoney = this->money; this->money = 0; return takeBackMoney; } void insertMoney (int money) { this->money += money; } void chargeMoney (int drinkPrice) { this->money -= drinkPrice; } int getMoney () { return money; } }; #endif main.cpp #include "VendingMachine.h" #include <iostream> #include <map> using namespace std; enum { MENU_ENDCODE = 0, MENU_START = 0, MENU_GET_MONEY, MENU_BUY, MENU_TAKEBACK_MONEY, MENU_INSERT_DRINK, MENU_END = MENU_INSERT_DRINK }; typedef void(*Func)(VendingMachine&); void InsertMoney(VendingMachine& vendingMachine); void Buy(VendingMachine& vendingMachine); void TakeBackMoneyMenu(VendingMachine& vendingMachine); void InsertDrink(VendingMachine& vendingMachine); void EndMachine(VendingMachine& vendingMachine); void PrintErrorMessage (); void PrintErrorInvalidCoinMessage (VendingMachine& vendingMachine); void PrintInsertCoinMenu(); void PrintCurrentMoney (int money); void PrintBuyMenu (int money); void PrintCurrentDrinkStatus (); void PrintErrorInvalidCoinMessage (VendingMachine& vendingMachine) { cout << " . "; vector<int> validMoney = vendingMachine.getValidMoneyTypes(); for (int i=0;i<validMoney.size()-1;i++) cout << validMoney[i] << ","; cout << validMoney[i] << "만 가능다. 다 \n"; } void PrintCurrentMoney (int money) { cout << money << " 다\n"; } void PrintBuyMenu (VendingMachine& vendingMachine) { cout << "료\t\t가격\t량\n"; cout << "------------------------------------\n"; vector <Drink*> drinks = vendingMachine.getRegisteredDrinks(); for(int drinkIndex = 0 ; drinkIndex < drinks.size() ; drinkIndex++) { cout << drinkIndex << "." << drinks[drinkIndex]->name << "\t\t" << drinks[drinkIndex]->price << "\t" << drinks[drinkIndex]->amount << "\n"; } PrintCurrentMoney (vendingMachine.getMoney()); cout << "는 료를 : "; } void Buy(VendingMachine& vendingMachine) { PrintBuyMenu (vendingMachine); int drinkId; cin >> drinkId; if(vendingMachine.isBuyable(drinkId)) { vendingMachine.buy (drinkId); cout << vendingMachine.getMoney() << " 남\n"; } else cout << " 부나 량 부\n"; } void TakeBackMoney (VendingMachine& vendingMachine) { int takeBackMoney = vendingMachine.takeBackMoney (); cout << "" << takeBackMoney << " 돌려드립다\n"; } void PrintCurrentDrinkStatus (VendingMachine& vendingMachine) { vector<Drink*> drinks = vendingMachine.getRegisteredDrinks(); for(int drinkIndex = 0 ; drinkIndex < drinks.size() ; drinkIndex++) cout << drinkIndex << "." << drinks[drinkIndex]->name << "\t" << drinks[drinkIndex]->amount << "\n"; } void PrintErrorMessage () { cout << "못된 메뉴 다. 메뉴를 다 력\n"; } void InsertMoney(VendingMachine& vendingMachine) { int money = 0; cout << " . "; vector<int> validMoney = vendingMachine.getValidMoneyTypes(); for (int i=0;i<validMoney.size()-1;i++) cout << validMoney[i] << "," ; cout << validMoney[i] << "만 가능 : "; cin >> money; if (vendingMachine.isValidMoneyType (money)) { vendingMachine.insertMoney (money); PrintCurrentMoney (vendingMachine.getMoney ()); } else PrintErrorInvalidCoinMessage (vendingMachine); } void InsertDrink(VendingMachine& vendingMachine) { int selectDrink; int insertAmount; PrintCurrentDrinkStatus (vendingMachine); cout << "길 는 료를 : "; cin >> selectDrink; cout << "길 는 료 량 력 : "; cin >> insertAmount; if (vendingMachine.isValidDrinkIndex (selectDrink)) { vendingMachine.chargeDrink (selectDrink, insertAmount); cout << "료를 다\n"; } PrintCurrentDrinkStatus (vendingMachine); } void EndMachine(VendingMachine& vendingMachine) { cout << "기를 료다!!\n\n"; } bool isEndMenu (int choice) { return choice != MENU_ENDCODE; } bool isValidMenu (int choice) { return choice >= MENU_START && choice <= MENU_END; } int InputMainMenu () { int choice = -1; cout << "\n기 다\n" << "1. 는다\n" << "2.물 다\n" << "3. 러 는다\n" << "4.료를 다\n" << "0.료다\n" << "메뉴를 : "; cin >> choice; return choice; } int main() { VendingMachine vendingMachine; int choice = -1; int menuList[] = { MENU_GET_MONEY, MENU_BUY, MENU_TAKEBACK_MONEY, MENU_INSERT_DRINK, MENU_ENDCODE}; Func funcList[] = { InsertMoney, Buy, TakeBackMoney, InsertDrink, EndMachine }; map<int, Func> menuTable; for (int menuIndex=0; menuIndex<5; menuIndex++) { menuTable[menuList[menuIndex]] = funcList[menuIndex]; } while (isEndMenu (choice)) { choice = InputMainMenu (); if (isValidMenu (choice)) { (*menuTable[choice])(vendingMachine); } else PrintErrorMessage (); } return 0; }