언어 자료구조 알고리즘/디딤돌 C++

[C++] 44. 상속과 다형성 최종 실습 - 코드

언제나휴일 2016. 4. 25. 01:03
반응형


상속과 다형성 최종 실습 - 코드


상속과 다형성 실습.zip


상속과 다형성 최종 실습한 코드예요.

//StuConst.h

#pragma once

class StuConst

{

public:

    static const int def_iq;

    static const int max_iq;

    static const int min_iq;

 

    static const int def_hp;

    static const int max_hp;

    static const int min_hp;

 

    static const int def_stress;

    static const int max_stress;

    static const int min_stress;

 

    static const int def_scnt;

    static const int max_scnt;

    static const int min_scnt;

   

private://개체를 생성할 수 없게 함

    StuConst(void);   

};

 

//StuConst.cpp

#include "StuConst.h"

const int StuConst::def_iq = 100;

const int StuConst::max_iq=200;

const int StuConst::min_iq=0;

            

const int StuConst::def_hp=100;

const int StuConst::max_hp=200;

const int StuConst::min_hp=0;

            

const int StuConst::def_stress=0;

const int StuConst::max_stress=100;

const int StuConst::min_stress=0;

            

const int StuConst::def_scnt=0;

const int StuConst::max_scnt=5;

const int StuConst::min_scnt=0;

 

StuConst::StuConst(void)

{

}

 

//Student.h

#pragma once

#include "StuConst.h"

#include <iostream>

#include <string>

using namespace std;

class Student

{

    static int last_pn;

    const int pn;

    string name;

    int iq;

    int hp;

    int stress;

    int scnt;

public:

    Student(string name);

    virtual void Study()=0;

    virtual void ListenLecture()=0;

    virtual void Sleep()=0;

    virtual void Relax()=0;

    virtual void Drink()=0;

    virtual void Sing()=0;

    virtual void View()const;

    int GetPN()const;

    string GetName()const;

    int GetIQ()const;

    int GetHP()const;

    int GetStress()const;

    int GetSCnt()const;

protected:

    void SetIQ(int iq);

    void SetHP(int hp);

    void SetStress(int stress);

    void SetSCnt(int scnt);   

};

 

//Student.cpp

#include "Student.h"

#define SC StuConst //간략하게 사용할 수 있게 매크로 정의

 

int Student::last_pn;

Student::Student(string name):pn(++last_pn)

{

    this->name = name;

    SetIQ(SC::def_iq);

    SetHP(SC::def_hp);   

    SetStress(SC::def_stress);

    SetSCnt(SC::def_scnt);

}

void Student::View()const

{

    cout<<"주민 번호:"<<pn<<" 이름:"<<name<<endl;

    cout<<"  IQ:"<<iq<<" HP:"<<hp<<" Stress:"<<stress<<endl;

    cout<<연속으로 공부한 횟수:"<<scnt<<endl;

}

int Student::GetPN()const

{

    return pn;

}

string Student::GetName()const

{

    return name;

}

int Student::GetIQ()const

{

    return iq;

}

int Student::GetHP()const

{

    return hp;

}

int Student::GetStress()const

{

    return stress;

}

int Student::GetSCnt()const

{

    return scnt;

}

 

void Student::SetIQ(int iq)

{

    if(iq>SC::max_iq)

    {

        iq = SC::max_iq;

    }

    if(iq<SC::min_iq)

    {

        iq = SC::min_iq;

    }

    this->iq = iq;

}

void Student::SetHP(int hp)

{

    if(hp>SC::max_hp)

    {

        hp = SC::max_hp;

    }

    if(hp<SC::min_hp)

    {

        hp = SC::min_hp;

    }

    this->hp = hp;

}

 

 

void Student::SetStress(int stress)

{

    if(stress>SC::max_stress)

    {

        stress = SC::max_stress;

    }

    if(stress<SC::min_stress)

    {

        stress = SC::min_stress;

    }

    this->stress = stress;

}

void Student::SetSCnt(int scnt)

