(업데이트 완료) c++ 상속 문제 풀이

한정화·2023년 3월 4일
0

#230304 토~


명품 c++ 프로그래밍 8장 상속 실습문제!

1번

#include <iostream>
using namespace std;

class Circle{
protected:      //NamedCircle이 radius에 접근할 수 있도록 protected변수로 선언 
    int radius;
public:
    Circle(int radius=0) {this->radius = radius;}
    int getRadius(){return radius;}
    void setRadius(int radius){this->radius=radius;}
    double getArea(){return 3.14*radius*radius;}
};

class NamedCircle : public Circle{
    string name;
public:
    NamedCircle(int r, string name) : Circle(r) /*Circle 클래스에 r 매개변수 전달*/{
        this->name=name;}
    void show(){cout<<"반지름이"<<radius<<"인"<<name<<endl;}
};

int main(){
    NamedCircle waffle(3, "waffle");
    waffle.show();
}

2번

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

class Circle{
protected:
    int radius;
public:
    Circle(int radius=0) {this->radius = radius;}
    int getRadius(){return radius;}
    void setRadius(int radius){this->radius=radius;}
    double getArea(){return 3.14*radius*radius;}
};

class NamedCircle : public Circle{
    string name;
public:
    NamedCircle() : Circle(0){name="기본 피자";}
    void setCircle(int r, string name) // : Circle(r) 
    { radius = r; this->name=name;} 
    // 자식 생성자의 경우에만 부모 생성자의 명시적 호출 가능
    // 일반 함수에서는 Circle 생성자 호출 불가! setRadius 함수를 호출하거나 protected로 선언된 radius에 직접 저장하기
    void show(){cout<<name;}
};

int main(){
    NamedCircle pizza[3];

    for(int i=0;i<3;i++){
        cout<<i+1<<">> ";
        string stmp;
        int itmp;
        cin>>itmp>>stmp;
        pizza[i].setCircle(itmp,stmp);
    }

    int max = 0;
    int maxidx = -1;
    for(int i=0;i<3;i++){
        if(pizza[i].getRadius() > max) max = pizza[i].getRadius(); maxidx = i;
        cout<<max;
    }
    cout<<"가장 면적이 큰 피자는 ";
    pizza[maxidx].show();
    cout<<"입니다.";
}

홍대 스마트 코딩 문제

8. 가상 함수 오버라이딩 연습(2)

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

class Person{
protected:
    string name;
public:
    Person(string n){name = n;}
    virtual void printInfo(){cout<<name<<" 입니다.\n";}
};

class Student : public Person{
public:
    Student(string n) : Person(n){};
    void printInfo(){cout<<name<<"학생입니다.\n";}
};

class Teacher : public Person{
public:
    Teacher(string n) : Person(n){};
    void printInfo(){cout<<name<<"선생입니다.\n";}
};

int main(){
    Person a("지민"); 
    Student b("윤관"); 
    Teacher c("영식");
    Person *p;
    p = &a; p->printInfo();
    p = &b; p->printInfo();
    p = &c; p->printInfo();
}
  1. 업캐스팅 활용
#include <iostream>
#include <string>
using namespace std;

class Person{
protected:
    string name;
public:
    Person(string n){name = n;}
    virtual void printInfo(){cout<<name<<" 입니다.\n";}
};

class Student : public Person{
public:
    Student(string n) : Person(n){};
    void printInfo(){cout<<name<<"학생입니다.\n";}
};

class Teacher : public Person{
public:
    Teacher(string n) : Person(n){};
    void printInfo(){cout<<name<<"선생입니다.\n";}
};

int main(){
    Person *p[5];
    string s; int n;
    for(int i=0;i<5;i++){
        cout<<"이름 입력: ";
        cin>>s;
        cout<<"유형 입력";
        cin>>n;
        if(n==1) p[i] = new Person(s);
        else if(n==2) p[i] = new Student(s);
        else if(n==3) p[i] = new Teacher(s);
    }
    for(int i=0;i<5;i++){
        p[i]->printInfo();
    }
}

12. 계산기 클래스

#include <iostream>
using namespace std;

class Cal{
protected :
    int a, b;
public : 
    void set(int x, int y){
        a = x; b = y;
    }
    virtual int calculate()=0;
}; 

class Plus : public Cal{
public:
    int calculate(){return a+b;}
};

class Minus : public Cal{
public:
    int calculate(){return a-b;}
};

class Multiply : public Cal{
public:
    int calculate(){return a*b;}
};

class Division : public Cal{
public:
    int calculate(){return a/b;}
};

