U E D R , A S I H C RSS

Vending Machine/세연/재동

나름대로 고쳐본 소스

~cpp 
#include <iostream> 
using namespace std;

struct drink
{
    char * name;
    int price, amount;
};

class VendingMachine
{
private:
    int _money;
    int _selectMoney;
	int _insertAmount;
    int _maxNum;
	drink s_drink[5];
public:
    VendingMachine();
    void insertMoney();
    void buyDrink();
    void takeBackMoney();
    void insertDrink();
	void showMainMenu();
	void showDrinkMenu();
	bool isMoney(int arg);
	bool isBuyableDrink(int arg);
	bool isSelectableDrink(int arg);
}; 

VendingMachine::VendingMachine() 
{ 
    _money = 0;
    _maxNum = 5;

	char * name[] = {"coke","juice","tea","cofee","milk"};
	int price[] = {400,600,500,450,350};

	for(int i=0;i<_maxNum;i++)
	{
		s_drink[i].name = name[i];
		s_drink[i].price = price[i];
		s_drink[i].amount = 10;
	}
}

void VendingMachine::insertMoney() 
{
	int tempInsertMoney = 0;
    cout << "돈을 넣으세요. 10, 50, 100, 500, 1000만 가능 : "; 
    cin >> tempInsertMoney; 
    if(isMoney(tempInsertMoney))
		_money += tempInsertMoney;
    else
		cout << "10, 50, 100, 500, 1000만 가능합니다. 다시 시작해주세요\n";             
    cout << _money << "원을 넣었습니다\n"; 
} 
 
void VendingMachine::buyDrink() 
{
	int selectBuyDrink;
	showDrinkMenu();
	cout << "사실 음료수를 골라 주세요 ";
    cin >> selectBuyDrink; 
    if(isSelectableDrink(selectBuyDrink))
	{
		if(isBuyableDrink(selectBuyDrink))
		{ 
			s_drink[selectBuyDrink - 1].amount--; 
			_money -= s_drink[selectBuyDrink - 1].price; 
		} 
		else
			cout << "잔액이 부족하거나 수량이 부족해요\n";
	}
    cout << _money << "원이 남았어요\n";
}

void VendingMachine::takeBackMoney() 
{ 
    cout << "거스름돈" << _money << "원을 돌려드립니다\n"; 
    _money = 0; 
} 

void VendingMachine::insertDrink() 
{ 
	int selectInsertDrink;
    for(int i = 0 ; i < _maxNum ; i++)
		cout << i + 1 << "." << s_drink[i].name << "\t" << s_drink[i].amount << "\n"; 
    cout << "채우길 원하는 음료수를 선택하세요 : "; 
    cin >> selectInsertDrink; 
    cout << "채우길 원하는 음료수 수량을 입력해주세요 : "; 
    cin >> _insertAmount; 

    if(isSelectableDrink(selectInsertDrink))
		s_drink[selectInsertDrink - 1].amount += _insertAmount;

    cout << "음료수를 채웠습니다\n"; 
    showDrinkMenu();
}

void VendingMachine::showMainMenu()
{
	cout << "\n자판기 입니다\n"; 
    cout << "1.돈을 넣는디\n"; 
    cout << "2.물건을 산다\n"; 
    cout << "3.돈을 거술러 받는다\n"; 
    cout << "4.음료수를 채운다\n"; 
	cout << "0.종료한다\n";  
    cout << "메뉴를 선택하세요 : "; 
} 

void VendingMachine::showDrinkMenu()
{
	cout << "음료수\t\t가격\t수량\n"; 
    cout << "------------------------------------\n"; 
    for(int i = 0 ; i < _maxNum ; i++)
	{
		cout << i + 1 << "."  << s_drink[i].name << "\t\t";
		cout << s_drink[i].price << "\t" << s_drink[i].amount << "\n";
	}
    cout << "\n현재 " << _money << "원이 있어요\n";
}

bool VendingMachine::isMoney(int arg)
{
	if(arg == 10 || arg == 50 || arg == 100 || arg == 500 || arg == 1000)
		return true;
	else
		return false;
}

bool VendingMachine::isBuyableDrink(int arg)
{
	if((_money - s_drink[arg - 1].price) >= 0 && s_drink[arg - 1].amount >= 1)
		return true;
	else
		return false;
}
bool VendingMachine::isSelectableDrink(int arg)
{
	if(arg > 0 && arg < 6)
		return true;
	else
		return false;
}
int main() 
{ 
    VendingMachine vendingMachine; 

    int choice = -1;

    while(choice != 0) 
    {
		vendingMachine.showMainMenu();
        cin >> choice; 
        if(choice >= 0 && choice <= 4) 
        { 
            switch(choice) 
            { 
            case 1: 
                vendingMachine.insertMoney(); 
                break; 
            case 2: 
                vendingMachine.buyDrink(); 
                break; 
            case 3: 
                vendingMachine.takeBackMoney(); 
                break; 
            case 4: 
                vendingMachine.insertDrink(); 
                break;
            } 
        } 
        else
			cout << "잘못된 메뉴 선택입니다. 메뉴를 다시 입력해주세요\n"; 
    }
	cout << "자판기를 종료합니다!!\n\n";
    return 0; 
}

수정된 부분

~cpp 
1. 우선 211 라인에서 144 라인으로 소스를 32% 줄임
2. 중복된 곳이 많던 buy()함수와 insertDrink()함수를 집중적으로 수정
3. 클래스명과 함수명 그리고 변수명을 좀 더 평범하게 변형
4. showDrinkMenu() 함수를 private로 만듬
5. 이외 잡다 에러...
6. 더 고쳐져야 할 부분이 보이지만 미묘해서 그만 둠...-,-;;;
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:22
Processing time 0.0096 sec