{

    if(scnt>SC::max_scnt)

    {

        scnt = SC::max_scnt;

    }

    if(scnt<SC::min_scnt)

    {

        scnt = SC::min_scnt;

    }

    this->scnt = scnt;

}

//SStudent.h

#pragma once

#include "student.h"

class SStudent :

    public Student

{

    int dummy;

    int total_scnt;

public:

    SStudent(string name); 

    virtual void Study();

    virtual void ListenLecture();

    virtual void Sleep();

    virtual void Relax();

    virtual void Drink();

    virtual void Sing();

    virtual void View()const;

    void Reading();

};

//SStudent..cpp

#include "SStudent.h"

 

SStudent::SStudent(string name):Student(name)

{

    dummy = 0;//더미 뇌는 생성 시 0

    total_scnt = 0;

}

 

void SStudent::Study()

{

    SetHP(GetHP()-5);//체력 5소모

    SetIQ(GetIQ()+GetSCnt()+dummy);//지력: scnt+더미 뇌 증가

    SetStress(GetStress()-2);//스트레스: 2감소

    SetSCnt(GetSCnt()+1);

    total_scnt++;

 

    if(total_scnt%5 == 0)//더미 뇌는 공부한 회수가 5의 배수가 될 때마다 1씩 증가

    {

        dummy++;

    }

}

 

void SStudent::ListenLecture()

{

    SetHP(GetHP()-3); //체력 3소모

    SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가

    SetStress(GetStress()+GetSCnt());// 스트레스: scnt증가

    SetSCnt(0);

}

 

void SStudent::Sleep()

{

    SetHP(GetHP()+10); //체력 10회복   

    SetStress(GetStress()-5); //스트레스: 5감소

    SetSCnt(0);

}

void SStudent::Relax()

{

    SetHP(GetHP()+3); //체력 3회복   

    SetStress(GetStress()-25); //스트레스: 25감소

    SetSCnt(0);

}

void SStudent::Drink()

{

    SetHP(GetHP()+5); //체력 5회복

    SetIQ(GetIQ()-10);//지력:  10감소

    SetStress(GetStress()+2);//스트레스: 2증가

    SetSCnt(0);   

}

void SStudent::Sing()

{

    SetHP(GetHP()-10); //체력 10 소모

    SetIQ(GetIQ()-(5-GetSCnt()));//지력: 5-scnt감소

    SetStress(GetStress()+(5-GetSCnt()));//스트레스: 5-scnt증가

    SetSCnt(0);   

}

void SStudent::View()const

{

    cout<<"학사 학생";

    Student::View();

    cout<<" 더미 뇌:"<<dummy<<"연속으로 공부한 횟수:"<<total_scnt<<endl;

}

void SStudent::Reading()

{

    dummy++;//더미 뇌 1증가

    SetStress(GetStress()-5);//스트레스: 5감소

}

//MStudent.h

#pragma once

#include "student.h"

class MStudent :

    public Student

{

    int stick;

public:

    MStudent(string name);

    virtual void Study();

    virtual void ListenLecture();

    virtual void Sleep();

    virtual void Relax();

    virtual void Drink();

    virtual void Sing();

    virtual void View()const;

    void Travel();

};

//MStudent.cpp

#include "MStudent.h"

 

MStudent::MStudent(string name):Student(name)

{

    stick=0;//지팡이는 생성 시 0

}

 

void MStudent::Study()

{   

    SetHP(GetHP()-3);//체력 3소모

    SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가

    SetStress(GetStress()+3);//스트레스: 3증가

    SetSCnt(GetSCnt()+1);   

}

 

void MStudent::ListenLecture()

{

    SetHP(GetHP()-2); //체력 2소모

    SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가

    SetStress(GetStress()+5);// 스트레스: 5증가

    SetSCnt(0);

}

 

void MStudent::Sleep()

{

    SetHP(GetHP()+10); //체력 10회복   

    SetStress(GetStress()-5); //스트레스: 5감소

    SetSCnt(0);

}

void MStudent::Relax()

