ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 9장 3번 4번
    C++ 2018. 11. 6. 17:26

    3~4 다음 추상 클래스 LoopAdder가 있다.


    class LoopAdder { // 추상 클래스
        string name; // 루프의 이름
        int x, y, sum; // x에서 y까지의 합은 sum
        void read(); // x, y 값을 읽어 들이는 함수
        void write(); // sum을 출력하는 함수
    protected:
        LoopAdder(string name = "") { // 루프의 이름을 받는다. 초깃값은 ""
            this->name = name;
        }
        int getX() { return x; }
        int getY() { return y; }
        virtual int calculate() = 0; // 순수 가상 함수. 루프를 돌며 합을 구하는 함수
    public:
        void run(); // 연산을 진행하는 함수
    };
    void LoopAdder::read() { // x, y 입력
        cout << name << ":" << endl;
        cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";
        cin >> x >> y;
    }
    void LoopAdder::write() { // 결과 sum 출력
        cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다" << endl;
    }
    void LoopAdder::run() {
        read(); // x, y를 읽는다.
        sum = calculate(); // 루프를 돌면서 계산한다.
        write(); // 결과 sum을 출력한다
    }


    3. LoopAdder 클래스를 상속받아 다음 main() 함수와 실해 결과처럼 되도록 ForLoopAdder 클래스를 작성하라. ForLoopAdder 클래스의 calculate() 함수는 for 문을 이용하여 합을 구한다.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class LoopAdder { // 추상 클래스
        string name; // 루프의 이름
        int x, y, sum; // x에서 y까지의 합은 sum
        void read(); // x, y 값을 읽어 들이는 함수
        void write(); // sum을 출력하는 함수
    protected:
        LoopAdder(string name = "") { // 루프의 이름을 받는다. 초깃값은 ""
            this->name = name;
        }
        int getX() { return x; }
        int getY() { return y; }
        virtual int calculate() = 0; // 순수 가상 함수. 루프를 돌며 합을 구하는 함수
    public:
        void run(); // 연산을 진행하는 함수
    };
    void LoopAdder::read() { // x, y 입력
        cout << name << ":" << endl;
        cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";
        cin >> x >> y;
    }
    void LoopAdder::write() { // 결과 sum 출력
        cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다" << endl;
    }
    void LoopAdder::run() {
        read(); // x, y를 읽는다.
        sum = calculate(); // 루프를 돌면서 계산한다.
        write(); // 결과 sum을 출력한다
    }
    class ForLoopAdder : public LoopAdder {
    protected:
        int calculate();
    public:
        ForLoopAdder(string name) : LoopAdder(name) {}
    };
    int ForLoopAdder::calculate() {
        int sum = 0;
        for (int i = getX(); i <= getY(); ++i)
            sum += i;
        return sum;
    }
    int main() {
        ForLoopAdder forLoop("For Loop");
        forLoop.run();
    }


    실행결과



    순수 가상 함수 calculate 를 파생 클래스에서 구현합니다.


    4. LoopAdder 클래스를 상속받아 다음 main() 함수와 실행 결과처럼 되도록 WhileLoopAdder, DoWhileLoopAdder 클래스를 작성하라. while 문, do=while 문을 이용하여 합을 구하도록 calculate() 함수를 각각 작성하면 된다.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class LoopAdder { // 추상 클래스
        string name; // 루프의 이름
        int x, y, sum; // x에서 y까지의 합은 sum
        void read(); // x, y 값을 읽어 들이는 함수
        void write(); // sum을 출력하는 함수
    protected:
        LoopAdder(string name = "") { // 루프의 이름을 받는다. 초깃값은 ""
            this->name = name;
        }
        int getX() { return x; }
        int getY() { return y; }
        virtual int calculate() = 0; // 순수 가상 함수. 루프를 돌며 합을 구하는 함수
    public:
        void run(); // 연산을 진행하는 함수
    };
    void LoopAdder::read() { // x, y 입력
        cout << name << ":" << endl;
        cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";
        cin >> x >> y;
    }
    void LoopAdder::write() { // 결과 sum 출력
        cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다" << endl;
    }
    void LoopAdder::run() {
        read(); // x, y를 읽는다.
        sum = calculate(); // 루프를 돌면서 계산한다.
        write(); // 결과 sum을 출력한다
    }
    class WhileLoopAdder : public LoopAdder {
    protected:
        int calculate();
    public:
        WhileLoopAdder(string name) : LoopAdder(name) {}
    };
    int WhileLoopAdder::calculate() {
        int sum = 0;
        int i = getX();
        while (i <= getY()) {
            sum += i;
            ++i;
        }
            
        return sum;
    }
    class DoWhileLoopAdder : public LoopAdder {
    protected:
        int calculate();
    public:
        DoWhileLoopAdder(string name) : LoopAdder(name) {}
    };
    int DoWhileLoopAdder::calculate() {
        int sum = 0;
        int i = getX();
        do {
            sum += i;
            ++i;
        } while (i <= getY());
        return sum;
    }
    int main() {
        WhileLoopAdder whileLoop("While Loop");
        DoWhileLoopAdder doWhileLoop("Do while Loop");
        whileLoop.run();
        doWhileLoop.run();
    }


    실행결과



    순수 가상 함수를 이용하면 오버라이딩을 통해 두 개 이상의 파생클래스에서 이름은 같지만 다른 기능을 가진 함수를 실행 시킬 수 있습니다.

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

    명품 C++ 9장 6번  (2) 2018.11.06
    명품 C++ 9장 5번  (0) 2018.11.06
    명품 C++ 9장 1번 2번  (0) 2018.11.06
    명품 C++ 8장 Open Challenge  (0) 2018.11.04
    명품 C++ 8장 9번  (5) 2018.11.04

    댓글

© 2018 TISTORY. All rights reserved.