C++

명품 C++ 4장 11번

NUMERO_K 2018. 10. 30. 01:16

11. 다음은 커피자판기로 작동하는 프로그램을 만들기 위해 필요한 두 클래스이다.


class CoffeeVendingMachine { // 커피자판기를 표현하는 클래스
    Container tong[3]; // tong[0]는 커피, tong[1]은 물, tong[2]는 설탕통을 나타냄
    void fill(); // 3개의 통을 모두 10으로 채움
    void selectEspresso(); // 에스프레소를 선택한 경우, 커피 1, 물 1 소모
    void selectAmericano(); // 아메리카노를 선택한 경우, 커피 1, 물 2 소모
    void selectsugarCoffee(); // 설탕커피를 선택한 경우, 커피 1, 물 2 소모, 설탕 1 소모
    void show(); // 현재 커피, 물 설탕의 잔량 출력
public:
    void run(); // 커피 자판기 작동
    int sw;
};
class Container { // 통 하나를 나타내는 클래스
    int size; // 현재 저장 량, 최대 저장량은 10
public:
    Container() { size = 10; }
    void fill(); // 최대량(10)으로 채우기
    void consume(); // 1만큼 소비하기
    int getSize(); // 현재 크기 리턴
};


다음과 같이 실행되도록 main() 함수와 CoffeeVendingMachine, Container를 완성하라. 만일 커피, 물, 설탕 중 잔량이 하나라도 부족해 커피를 제공할 수 없는 경우 '원료가 부족합니다.'를 출력하라


소스코드


#include <iostream>
using namespace std;
class Container { // 통 하나를 나타내는 클래스
    int size; // 현재 저장 량, 최대 저장량은 10
public:
    Container() { size = 10; }
    void fill(); // 최대량(10)으로 채우기
    void consume(); // 1만큼 소비하기
    int getSize(); // 현재 크기 리턴
};
void Container::fill() {
    size = 10;
}
void Container::consume() {
    --size;
}
int Container::getSize() {
    return size;
}
class CoffeeVendingMachine { // 커피자판기를 표현하는 클래스
    Container tong[3]; // tong[0]는 커피, tong[1]은 물, tong[2]는 설탕통을 나타냄
    void fill(); // 3개의 통을 모두 10으로 채움
    void selectEspresso(); // 에스프레소를 선택한 경우, 커피 1, 물 1 소모
    void selectAmericano(); // 아메리카노를 선택한 경우, 커피 1, 물 2 소모
    void selectsugarCoffee(); // 설탕커피를 선택한 경우, 커피 1, 물 2 소모, 설탕 1 소모
    void show(); // 현재 커피, 물 설탕의 잔량 출력
public:
    void run(); // 커피 자판기 작동
    int sw;
};
void CoffeeVendingMachine::fill() {
    for (int i = 0; i <3; ++i)
        tong[i].fill();
    sw = 0;
}
void CoffeeVendingMachine::selectEspresso() {
    for (int i = 0; i <3; ++i) { //원료가 충분한가 확인
        if (tong[i].getSize() == 0) {
            sw = 1;
            break;
        }
    }
    if (sw == 1) {
        cout << "원료가 부족합니다" << endl;
    }
    else {
        tong[0].consume(); tong[1].consume();
        sw = 0;
        cout << "에스프레소 드세요" << endl;
    }
}
void CoffeeVendingMachine::selectAmericano() {
    for (int i = 0; i <3; ++i) { //원료가 충분한가 확인
        if (tong[i].getSize() == 0) {
            sw = 1;
            break;
        }
    }
    if (sw == 1) {
        cout << "원료가 부족합니다" << endl;
    }
    else {
        tong[0].consume(); tong[1].consume(); tong[1].consume();
        sw = 0;
        cout << "아메리카노 드세요" << endl;
    }
}
void CoffeeVendingMachine::selectsugarCoffee() {
    for (int i = 0; i <3; ++i) { //원료가 충분한가 확인
        if (tong[i].getSize() == 0) {
            sw = 1;
            break;
        }
    }
    if (sw == 1) {
        cout << "원료가 부족합니다" << endl;
    }
    else {
        tong[0].consume(); tong[1].consume(); tong[1].consume(); tong[2].consume();
        sw = 0;
        cout << "설탕커피 드세요" << endl;
    }
}
void CoffeeVendingMachine::show() {
    cout << "커피 " << tong[0].getSize() << ",물 " << tong[1].getSize() << ",설탕 " << tong[2].getSize() << endl;
}
void CoffeeVendingMachine::run() {
    int num;
    cout << "****** 커피자판기를 작동합니다. *****" << endl;
    for (;;) {
        cout << "메뉴를 눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>>";
        cin >> num;
        switch (num)
        {
        case 1:
            selectEspresso();
            break;
        case 2:
            selectAmericano();
            break;
        case 3:
            selectsugarCoffee();
            break;
        case 4:
            show();
            break;
        case 5:
            fill();
            show();
            break;
        default:
            cout << "입력오류";
            break;
        }
    }
}
int main() {
    CoffeeVendingMachine p;
    p.run();
}


실행결과



sw는 원료가 비었나를 확인하는 변수입니다.