ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 8장 8번
    C++ 2018. 11. 4. 20:20

    8. 다음 그림과 같은 상속 구조를 갖는 클래스를 설계한다.

    모든 프린터는 모델명(model), 제조사(manufacturer), 인쇄 매수(printedCount), 인쇄 종이 잔량(availableCount)을 나타내는 정보와 print(int pages) 멤버 함수를 가지며, printf()가 호출할 때마다 pages 매의 용지를 사용한다. 잉크젯 프린터는 잉크 잔량(availableInk) 정보와 printInkJet(int pages) 멤버 함수를 추가적으로 가지며, 레이저 프린터는 토너 잔량(availableToner) 정보와 역시 printLaser(int pages) 멤버 함수를 추가적으로 가진다. 각 클래스에 적절한 접근 지정으로 멤버 변수와 함수, 생성자, 소멸자를 작성하고, 다음과 같이 실행되도록 전체 프로그램을 완성하라. 잉크젯 프린터 객체와 레이저 프린터 객체를 각각 하나만 동적 생성하여 시작한다.





    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Printer {
        string model; // 모델명
        string manufacturer; // 제조자
        int printedCount; // 인쇄 매수
        int availableCount; // 인쇄 종이 잔량
    protected:
        Printer(string model, string manufacturer, int pages) {
            this->model = model; this->manufacturer = manufacturer; this->availableCount = pages; printedCount = 0;
        }
        void print(int pages) {
            printedCount += pages;
            availableCount -= pages;
        }
        string Model() { return model; }
        string Manufacturer() { return manufacturer; }
        int PrintedCount() { return printedCount; }
        int AvailableConut() { return availableCount; }
    };
    class InkJetPrinter : virtual protected Printer {
        int availableInk; // 잉크 잔량
    public:
        InkJetPrinter(string model, string manufacturer, int pages, int ink) : Printer(model, manufacturer, pages) {
            availableInk = ink;
        }
        int printInkJet(int pages) {
            int sw;
            if (pages <= AvailableConut() && pages <= availableInk) {
                print(pages);
                availableInk -= pages;
                sw = 1;
            }
            else if (pages > AvailableConut() && pages <= availableInk)
                sw = 2;
            else if (pages <= AvailableConut() && pages > availableInk)
                sw = 3;
            else
                sw = 4;
            return sw;
        }
        string getModel() { return Model(); }
        string getManufacturer() { return Manufacturer(); }
        int getAvailableConut() { return AvailableConut(); }
        int getAvailableInk() { return availableInk; }
    };
    class LaserPrinter :virtual protected Printer {
        int availableToner; // 토너 잔량
    public:
        LaserPrinter(string model, string manufacturer, int pages, int toner) :Printer(model,manufacturer,pages) {
            availableToner = toner;
        }
        int printLaser(int pages) {
            int sw;
            if (pages <= AvailableConut() && pages <= availableToner) {
                print(pages);
                availableToner -= pages;
                sw = 1;
            }
            else if (pages > AvailableConut() && pages <= availableToner)
                sw = 2;
            else if (pages <= AvailableConut() && pages > availableToner)
                sw = 3;
            else
                sw = 4;
            return sw;
        }
        string getModel() { return Model(); }
        string getManufacturer() { return Manufacturer(); }
        int getAvailableConut() { return AvailableConut(); }
        int getAvailableToner() { return availableToner; }
    };
    int main() {
        InkJetPrinter *ip = new InkJetPrinter("Officejet V40", "HP", 5, 10);
        LaserPrinter *lp = new LaserPrinter("SCX-6x45", "삼성전자", 3, 20);
        cout << "현재 작동중인 2 대의 프린트는 아래와 같다" << endl;
        cout << "잉크젯 : " << ip->getModel() << " ," << ip->getManufacturer();
        cout << " ,남은 종이" << ip->getAvailableConut();
        cout<< "장 ,남은 잉크 " << ip->getAvailableInk() << endl;
        cout << "레이저 : " << lp->getModel() << " ," << lp->getManufacturer() ;
        cout << " ,남은 종이" << lp->getAvailableConut();
        cout<< "장 ,남은 잉크 " << lp->getAvailableToner() << endl << endl;
        for (;;) {
            cout << "프린터(1:잉크젯, 2:레이저)와 매수 입력>>";
            int sw, n; // 프린터 종류와 매수
            cin >> sw >> n;
            if (sw == 1) {
                switch (ip->printInkJet(n)) {
                case 1:cout << "프린트하였습니다" << endl; break;
                case 2:cout << "용지가 부족하여 프린트할 수 없습니다." << endl; break;
                case 3:cout << "잉크가 부족하여 프린트할 수 없습니다." << endl; break;
                case 4:cout << "용지와 잉크가 모두 부족하여 프린트할 수 없습니다." << endl; break;
                }
                cout << "잉크젯 : " << ip->getModel() << " ," << ip->getManufacturer();
                cout << " ,남은 종이" << ip->getAvailableConut();
                cout << "장 ,남은 잉크 " << ip->getAvailableInk() << endl;
                cout << "레이저 : " << lp->getModel() << " ," << lp->getManufacturer();
                cout << " ,남은 종이" << lp->getAvailableConut();
                cout << "장 ,남은 잉크 " << lp->getAvailableToner() << endl;
            }
            else if (sw == 2) {
                switch (lp->printLaser(n)) {
                case 1:cout << "프린트하였습니다" << endl; break;
                case 2:cout << "용지가 부족하여 프린트할 수 없습니다." << endl; break;
                case 3:cout << "토너가 부족하여 프린트할 수 없습니다." << endl; break;
                case 4:cout << "용지와 토너가 모두 부족하여 프린트할 수 없습니다." << endl; break;
                }
                cout << "잉크젯 : " << ip->getModel() << " ," << ip->getManufacturer();
                cout << " ,남은 종이" << ip->getAvailableConut();
                cout << "장 ,남은 잉크 " << ip->getAvailableInk() << endl;
                cout << "레이저 : " << lp->getModel() << " ," << lp->getManufacturer();
                cout << " ,남은 종이" << lp->getAvailableConut();
                cout << "장 ,남은 잉크 " << lp->getAvailableToner() << endl;
            }
            else cout << "프린트 종류 입력 에러" << endl;
            cout << "계속 프린트 하시겠습니까(y/n)>>";
            char a; // 판별
            cin >> a;
            if (a == 'n') break;
            cout << endl << endl;
        }
    delete ip; delete lp;
    }


    실행결과




    cout 를 여러개 쓴거는 블로그 포스팅을 위함입니다.


    잉크젯 프린터와 레이저 프린터는 프린터를 상속받기때문에 나중에 새로운 클래스를 생성할 때, 모호성의 문제가 생길 수 있으므로 가상 상속을 하였습니다.


    접근할 수 있는 멤버가 어떤것인지 잘 판단하여 함수를 작성해야합니다.


    스위치문을 사용하여 어떤 재료가 부족한지 더 정확하게 판단하였습니다.


    프린터 객체를 동적 생성했으므로 반환해주어야합니다.



    'C++' 카테고리의 다른 글

    명품 C++ 8장 Open Challenge  (0) 2018.11.04
    명품 C++ 8장 9번  (5) 2018.11.04
    명품 C++ 8장 7번  (0) 2018.11.04
    명품 C++ 8장 5번 6번  (0) 2018.11.04
    명품 C++ 8장 3번 4번  (0) 2018.11.04

    댓글

© 2018 TISTORY. All rights reserved.