int main(){
    Plus p; Minus m; Multiply mu; Division d;
    Cal *cp = NULL;
    int a, b;
    char c; 
    while(1){
        cout<<"식 입력: ";
        cin>>a>>c>>b;
        if(a==0 && b==0 && c=='0') break; 
        if(c=='+') cp = &p; 
        if(c=='-') cp = &m;
        if(c=='*') cp = &mu; 
        if(c=='/') cp = &d; 
        
        cp->set(a, b);
        cout<<"계산 결과는 "<<cp->calculate()<<"입니다.\n";
    }
    cout<<"프로그램을 종료합니다."; 
}

14. 직원 관리 프로그램

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

class LTWworker{
protected:
    string name;
public:
    LTWworker(string n) : name(n) {};
    virtual void printInfo() = 0;
    virtual int getWage() = 0;
}; 

class Employee : public LTWworker{
protected:
    int wage;
public:
    Employee(string n, int w) : LTWworker(n), wage(w) {};
    void printInfo() {cout<<"사원  "<<name<<"  "<<wage<<"만 원\n";}
    int getWage(){return wage;}
};

class ExEmployee : public LTWworker{
protected:
    int wage;
    double bonus;
public:
    ExEmployee(string n, int w, double b) : LTWworker(n), wage(w), bonus(b) {wage += wage*b;}
    void printInfo() {cout<<"우수  "<<name<<"  "<<wage<<"만 원\n";}
    int getWage(){return wage;}
};

class Teacher : public LTWworker{
protected:
    int t;
    int wage;
public:
    Teacher(string n, int t, int tw) : LTWworker(n), t(t) {wage = t*tw;}
    void printInfo(){cout<<"선생님  "<<name<<"  "<<wage<<"만 원\n";}
    int getWage(){return wage;}
};

class workerManager{
    LTWworker* larray[100];
    int size;
public:
    workerManager(){size=0;}
    
    void addWorker(){
        int Type;
        cout<<"근무 유형 선택(1-사원 2-우수사원 3-선생님): ";
        cin>>Type;
        
        if(Type==1){
            string n; int w;
            cout<<"이름 월급 입력: ";
            cin>>n>>w;
            larray[size] = new Employee(n, w);
        }
        
        else if(Type==2){
            string n; int w; double b;
            cout<<"이름 월급 보너스비율 입력: ";
            cin>>n>>w>>b;
            larray[size] = new ExEmployee(n, w, b);
        }
        
        else if(Type==3){
            string n; int h; int tw;
            cout<<"이름 근무시간 시급 입력: ";
            cin>>n>>h>>tw;
            larray[size] = new Teacher(n, h, tw);
        }
        
        size++;
        cout<<"등록 완료!\n";
    }
    
    void GetWorkersInfo(){
        for(int i=0;i<size;i++){
            larray[i]->printInfo();
        }
    }
    
    void getTotalWage(){
        int sum=0;
        for(int i=0;i<size;i++){
            sum+=larray[i]->getWage();
        }
        cout<<"직원 월급 총 합계: "<<sum<<"만 원\n";
    }
};


int main(){
    cout<<"=======================\n";
    cout<<"1. 직원 추가\n";
    cout<<"2. 전체 직원 정보 출력\n";
    cout<<"3. 전체 직원의 월급 합 계산\n";
    cout<<"4. 프로그램 종료\n";
    cout<<"=======================\n";
    
    workerManager wm;
    
    int fn;
    while(1){
        cout<<"기능 선택: ";
        cin>>fn;
        
        if(fn==1) wm.addWorker();
        if(fn==2) wm.GetWorkersInfo();
        if(fn==3) wm.getTotalWage();
        if(fn==4) break;
        cout<<"\n";
    }
    
    cout<<"프로그램을 종료합니다.\n";
    
    return 0;
}

17. 가상 소멸자 연습

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

class Data{
protected:
    int n;
public:
    Data(int N) : n(N) {};
    virtual void show()=0;  //순수 가상 함수
    virtual ~Data(){};  //가상 상속을 위해 정의
};

class nameData : public Data{
    char*name;
public:
    nameData(int n, const char* str) : Data(n) {strcmp(str, name);}
    void show(){
        cout<<"데이터 이름 "<<name<<"\n";
        cout<<"값: "<<n<<"\n";
    }
    ~nameData(){delete[] name;};
};

int main(){
    Data*p = new nameData(321, "San's birthday");
    p->show();
    delete p;
}

20. 다중 상속, 가상 상속 연습

#include <iostream>
using namespace std; 

class data{
protected:
    double a, b;
};

class Mul : virtual public data{  //가상 상속
protected:
    double mulF(){return a*b;}
};

class Div : virtual public data{  //가상 상속
protected:
    double divF(){return a/b;}
};

class calculator : public Mul, public Div{  //다중 상속
    char op;
public:
    void input(){
        cout<<"수식 입력: ";
        cin>>a>>op>>b;
    }
    double calculate(){
        if(op=='*') return mulF();
        else return divF();
    }
};

int main(){
    calculator C;
    C.input();
    cout<< C.calculate(); 
}

0개의 댓글