상속과 다형성 실습-학생, 마법학생, 운동학생, 학사학생[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
프로그래밍 언어 및 기술 학습 및 무료 동영상 강의 언제나 휴일 티스토리
'C++ > 디딤돌 C++' 카테고리의 다른 글
[C++ 소스] 학생 클래스 (== 연산자 중복정의) (0) | 2016.12.14 |
---|---|
[C++ 소스] 학생 클래스 (연산자 중복정의 하기 전) (0) | 2016.12.14 |
상속과 다형성 실습(도형, 점, 선, 면적, 사각형) [디딤돌 C++] (0) | 2016.05.14 |
상품과 할인 상품 - 상속과 다형성 실습 [디딤돌 C++] (0) | 2016.04.17 |
기본 형식 간에 static_cast [디딤돌 C++] (0) | 2016.04.17 |