{

    SetHP(GetHP()+3); //체력 3회복   

    SetStress(GetStress()-25); //스트레스: 25감소

    SetSCnt(0);

}

void MStudent::Drink()

{

    SetHP(GetHP()+5+stick); //체력 5+지팡이 회복

    SetIQ(GetIQ()-(10-stick));//지력:  10-지팡이 감소

    SetStress(GetStress()-2);//스트레스: 2감소

    SetSCnt(0);   

}

void MStudent::Sing()

{

    SetHP(GetHP()-(10-stick)); //체력 10-지팡이 소모

    SetIQ(GetIQ()-5);//지력: 5감소

    SetStress(GetStress()-5);//스트레스: 5감소

    SetSCnt(0);   

}

void MStudent::View()const

{

    cout<<"마법 학생";

    Student::View();

    cout<<" 지팡이:"<<stick<<endl;

}

void MStudent::Travel()

{

    stick++;//지팡이 1증가   

}

 

//PStudent.h

#pragma once

#include "student.h"

class PStudent :

    public Student

{

    int air;

public:

    PStudent(string name);

    virtual void Study();

    virtual void ListenLecture();

    virtual void Sleep();

    virtual void Relax();

    virtual void Drink();

    virtual void Sing();

    virtual void View()const;

    void Dance();

};

 

//PStudent..cpp

#include "PStudent.h"

PStudent::PStudent(string name):Student(name)

{

    air=0;//air는 생성 시 0

}

void PStudent::Study()

{   

    SetHP(GetHP()-2);//체력 2소모

    SetIQ(GetIQ()+GetSCnt()/2);//지력: scnt/2 증가

    air-=3;

    SetStress(GetStress()-air*3);//스트레스: air*3감소

    SetSCnt(GetSCnt()+1);   

}

void PStudent::ListenLecture()

{

    SetHP(GetHP()-1); //체력 1소모

    SetIQ(GetIQ()+GetSCnt()/2);//지력: scnt/2 증가

    air-=5;

    SetStress(GetStress()-air*3);// 스트레스: air*3 감소

    SetSCnt(0);

}

void PStudent::Sleep()

{

    SetHP(GetHP()+10); //체력 10회복   

    SetStress(GetStress()-5); //스트레스: 5감소

    SetSCnt(0);

}

void PStudent::Relax()

{

    SetHP(GetHP()+8); //체력 8회복   

    SetStress(GetStress()-25); //스트레스: 25감소

    SetSCnt(0);

}

void PStudent::Drink()

{

 

    SetHP(GetHP()+5); //체력 5 회복

    SetIQ(GetIQ()-3);//지력:  3 감소

    SetStress(GetStress()-2);//스트레스: 2감소

    SetSCnt(0);   

}

void PStudent::Sing()

{

    SetHP(GetHP()-5); //체력 5 소모

    SetIQ(GetIQ()+2);//지력: 5증가

    SetStress(GetStress()-5);//스트레스: 5감소

    SetSCnt(0);   

}

void PStudent::View()const

{

    cout<<"운동 학생";

    Student::View();

    cout<<" air:"<<air<<endl;

}

void PStudent::Dance()

{   

    SetHP(GetHP()-5); //체력 5 소모

    SetIQ(GetIQ()+3);//지력: 3증가

    air++;//air 1증가   

}

 

//Program.cpp

#include "SStudent.h"

#include "MStudent.h"

#include "PStudent.h"

 

int main()

