ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 9장 9번
    C++ 2018. 11. 7. 22:42

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



    모든 프린터는 모델명(model), 제조사(manufacturer), 인쇄 매수(printedConut), 인쇄 종이 잔량(availableCount)을 나타내는 정보를 가진다. print(int pages) 함수와 show() 함수는 가상 함수로 구현하라. print(int pages)는 pages 만큼 프린트하는 함수이고, show() 함수는 현재프린트의 모델, 제조사, 인쇄 매수, 인쇄 종이 잔량 등을 출력하는 함수이다.

    잉크젯 프린터는 잉크 잔량(availableInk) 정보를 추가적으로 가지며, 레이저 프린터는 토너 잔량(avialableToner) 정보를 추가적으로 가진다. 이들의 print(int pages) 멤버 함수는 프린터 타입에 맞게 구현하라. 각클래스를 설계 구현하고 다음과 같이 실행되도록 전체 프로그램을 완성하라. inkJetPrinter 객체와 LaserPrinter 객체를 하나만 동적으로 생성하여 시작한다.


    소스코드


    #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;
        }
        virtual void print(int pages) = 0; // 순수 가상함수
        string Model() { return model; }
        string Manufacturer() { return manufacturer; }
        int PrintedCount() { return printedCount; }
        int AvailableConut() { return availableCount; }
        void SetprintedCount(int pages) { printedCount = pages; } // 출력후 인쇄 매수 저장
        void SetavailableCount(int pages) { availableCount = pages; } // 출력후 인쇄 종이 잔량 저장
        virtual void show() = 0; // 순수 가상 함수
    };
    class InkJetPrinter : virtual protected Printer {
        int availableInk; // 잉크 잔량
    public:
        InkJetPrinter(string model, string manufacturer, int pages, int ink) : Printer(model, manufacturer, pages) {
            availableInk = ink;
        }
        void print(int pages) {
            if (pages <= AvailableConut()) { // 인쇄하려는게 잔량보다 적다면
                availableInk -= pages; // 잉크 사용
                int p = PrintedCount() + pages; // 인쇄 매수 증가
                SetprintedCount(p); // 인쇄 매수 저장
                p = AvailableConut() - pages; // 인쇄 잔량 감소
                SetavailableCount(p); // 인쇄 잔량 저장
                cout << "프린트하였습니다" << endl;
            }
            else cout << "용지가 부족하여 프린트 할 수 없습니다" << endl;
        }
        string getModel() { return Model(); }
        string getManufacturer() { return Manufacturer(); }
        int getAvailableConut() { return AvailableConut(); }
        int getAvailableInk() { return availableInk; }
        void show();
    };
    void InkJetPrinter::show() { // 순수 가상함수를 파생 클래스에서 재구현
        cout << "잉크젯 : " << getModel() << " ," << getManufacturer() << " ,남은 종이" << getAvailableConut();
        cout << " ,남은 잉크" << availableInk << endl;
    }
    class LaserPrinter :virtual protected Printer {
        int availableToner; // 토너 잔량
    public:
        LaserPrinter(string model, string manufacturer, int pages, int toner) :Printer(model, manufacturer, pages) {
            availableToner = toner;
        }
        void print(int pages) {
            if (pages <= AvailableConut()) { // 인쇄하려는게 잔량보다 적다면
                availableToner -= pages; // 토너 사용
                int p = PrintedCount() + pages; // 인쇄 매수 증가
                SetprintedCount(p); // 인쇄 매수 저장
                p = AvailableConut() - pages; // 인쇄 잔량 감소
                SetavailableCount(p); // 인쇄 잔량 저장
                cout << "프린트하였습니다" << endl;
            }
            else cout << "용지가 부족하여 프린트 할 수 없습니다" << endl;
        }
        string getModel() { return Model(); }
        string getManufacturer() { return Manufacturer(); }
        int getAvailableConut() { return AvailableConut(); }
        int getAvailableToner() { return availableToner; }
        void show();
    };
    void LaserPrinter::show() { // 순수 가상함수를 파생 클래스에서 재구현
        cout << "레이저 : " << getModel() << " ," << getManufacturer() << " ,남은 종이" << getAvailableConut();
        cout << " ,남은 토너" << availableToner << endl;
    }
    int main() {
        InkJetPrinter *ip = new InkJetPrinter("Officejet V40", "HP", 5, 10);
        LaserPrinter *lp = new LaserPrinter("SCX-6x45", "삼성전자", 3, 20);
        cout << "현재 작동중인 2 대의 프린터는 아래와 같다" << endl;
        ip->show(); lp->show();
        cout << endl;
        for (;;) {
            cout << "프린터(1:잉크젯, 2:레이저)와 매수 입력>>";
            int sw, n; // 프린터 종류와 매수
            cin >> sw >> n;
            if (sw == 1) {
                ip->print(n);
                ip->show();
                lp->show();
            }
            else if (sw == 2) {
                lp->print(n);
                ip->show();
                lp->show();
            }
            else cout << "프린트 종류 입력 에러" << endl;
            cout << "계속 프린트 하시겠습니까(y/n)>>";
            char a; // 판별
            cin >> a;
            if (a == 'n') break;
            cout << endl << endl;
        }
        delete ip; delete lp;
    }


    실행결과




    8장 8번 문제의 print 와 화면에 출력하는것을 순수 가상 함수를 사용하여 이름은 같지만 각 프린터의 고유특성에 맞게 출력하는 함수로 구현합니다.

    프린터 종류와 인쇄 매수를 입력받아, 해당 프린터에 대한 프린트를 진행 하고, 남은 재료들의 용량을 보여줍니다.

    각 프린터의 객체를 동적 생성하고 마지막에 반환합니다.

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

    명품 C++ 9장 Open Challenge  (2) 2018.11.07
    명품 C++ 9장 10번  (0) 2018.11.07
    명품 C++ 9장 7번 8번  (0) 2018.11.06
    명품 C++ 9장 6번  (2) 2018.11.06
    명품 C++ 9장 5번  (0) 2018.11.06

    댓글

© 2018 TISTORY. All rights reserved.