C++/디딤돌 C++

상속과 다형성 실습-학생, 마법학생, 운동학생, 학사학생[C++]

언제나휴일 2016. 5. 15. 12:19
반응형

상속과 다형성 실습-학생, 마법학생, 운동학생, 학사학생[C++]

상속과 다형성 실습-학생, 마법학생, 운동학생, 학사학생[C++]


시나리오

프로그램이 시작하면서 학사 학생과 운동 학생, 마법 학생을 한 명씩 생성

 

학생을 생성 후 전체 학생에게 강의=>자습=>잠자기=>휴식하기=>음료마시기=>노래하기 순으로 진행

(각 단계마다 학생 정보를 출력)

 

자습하기에서는 해당 학생이 학사 학생이면 독서도 지시함

휴식하기에서는 해당 학생이 마법 학생이면 여행도 지시함

노래하기에서는 해당 학생이 운동 학생이면 춤추게 지시함

 

1. 학생

멤버 필드로 이름, 주민번호, 체력, 지력, 스트레스가 있음

주민번호: 순차적 부여

이름: 생성 시 전달

지력:100(최소 0, 최대 200)  

체력: 100 (최소 0, 최대 200)

스트레스: 0 (최소 0, 최대 100)

연속으로 공부한 횟수: 0 (0,5), 공부를 하면 1 증가, 그 외의 행위를 하면 0으로 리셋, scnt로 부름

 

2. 학사 학생

멤버 필드로 더미 뇌가 있음

더미 뇌는 생성 시 0 이며 공부한 회수가 5의 배수가 될 때마다 1씩 증가

공부하다.

체력 5소모, 지력: scnt+더미 뇌 증가, 스트레스: 2감소

강의를 받다.

체력 3소모, 지력: scnt 증가, 스트레스: scnt증가

잠자다.

체력 10회복, 스트레스: 5감소     *scnt는 연속 공부한 회수

휴식하다.

체력 3회복, 스트레스: 25감소

음료 섭취

체력 5회복, 지력:  10감소 , 스트레스: 2증가

노래하다.

체력 10 소모, 지력: 5-scnt감소, 스트레스: 5-scnt증가

독서하다.

더미 뇌 1증가, 스트레스: 5감소

 

3. 마법 학생

마법 학생은 내부적으로 지팡이가 있다.

지팡이는 생성 시 0이며 마법 여행 시 1씩 증가

공부하다.

체력 3소모, 지력: scnt 증가, 스트레스: 3증가

강의를 받다.

체력 2소모, 지력: scnt 증가, 스트레스: 5증가

잠자다.

체력 10회복, 스트레스: 5감소

휴식하다.

체력 3회복, 스트레스: 25감소

음료 섭취

체력 5+지팡이 회복, 지력:  10-지팡이 감소, 스트레스: 2감소

노래하다.

체력 10-지팡이 소모, 지력: 5감소, 스트레스: 5감소

마법 여행을 가다.

지팡이 1증가

 

4. 운동 학생

운동 학생은 내부적으로 air가 있다.

air는 생성 시 0 이며 춤을 추면 1 증가

공부하다.

체력 2소모, 지력: scnt/2 증가,

air 3 감소, air*3만큼 스트레스 감소

강의를 받다.

체력 1소모, 지력: scnt/2 증가,

air :5 감소, air*3만큼 스트레스 감소

잠자다.

체력 10회복, 스트레스: 5감소

휴식하다.

체력 8회복, 스트레스: 25감소

음료 섭취

체력 5 회복, 지력:  3 감소, 스트레스: 2감소

노래하다.

체력 5소모, 지력: 2증가, 스트레스: 5감소

춤을 추다.

체력 5소모, 지력: 3증가, air 1증가


에제 코드

//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


프로그래밍 언어 및 기술 학습 및 무료 동영상 강의 언제나 휴일 티스토리

프로그래밍 언어 및 기술 학습 및 무료 동영상 강의 언제나 휴일 티스토리


반응형