명품 C++ 실습문제 Chapter3
#ifndef TOWER
#define TOWER
#include <iostream>
using namespace std;
class Tower{
int height;
public:
//객체 두개 생성했으니까, 생성자도 두개 마들어줌
Tower();
Tower(int h);
int getHeight();
~Tower();
};
Tower::Tower(/* args */){
int height =1;
}
Tower::Tower(int h){
height = h;
}
int Tower::getHeight(int h){
return height;
}
Tower::~Tower()
{
}
#endif
#ifndef DATE
#define DATE
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class DATE
{
private:
int year;
int month;
int day;
public:
// 생성자 함수
Date(int a, int b, int c); // year, month, day 매개변수를 받아들임
Date(string str); // 문자열 매개변수를 받아들임
// 출력 함수
void show();
// 연도, 월, 일 정보를 반환하는 함수
int getYear();
int getMonth();
int getDay();
};
// Date 클래스의 첫 번째 생성자 함수
Date::Date(int a, int b, int c){
year = a;
month = b;
day = c;
}
// Date 클래스의 두 번째 생성자 함수
Date::Date(string str){
year = stoi(str); // 문자열을 정수형으로 변환하여 year 멤버 변수에 저장
month = stoi(str.substr(5,6)); // 5번째 위치부터 6글자를 가져와서 정수형으로 변환하여 month 멤버 변수에 저장
day = stoi(str.substr(7,9)); // 7번째 위치부터 9글자를 가져와서 정수형으로 변환하여 day 멤버 변수에 저장
}
void DATE::show(){
cout << year <<" 년 " << month << "월" << day << "일" << endl;
}
int DATE::getYear(){
return year;
}
int DATE::getMonth(){
return month;
}
int DATE::getDay(){
return day;
}
DATE::~DATE()
{
}
#endif
#ifndef DATE
#define DATE
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class DATE
{
private:
int year;
int month;
int day;
public:
// 생성자 선언
Date(int y, int m, int d);
Date(string strDate);
// 멤버 함수 선언
void show();
int getYear();
int getMonth();
int getDay();
};
// 생성자 함수 정의
Date::Date(int y, int m, int d) {
// 멤버 변수 초기화
year = y;
month = m;
day = d;
}
// 생성자 함수 정의
Date::Date(string strDate) {
// 문자열을 C 스타일 문자열로 변환하여 저장할 버퍼 할당
char* str_buff = new char[100];
// 문자열을 C 스타일 문자열로 변환하여 버퍼에 저장
strcpy(str_buff, strDate.c_str());
// strtok 함수를 사용하여 "/" 문자로 분리된 각 값을 정수형으로 변환하여 멤버 변수에 저장
year = stoi(strtok(str_buff, "/"));
month = stoi(strtok(nullptr, "/"));
day = stoi(strtok(nullptr, "/"));
}
void DATE::show(){
cout << year <<" 년 " << month << "월" << day << "일" << endl;
}
int DATE::getYear(){
return year;
}
int DATE::getMonth(){
return month;
}
int DATE::getDay(){
return day;
}
DATE::~DATE()
{
}
#endif
#ifndef ACCOUNT // 만약 ACCOUNT가 정의되어 있지 않으면
#define ACCOUNT // ACCOUNT를 정의해라
#include <iostream> // iostream 헤더파일을 포함시켜라
#include <string> // string 헤더파일을 포함시켜라
using namespace std; // std namespace를 사용하겠다는 선언
class ACCOUNT // ACCOUNT 클래스를 정의
{
private: // 이후 나오는 모든 멤버 변수는 private로 설정
string name; // 이름을 나타내는 문자열 멤버 변수
int id; // 계좌 ID를 나타내는 정수형 멤버 변수
int balance; // 잔액을 나타내는 정수형 멤버 변수
public: // 이후 나오는 멤버 함수는 public으로 설정
ACCOUNT(string a, int b, int c); // 매개변수를 받는 constructor 함수
string getOwner(); // 소유자 이름을 반환하는 멤버 함수
void deposit(int a); // 예금을 처리하는 멤버 함수
int withdraw(int a); // 출금을 처리하는 멤버 함수
int inquiry(); // 잔액 조회를 처리하는 멤버 함수
~ACCOUNT(); // 소멸자 함수
};
// 매개변수를 받는 constructor 함수의 구현
ACCOUNT::ACCOUNT(string a, int b, int c){
name = a;
id = b;
balance = c;
}
// 예금을 처리하는 멤버 함수의 구현
void ACCOUNT::deposit(int a){
balance +=a;
}
// 출금을 처리하는 멤버 함수의 구현
int ACCOUNT::withdraw(int a ){
balance -=a;
return balance;
}
// 소유자 이름을 반환하는 멤버 함수의 구현
string ACCOUNT::getOwner(){
return name;
}
// 잔액 조회를 처리하는 멤버 함수의 구현
int ACCOUNT::inquiry(){
return balance;
}
// 소멸자 함수의 구현
ACCOUNT::~ACCOUNT()
{
}
#endif // ACCOUNT가 정의되어 있지 않다면 이 코드 이후의 내용을 포함시키지 않는다.
#ifndef CoffeeMachine // 만약 CoffeeMachine이 정의되어 있지 않으면
#define CoffeeMachine // CoffeeMachine을 정의해라
#include <iostream> // iostream 헤더파일을 포함시켜라
using namespace std; // std namespace를 사용하겠다는 선언
class CoffeeMachine // CoffeeMachine 클래스를 정의
{
private: // 이후 나오는 모든 멤버 변수는 private로 설정
int coffee; // 커피 원료의 양을 나타내는 정수형 멤버 변수
int water; // 물의 양을 나타내는 정수형 멤버 변수
int sugar; // 설탕의 양을 나타내는 정수형 멤버 변수
public: // 이후 나오는 멤버 함수는 public으로 설정
CoffeeMachine(int c, int w, int s); // 매개변수를 받는 constructor 함수
void drinkEspresso(); // 에스프레소를 만드는 멤버 함수
void drinkAmericano(); // 아메리카노를 만드는 멤버 함수
void drinkSugarCoffee(); // 설탕커피를 만드는 멤버 함수
void show(); // 현재 커피머신의 상태를 출력하는 멤버 함수
void fill(); // 커피머신을 다시 채우는 멤버 함수
~CoffeeMachine(); // 소멸자 함수
};
// 매개변수를 받는 constructor 함수의 구현
CoffeeMachine::CoffeeMachine(int c, int w, int s){
coffee = c;
water = w;
sugar = s;
}
// 에스프레소를 만드는 멤버 함수의 구현
void CoffeeMachine::drinkEspresso(){
coffee -= 1;
water -=1;
}
// 아메리카노를 만드는 멤버 함수의 구현
void CoffeeMachine::drinkAmericano(){
coffee -=1;
water -=2;
}
// 설탕커피를 만드는 멤버 함수의 구현
void CoffeeMachine::drinkSugarCoffe(){
coffee -=1;
water -=2;
sugar -=1;
}
// 현재 커피머신의 상태를 출력하는 멤버 함수의 구현
void CoffeeMachine::show(){
cout << "커피 머신 상태, 커피:" << coffee << "물 : "<< water <<"설탕 : "<<sugar << endl;
}
// 커피머신을 다시 채우는 멤버 함수의 구현
void CoffeeMachine::fill(){
water= coffee = sugar =10;
}
// 소멸자 함수의 구현
CoffeeMachine::~CoffeeMachine()
{
}
#endif // CoffeeMachine이 정의되어 있지 않다면 이 코드 이후의 내용을 포함시키지 않는다.
또는,
멤버 변수와 생성자의 매개변수 이름이 동일하므로 this 포인터를 사용하여 명확하게 구분해준 것
CoffeeMachine::CoffeeMachine(int coffee, int water, int sugar) {
this->coffee = coffee; // 멤버 변수 coffee에 전달받은 인자 coffee를 저장
this->water = water; // 멤버 변수 water에 전달받은 인자 water를 저장
this->sugar = sugar; // 멤버 변수 sugar에 전달받은 인자 sugar를 저장
}
// Random 클래스 선언부
#ifndef RANDOM
#define RANDOM
#include <iostream>
using namespace std;
class Random
{
private:
public:
// 생성자
Random(/* args */);
// 0부터 RAND_MAX 사이의 난수 반환
int next();
// a부터 b까지의 범위에서 난수 반환
int nextInRange(int a, int b);
// 소멸자
~Random();
};
// 생성자 구현부
Random::Random(/* args */)
{
}
// 0부터 RAND_MAX 사이의 난수 반환하는 함수 구현부
int Random::next(){
int n = rand();
return n;
}
// a부터 b까지의 범위에서 난수 반환하는 함수 구현부
int Random::nextInRange(int a, int b){
int n = rand() % (b - a + 1) + a;
return n;
}
// 소멸자 구현부
Random::~Random()
{
}
#endif
#ifndef RANDOM
#define RANDOM
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
class Random {
int start;
int end;
public:
Random();
int next();
int nextInRange(int start, int end);
~Random();
};
// 생성자 구현부
Random::Random() {
// 시드 값으로 현재 시간을 사용
srand((unsigned int)time(NULL));
// 기본 범위 설정
start = 0;
end = RAND_MAX;
}
// 0부터 RAND_MAX 사이의 난수 반환하는 함수 구현부
int Random::next() {
return rand() % (RAND_MAX + 1);
}
// start부터 end까지의 범위에서 난수 반환하는 함수 구현부
int Random::nextInRange(int start, int end) {
return rand() % (end - start + 1) + start;
}
Random::~Random()
{
}
#endif
#ifndef EVENRANDOM
#define EVENRANDOM
#include <cstdlib>
#include <ctime>
#include <iostream>
class EvenRandom {
int start;
int end;
public:
EvenRandom();
int next();
int nextInRange(int start, int end);
};
EvenRandom::EvenRandom() {
srand((unsigned int)time(NULL));
start = 0;
end = RAND_MAX;
}
int EvenRandom::next() {
while (true) {
int even = rand() % (RAND_MAX + 1);
if (even % 2 == 0) {
return even;
}
}
}
EvenRandom::~EvenRandom()
{
}
#endif
#include "tranning3_7.h"
int main(){
Random r;
cout << "--0에서 " << RAND_MAX << "까지의 짝수 랜덤 함수 10 개 --" << endl;
for (int i = 0; i < 10; i++){
int n = r.next() * 2; // 0에서 RAND_MAX 사이의 랜덤한 짝수 정수
cout << n << ' ';
}
cout << endl << endl << "--2에서 9 까지의 랜덤 홀수 정수 10개 --" << endl;
for (int i = 0; i < 10; i++){
int n = r.nextInRange(2,9,1); // 2 에서 9 사이 랜덤한 홀수 정수
// r.nextInRange(2,9,1) 함수는 2에서 9 사이의 랜덤한 홀수 정수를 생성합니다.
// 1은 매개변수 값은 홀수를 의미합니다. 만약 짝수를 생성하고 싶다면, 0 값을 전달하면 됩니다.
cout << n << ' ';
}
cout << endl;
return 0;
}
// SelectableRandom 클래스 선언부
#ifndef SELECTABLERANDOM
#define SELECTABLERANDOM
#include <cstdlib>
#include <ctime>
#include <iostream>
class SelectableRandom {
int start; // 범위의 시작값
int end; // 범위의 끝값
public:
// 생성자
SelectableRandom();
// 짝수 또는 홀수 난수 반환하는 함수
int next(int even_or_odd);
// start부터 end까지의 범위에서 짝수 또는 홀수 난수 반환하는 함수
int nextInRange(int start, int end, int even_or_odd);
};
// 생성자 구현부
SelectableRandom::SelectableRandom() {
// 시드 값으로 현재 시간을 사용
srand((unsigned int)time(NULL));
// 기본 범위 설정
start = 0;
end = RAND_MAX;
}
// 짝수 또는 홀수 난수 반환하는 함수 구현부
int SelectableRandom::next(int even_or_odd) {
int result;
while (true) {
result = rand() % (RAND_MAX + 1);
if (result % 2 == even_or_odd) {
return result;
}
}
}
// start부터 end까지의 범위에서 짝수 또는 홀수 난수 반환하는 함수 구현부
int SelectableRandom::nextInRange(int start, int end, int even_or_odd) {
int result;
while (true) {
result = rand() % (end - start + 1) + start;
if (result % 2 == even_or_odd) {
return result;
}
}
}
#endif
#ifndef INTEGER
#define INTEGER
#include <iostream>
#include <cstring>
using namespace std;
class Integer
{
private:
int num; // private 멤버 변수로 int형 num을 선언한다.
public:
Integer(int num); // 생성자로 int형 변수 num을 매개변수로 받는다.
Integer(string num); // 생성자로 string 형태의 num을 매개변수로 받는다.
int get(); // 현재 num 값을 반환하는 함수
void set(); // num 값을 새로 설정하는 함수
int isEven(); // num이 짝수인지 아닌지 판단하는 함수
~Integer(); // 소멸자
};
Integer::Integer(int num){
this -> num= num; // this 포인터를 사용해 멤버 변수 num에 전달받은 매개변수 num 값을 저장한다.
}
Integer::Integer(string num){
this -> num= stoi(num); // this 포인터를 사용해 멤버 변수 num에 string 형태의 num을 int로 변환하여 저장한다.
}
int Integer::get(){
return num; // 현재 num 값을 반환한다.
}
void Integer::set(){
this -> num =num; // this 포인터를 사용해 멤버 변수 num 값을 전달받은 값으로 설정한다.
}
int Integer::isEven(){
return true; // 현재는 num이 짝수인지 아닌지 판단하는 코드가 없기 때문에 모든 수를 짝수로 처리하고 true를 반환한다.
}
Integer::~Integer()
{
}
#endif
class Integer{
public:
int n; // 정수 n
Integer(int a); // 정수 a를 받는 생성자
Integer(string a); // 문자열 a를 받아 정수로 변환하는 생성자
int get(); // 정수 n을 반환하는 메서드
void set(int a); // 정수 n을 변경하는 메서드
int isEven(); // n이 짝수인지 아닌지 판별하는 메서드
};
// 정수 a를 받아 Integer 객체를 생성하는 생성자
Integer::Integer(int a){
n = a;
}
// 문자열 a를 받아 정수로 변환하여 Integer 객체를 생성하는 생성자
Integer::Integer(string a){
n = stoi(a);
}
// Integer 객체의 정수 n을 반환하는 메서드
int Integer::get(){
return n;
}
// Integer 객체의 정수 n을 변경하는 메서드
void Integer::set(int a){
n = a;
}
// Integer 객체의 정수 n이 짝수인지 판별하는 메서드
int Integer::isEven(){
if(n % 2 == 0) return 1; // 짝수이면 1 반환
else return 0; // 홀수이면 0 반환
}
#ifndef OVAL
#define OVAL
#include <iostream>
using namespace std;
class Oval
{
private: // 멤버 변수는 private으로 선언
int width; // 타원의 가로
int height; // 타원의 세로
int length; // 타원의 길이
public: // 멤버 함수는 public으로 선언
Oval(int a, int b); // 너비와 높이 값을 매개 변수로 받는 생성자
Oval(); // 매개변수 없는 생성자
int getWidth(); // 가로 값을 반환하는 함수
int getHeight(); // 세로 값을 반환하는 함수
void set(int w, int h); // 가로, 세로 값을 설정하는 함수
void show(); // 가로, 세로 값을 출력하는 함수
~Oval(); // 소멸자
};
Oval::Oval(int a, int b) // 생성자 정의
{
width = a; // 멤버 변수 초기화
height = b;
}
Oval::Oval() // 생성자 정의
{
width = 0; // 멤버 변수 초기화
height = 0;
}
int Oval::getWidth() // 가로 값을 반환하는 함수
{
return width;
}
int Oval::getHeight() // 세로 값을 반환하는 함수
{
return height;
}
void Oval::set(int a, int b) // 가로, 세로 값을 설정하는 함수
{
width = a;
height = b;
}
void Oval::show(){
cout << "width =" << width << ", height = " << height << endl;
}
Oval::~Oval(){
cout <<"Oval 소멸 : width = " << width <<", height =" << height << endl;
}
#endif
#include "tranning3_9.h"
int main(){
Oval a, b(3,4); // Oval 클래스의 객체 a와 b 생성, b는 가로 3, 세로 4로 초기화
a.set(10,20); // a 객체의 가로를 10, 세로를 20으로 설정
a.show(); // a 객체의 가로와 세로 값을 출력
cout << b.getWidth() << "," << b.getHeight() << endl; // b 객체의 가로와 세로 값을 출력
}
#include <iostream>
using namespace std;
class Add
{
private:
int a,b;
public:
Add(/* args */);
void setValue(int x, int y);
int calculate();
~Add();
};
Add::Add(/* args */){
}
void Add::setValue(int x, int y){
a = x;
b = y;
}
int Add::calculate(){
return a+b;
}
Add::~Add()
{
}
class Sub
{
private:
int a,b;
public:
Sub(/* args */);
void setValue(int x, int y);
int calculate();
~Sub();
};
Sub::Sub(/* args */)
{
}
void Sub::setValue(int x, int y){
a = x;
b = y;
}
int Sub::calculate(){
return a-b;
}
Sub::~Sub()
{
}
class Mul
{
private:
int a,b;
public:
Mul(/* args */);
void setValue(int x, int y);
int calculate();
~Mul();
};
Mul::Mul(/* args */)
{
}
void Mul::setValue(int x, int y){
a = x;
b = y;
}
int Mul::calculate(){
return a * b;
}
Mul::~Mul()
{
}
class Div
{
private:
int a,b;
public:
Div(/* args */);
void setValue(int x, int y);
int calculate();
~Div();
};
Div::Div(/* args */)
{
}
void Div::setValue(int x, int y){
a = x;
b = y;
}
int Div::calculate(){
return a/b;
}
Div::~Div()
{
}
int main(){
Add a;
Sub s;
Mul m;
Div d;
int n1,n2;
char ch;
while (true) {
cout << "두 정수와 연산자를 입력하세요>>";
cin >> n1 >> n2 >> ch;
switch (ch) {
case '+':
a.setValue(num1, num2);
cout << a.calculate() << endl;
break;
case '-':
s.setValue(num1, num2);
cout << s.calculate() << endl;
break;
case '*':
m.setValue(num1, num2);
cout << m.calculate() << endl;
break;
case '/':
d.setValue(num1, num2);
cout << d.calculate() << endl;
break;
}
}
return 0;
}
그냥 분리해주고, 각 헤더 파일에 아래의 내용만 추가되면 됩니다.
#ifndef 클래스명
#define 클래스명
#include <iostream>
using namespace std;
#endif