ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cpp] 지금까지 배운 것 실습
    C++(cpp) 2021. 6. 23. 18:50

    커피숍에 가서 커피 주문하는 예제

     

    객체, 클래스만들고 메소드 사용하고 파일 나누는 것까지 공부했다.

    coffee.h

    #include <iostream>
    #include <string.h>
    
    class Menu {
        int menu_id;
        int price;
        char const* menu_name;
    
        public:
        Menu();
    
        Menu(int price_, char const* menu_name_, int menu_id_);
    
        char const* getMenuName() const { return (menu_name); }
    
        int getPrice() const { return (price); }
        
        int getId() const { return (menu_id); }
    
        void printMenu();
    };
    
    
    
    class MenuBoard {
        Menu *menus[100];
        int menu_num;
    
        public:
        MenuBoard();
    
        MenuBoard(char *menu_name, int price);
        
        void printMenu();
    
        void addMenuBoard(char const* menu_name, int price);
    
        Menu getMenuByName(char const* menu_name_);
    };
    
    
    class Guest{
        Menu *menu;
        char const* guest_name;
        int wallet;
        
        public:
        Guest(int wallet_, char const* guest_name_);
    
        void orderCoffee(MenuBoard const& mb, Menu const& menu);
        
        int hasMoney(int price);
    
        char const* getGuestName(){ return (guest_name); }
    
        void getCoffee();
    
        void getOffShop();
    
        void drinkCoffee();
    };
    
    class Cashier{
        Menu *new_menu;
        char const* menu_name;
        char const* _cashier_name;
        int price;
        int id;
    
        public:
        Cashier(char const* cashier_name): _cashier_name(cashier_name){};
        
        int takeAnOrder(const Menu &menu);
    };
    
    class Barista{
        char const* _barista_name;
    
        public:
        Barista(char const* barista_name) : _barista_name(barista_name)
        {}
    
        void brewCoffee(Menu const& menu);
        
    };
    
    class Cafe {
        Cashier _cashier;
        MenuBoard _menu;
        Barista _barista;
    
        public:
        Cafe(Cashier casher, Barista barista, MenuBoard menu): _cashier(casher), _barista(barista), _menu(menu)
        {
        }
        void receiveMenu(Guest& guest, Menu const& menu);
    };

    coffee.cpp

    #include "coffee.h"
    
    void Menu::printMenu()
    {
            std::cout << "\n[ " << menu_name << " ]"<< std::endl;
            std::cout << "menu id: " << menu_id << std::endl;
            std::cout << "price: " << price << std::endl;
    };
    
    Menu::Menu() {
        menu_name = NULL;
        price = 0;
        menu_id = 0;
    };
    
    Menu::Menu(int price_, char const* menu_name_, int menu_id_) {
        menu_name = menu_name_;
        price = price_;
        menu_id = menu_id_;
        };
    
    MenuBoard::MenuBoard(){
        menu_num = 0;
    };
    
    MenuBoard::MenuBoard(char *menu_name, int price){
        menu_num = 0;
        addMenuBoard(menu_name, price);
    };
    
    void MenuBoard::printMenu(){
        std::cout << "<<<<<< MENU >>>>>>" << std::endl;
        for (int i = 0; i < menu_num; i++)
            menus[i]->printMenu();
        std::cout << "<<<<<<<<<>>>>>>>>>\n" << std::endl;
    };
    void MenuBoard::addMenuBoard(char const* menu_name, int price)
    {
        Menu *new_menu = new Menu(price, menu_name, menu_num);
        menus[menu_num] = new_menu;
        menu_num++; 
    };
    Menu MenuBoard::getMenuByName(char const* menu_name_)
    {
        for (int i = 0; i < menu_num; i++){
            if (!strcmp(menus[i]->getMenuName(), menu_name_))
                return (*menus[i]);
        }
        return (Menu(0, menu_name_, -1)); 
    };
    
    Guest::Guest(int wallet_, char const* guest_name_){
        guest_name = guest_name_;
        wallet = wallet_;
    }
    void Guest::orderCoffee(MenuBoard const& mb, Menu const& menu){
        char const* menu_name = menu.getMenuName();
        std::cout << "GUEST(" << guest_name << "): " << std::ends;
        std::cout << menu_name << "주세요." << std::endl;
    }
    
    int Guest::hasMoney(int price)
    {
        if (wallet > price) return 1;
        else return wallet - price;
    }
    
    void Guest::getCoffee(){
        std::cout << "[ " << guest_name << "가 커피를 받았습니다.]" << std::endl;
    }
    void Guest::getOffShop(){
        std::cout << "[ " << guest_name << "가 가게를 나갔습니다.]" << std::endl;
    }
    void Guest::drinkCoffee(){
        std::cout << "GUEST(" << guest_name << "): " << std::ends;
        std::cout << "너무 맛있어요. 다음에 또 올게요." << std::endl;
    }
    
    int Cashier::takeAnOrder(const Menu &menu){
        menu_name = menu.getMenuName();
        price = menu.getPrice();
        id = menu.getId();
        std::cout << "CASHIER(" << _cashier_name << "): " << std::ends;
        if (id == -1)
        {
            std::cout << "그런 메뉴는 없습니다." << std::endl;
            return (1);
        }
        std::cout << menu_name << "로 하시겠어요? 가격은 " << price << "입니다." << std::endl;
        return (0);
    };
    
    void Barista::brewCoffee(Menu const& menu)
    {
        std::cout << "BARISTA(" << _barista_name << "): " << std::ends;
        std::cout << "여기 " << menu.getMenuName() << "나왔습니다." << std::endl;
    }
    
    void Cafe::receiveMenu(Guest& guest, Menu const& menu)
    {
        char const* guest_name = guest.getGuestName();
        guest.orderCoffee(_menu, menu);
        if (_cashier.takeAnOrder(menu))
        {
            std::cout << "" << std::endl;
            return ;
        }
        int price = menu.getPrice();
        int moneyStatus = guest.hasMoney(price);
        if (moneyStatus == 1)
        {
            std::cout << "GUEST(" << guest_name << "): " << std::ends;
            std::cout << "여기 " << price << "원이요." << std::endl;
            _barista.brewCoffee(menu);
            guest.getCoffee();
            guest.drinkCoffee();
        }
        else {
            std::cout << "[ " << moneyStatus * -1 << "원이 모자랍니다. ]" << std::endl;
            std::cout << "GUEST(" << guest_name << "): " << std::ends;
            std::cout << "돈 벌고 다시 올게요." << std::endl;
        }
        guest.getOffShop();
        std::cout << "" << std::endl;
    }
    

     

    coffee_main.cpp

    #include "coffee.h"
    
    int
        main()
    {
        MenuBoard   menu_board;
        Cashier     sumoon("sumoon");
        Cashier     taehokim("taehokim");
        Barista     dongslee("dongslee");
        Barista     juepark("juepark");
        
        menu_board.addMenuBoard("아메리카노", 5000);
        menu_board.addMenuBoard("라떼", 5500);
        menu_board.addMenuBoard("플랫화이트", 5500);
        menu_board.addMenuBoard("생수", 1000);
        
        Cafe        cafe(sumoon, dongslee, menu_board);
        Cafe        cafe2(taehokim, juepark, menu_board);
        while (1)
        {
            std::string guest_name;
            std::string menu_name;
            int    wallet;
    
            std::cout << "당신의 이름은: ";
            std::cin >> guest_name;
            char* guest_name_str = const_cast<char*>(guest_name.c_str());
            std::cout << "지갑에 얼마나 가지고 있습니까?: " << std::ends;
            std::cin >> wallet;
            menu_board.printMenu();
            std::cout << "무엇을 주문하시겠어요?: " << std::ends;
            std::cin >> menu_name;
            char* menu_name_str = const_cast<char*>(menu_name.c_str());
    
            Guest       guest(wallet, guest_name_str);
            Menu ordering = menu_board.getMenuByName(menu_name_str);
            cafe.receiveMenu(guest, ordering);
        }
    }

    'C++(cpp)' 카테고리의 다른 글

    [cpp] explicit, mutable 키워드  (0) 2021.06.24
    [cpp] 소멸자, 복사 생성자  (0) 2021.06.24
    [cpp] 함수 오버로딩, 생성자, 디폴트 생성자  (0) 2021.06.21
    [cpp]객체, 클래스, 접근 제어자  (0) 2021.06.21
    [cpp] new, delete  (0) 2021.06.21

    댓글

Designed by Tistory + Edited by Juepark