C++/열혈 C++ 프로그래밍(윤성우 저)

열혈 C++ 프로그래밍 4-3 문제

꾸준함. 2017. 5. 30. 14:05

[1번 문제]

/*

앞서 제시한 문제 4-2 해결하였는가? 당시만 해도 생성자를 설명하지 않은 상황이기 때문에 별도의 초기화

함수를 정의 호출해서 Point, Circle, Ring 클래스의 객체를 초기화 하였다.

구현한 답에 대해서 모든 클래스에 생성자를 정의해보자

*/

#include <iostream>

using namespace std;

 

class Point

{

private:

        int xpos;

        int ypos;

public:

        /*

        void Init(int x, int y)

        {

               xpos = x;

               ypos = y;

        }

        */

        Point(int x, int y) :xpos(x), ypos(y)

        {

        }

        int GetX()

        {

               return xpos;

        }

        int GetY()

        {

               return ypos;

        }

        void ShowPointInfo() const

        {

               cout << "[" << xpos << ", " << ypos << "]" << endl;

        }

};

 

class Circle

{

private:

        Point pos;

        int radius;

public:

        /*

        void Init(int x, int y, int r)

        {

               pos.Init(x, y);

               radius = r;

        }

        */

        Circle(int x, int y, int r):pos(x, y)

        {

               radius = r;

        }

        int GetX()

        {

               return pos.GetX();

        }

        int GetY()

        {

               return pos.GetY();

        }

        int GetR()

        {

               return radius;

        }

};

 

class Ring

{

private:

        Circle c1;

        Circle c2;

public:

        /*

        void Init(int x1, int y1, int r1, int x2, int y2, int r2)

        {

               c1.Init(x1, y1, r1);

               c2.Init(x2, y2, r2);

        }

        */

        Ring(int x1, int y1, int r1, int x2, int y2, int r2) :c1(x1, y1, r1), c2(x2, y2, r2)

        {

        }

        void ShowRingInfo()

        {

               cout << "Inner Circle Info...." << endl << "radius:" << c1.GetR() << endl;

               cout << "[" << c1.GetX() << ", " << c1.GetY() << "]" << endl;

               cout << "Outter Circle Info...." << endl << "radius:" << c2.GetR() << endl;

               cout << "[" << c2.GetX() << ", " << c2.GetY() << "]" << endl;

        }

};

 

int main(void)

{

        Ring ring(1, 1, 4, 2, 2, 9);

        //ring.Init(1, 1, 4, 2, 2, 9);

        ring.ShowRingInfo();

        return 0;

}


[2번 문제]

/*

명함을 의미하는 NameCard 클래스를 정의해보자. 클래스에는 다음의 정보가 저장되어야 한다.

1.성명

2.회사이름

3.전화번호

4.직급

, 직급 정보를 제외한 나머지는 문자열의 형태로 저장을 하되, 길이에 맞는 메모리 공간을 할당 받는 형태로 정의하자

그리고 직급 정보는 int 멤버변수를 선언해서 저장을 하되, 아래의 enum 선언을 활용해야 한다

enum{CLERK, SENIOR, ASSIST, MANAGER};

위의 enum 선언에서 정의된 상수는 순서대로 사원, 주임, 대리, 과장을 뜻한다.

그럼 다음 main 함수와 실행의 예를 참조하여, 문제에서 원하는 형태대로 NameCard 클래스를 완성해보자

int main(void)

{

        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();

        return 0;

}

*/

#include <iostream>

#include <cstring>

using namespace std;

 

namespace COMP_POS

{

        enum

        {

               CLERK, SENIOR, ASSIST, MANAGER

        };

 

        void ShowStatusInfo(int status)

        {

               switch (status)

               {

               case CLERK:

                       cout << "사원" << endl;

                       break;

               case SENIOR:

                       cout << "주임" << endl;

                       break;

               case ASSIST:

                       cout << "대리" << endl;

                       break;

               case MANAGER:

                       cout << "과장" << endl;

               }

        }

}

 

class NameCard

{

private:

        char *Name;

        char *Company;

        char *Phone;

        int Status;

public:

        NameCard(char *name, char *company, char *phone, int status) :Status(status) //생성자

        {

               Name = new char[strlen(name) + 1];

               Company = new char[strlen(company) + 1];

               Phone = new char[strlen(phone) + 1];

               strcpy(Name, name);

               strcpy(Company, company);

               strcpy(Phone, phone);

        }

        void ShowNameCardInfo()

        {

               cout << "이름: " << Name << endl;

               cout << "회사: " << Company << endl;

               cout << "전화번호: " << Phone << endl;

               cout << "직급: ";

               COMP_POS::ShowStatusInfo(Status);

               cout << endl;

        }

        ~NameCard() //소멸자

        {

               delete []Name;

               delete []Company;

               delete []Phone;

        }

};

 

int main(void)

{

        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();

        return 0;

}

 

개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 열혈 C++ 프로그래밍 윤성우 저



반응형