{

    Student *stues[3];

    stues[0] = new SStudent("공부 좋아");

    stues[1] = new PStudent("운동 잘해");

    stues[2] = new MStudent("빠쥬따꾸");

 

    cout<<"강의"<<endl;

    for(int i = 0; i<3; i++)

    {

        stues[i]->ListenLecture();

        stues[i]->View();

    }

 

    cout<<"자습"<<endl;

    for(int i = 0; i<3; i++)

    {

        stues[i]->Study();

        SStudent *ss = dynamic_cast<SStudent *>(stues[i]);

        if(ss)

        {

            ss->Reading();

        }

        stues[i]->View();

    }   

    cout<<"소등"<<endl;

    for(int i = 0; i<3; i++)

    {

        stues[i]->Sleep();

        stues[i]->View();

    }

    cout<<"자유 시간"<<endl;

    for(int i = 0; i<3; i++)

    {

        stues[i]->Relax();

        MStudent *ms = dynamic_cast<MStudent *>(stues[i]);

        if(ms)

        {

            ms->Travel();

        }

        stues[i]->View();

    }   

    cout<<"파티"<<endl;

    for(int i = 0; i<3; i++)

    {

        stues[i]->Drink();

        stues[i]->View();

    }

    cout<<"노래방"<<endl;

    for(int i = 0; i<3; i++)

    {

        stues[i]->Sing();

        PStudent *ps = dynamic_cast<PStudent *>(stues[i]);

        if(ps)

        {

            ps->Dance();

        }

        stues[i]->View();

    }

    for(int i = 0; i<3; i++)

    {

        delete stues[i];

    }

    return 0;

}

 

▷ 실행 결과

강의

학사 학생주민 번호:1 이름:공부 좋아

  IQ:100 HP:97 Stress:0

  연속으로 공부한 횟수:0

 더미 뇌:0연속으로 공부한 횟수:0

운동 학생주민 번호:2 이름:운동 잘해

  IQ:100 HP:99 Stress:15

  연속으로 공부한 횟수:0

 air:-5

마법 학생주민 번호:3 이름:빠쥬따꾸

  IQ:100 HP:98 Stress:5

  연속으로 공부한 횟수:0

 지팡이:0

자습

학사 학생주민 번호:1 이름:공부 좋아

  IQ:100 HP:92 Stress:0

  연속으로 공부한 횟수:1

 더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

  IQ:100 HP:97 Stress:39

  연속으로 공부한 횟수:1

 air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

  IQ:100 HP:95 Stress:8

  연속으로 공부한 횟수:1

 지팡이:0

소등

학사 학생주민 번호:1 이름:공부 좋아

  IQ:100 HP:102 Stress:0

  연속으로 공부한 횟수:0

 더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

  IQ:100 HP:107 Stress:34

  연속으로 공부한 횟수:0

 air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

  IQ:100 HP:105 Stress:3

  연속으로 공부한 횟수:0

 지팡이:0

자유 시간

학사 학생주민 번호:1 이름:공부 좋아

  IQ:100 HP:105 Stress:0

  연속으로 공부한 횟수:0

 더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

  IQ:100 HP:115 Stress:9

  연속으로 공부한 횟수:0

 air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

  IQ:100 HP:108 Stress:0

  연속으로 공부한 횟수:0

 지팡이:1

파티

학사 학생주민 번호:1 이름:공부 좋아

  IQ:90 HP:110 Stress:2

  연속으로 공부한 횟수:0

 더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

  IQ:97 HP:120 Stress:7

  연속으로 공부한 횟수:0

 air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

  IQ:91 HP:114 Stress:0

  연속으로 공부한 횟수:0

 지팡이:1

노래방

학사 학생주민 번호:1 이름:공부 좋아

  IQ:85 HP:100 Stress:7

  연속으로 공부한 횟수:0

 더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

  IQ:102 HP:110 Stress:2

  연속으로 공부한 횟수:0

 air:-7

마법 학생주민 번호:3 이름:빠쥬따꾸

  IQ:86 HP:105 Stress:0

  연속으로 공부한 횟수:0

 지팡이:1


2016/04/25 - [언어 자료구조 알고리즘/디딤돌 C++] - [C++] 41. 상속과 다형성 최종 실습 시나리오


2016/04/25 - [언어 자료구조 알고리즘/디딤돌 C++] - [C++] 42. 상속과 다형성 최종 실습 - 학생


2016/04/25 - [언어 자료구조 알고리즘/디딤돌 C++] - [C++] 43. 상속과 다형성 최종 실습 - 파생 클래스


반응형