윤성우의 열헐 C++

윤성우의 열혈 c++) Chapter 04. 클래스의 완성

tose33 2022. 3. 14. 21:59

문제 04-1 [정보은닉과 const]

#include <iostream>
using namespace std;

class FruitSeller
{
private:
    int APPLE_PRICE;
    int numOfApples;
    int myMoney;
    
public:
    void InitMembers(int price, int num, int money)
    {
        APPLE_PRICE = price;
        numOfApples = num;
        myMoney = money;
    }
    
    int SaleApples(int money)
    {
        if(money < 0)
        {
            cout << "0개 이상의 사과 구매만 가능합니다" << endl;
            return 0;
        }
        int num = money / APPLE_PRICE;
        numOfApples -= num;
        myMoney += money;
        return num;
    }
    
    void ShowSalesResult() const 
    {
        cout << "남은 사과: " << numOfApples << endl;
        cout << "판매 수익: " << myMoney << endl;
    }
    
    int GetApples() const
    {
        return numOfApples;
    }
};

class FruitBuyer
{
private:
    int myMoney;
    int numOfApples;
    
public:
    void InitMembers(int money)
    {
        myMoney = money;
        numOfApples = 0;
    }
    
    void BuyApples(FruitSeller &seller, int money)
    {
        if(seller.GetApples() < 0)
        {
            cout << "0개 이상의 사과 구매만 가능합니다" << endl;
            return;
        }
        numOfApples += seller.SaleApples(money);
        myMoney -= money;
    }
    
    void ShowBuyResult() const 
    {
        cout << "현재 잔액: " << myMoney << endl;
        cout << "사과 개수: " << numOfApples << endl;
    }
};

 


문제 04-2 [다양한 클래스의 정의]

#include <iostream>
using namespace std;

class Point
{
private:
    int xpos, ypos;

public:
    void Init(int x, int y)
    {
        xpos = x;
        ypos = y;
    }

    void ShowPointInfo() const
    {
        cout << "[" << xpos << ", " << ypos << "]" << endl;
    }

    int GetX() const
    {
        return xpos;
    }

    int GetY() const
    {
        return ypos;
    }
};

class Circle
{
private:
    Point center;
    int rad;

public:
    void Init(int x, int y, int _rad)
    {
        center.Init(x, y);
        rad = _rad;
    }

    void ShowCircleInfo() const
    {
        cout << "radius: " << rad << endl;
        center.ShowPointInfo();
    }
};

class Ring
{
private:
    Circle innerCircle;
    Circle outterCircle;

public:
    void Init(int innerX, int innerY, int innerRad, int outterX, int outterY, int outterRad)
    {
        innerCircle.Init(innerX, innerY, innerRad);
        outterCircle.Init(outterX, outterY, outterRad);
    }

    void ShowRingInfo()
    {
        cout << "Inner Circle Info..." << endl;
        innerCircle.ShowCircleInfo();
        cout << "Outter Circle Info..." << endl;
        outterCircle.ShowCircleInfo();
    }
};

int main()
{
    Ring ring;
    ring.Init(1, 1, 4, 2, 2, 9);
    ring.ShowRingInfo();
}

 

문제 04-3 [C++ 기반의 데이터 입출력] 

문제 1

#include <iostream>
using namespace std;

class Point
{
private:
    int xpos, ypos;

public:
    Point(int x, int y): xpos(x), ypos(y) {}

    void ShowPointInfo() const
    {
        cout << "[" << xpos << ", " << ypos << "]" << endl;
    }

    int GetX() const
    {
        return xpos;
    }

    int GetY() const
    {
        return ypos;
    }
};

class Circle
{
private:
    Point center;
    int rad;

public:
    Circle(Point _center, int _rad)
    : center(_center), rad(_rad) {}

    void ShowCircleInfo() const
    {
        cout << "radius: " << rad << endl;
        center.ShowPointInfo();
    }
};

class Ring
{
private:
    Circle innerCircle;
    Circle outterCircle;

public:
    Ring(int innerX, int innerY, int innerRad, int outterX, int outterY, int outterRad)
    : innerCircle(Point(innerX, innerY), innerRad), outterCircle(Point(outterX, outterY), outterRad) {}

    void ShowRingInfo()
    {
        cout << "Inner Circle Info..." << endl;
        innerCircle.ShowCircleInfo();
        cout << "Outter Circle Info..." << endl;
        outterCircle.ShowCircleInfo();
    }
};

int main()
{
    Ring ring(1, 1, 4, 2, 2, 9);
    ring.ShowRingInfo();
}

 

문제 2

#include <iostream>
#include <cstring>
using namespace std;

namespace COMP_POS
{
    enum { CLERK, SENIOR, ASSIST, MANAGER };

    void ShowRank(int _rank)
    {
        switch(_rank)
        {
            case CLERK:
                cout << "사원" << endl;
                break;
            case SENIOR:
                cout << "주임" << endl;
                break;
            case ASSIST:
                cout << "대리" << endl;
                break;
            case MANAGER:
                cout << "과장" << endl;
                break;
        }
    }
}

class NameCard
{
private:
    char * name;
    char * company;
    char * phoneNumber;
    int rank;

public:
    NameCard(char * _name, char * _company, char * _phoneNumber, int _rank) : rank(_rank)
    {
        name = new char[strlen(_name)+1];
        strcpy(name, _name);

        company = new char[strlen(_company)+1];
        strcpy(company, _company);

        phoneNumber = new char[strlen(_phoneNumber)+1];
        strcpy(phoneNumber, _phoneNumber);
    }

    void ShowNameCardInfo()
    {
        cout << "이름: " << name << endl;
        cout << "회사: " << company << endl;
        cout << "전화번호: " << phoneNumber << endl;
        cout << "직급: "; COMP_POS::ShowRank(rank);
        cout << endl;
    }

    ~NameCard()
    {
        delete name;
        delete company;
        delete phoneNumber;
    }
};

int main()
{
    NameCard manClerk("Lee", "ABCEng", "010-1111-2222", COMP_POS::CLERK);
    NameCard manSENIOR("Hong", "OrangeEng", "010-3333-4444", COMP_POS::SENIOR);
    NameCard manAssist("Kim", "SoGoodComp", "010-5555-6666", COMP_POS::ASSIST);

    manClerk.ShowNameCardInfo();
    manSENIOR.ShowNameCardInfo();
    manAssist.ShowNameCardInfo();
}