명품 C++ 실습문제 Chapter3

ChoRong0824·2023년 4월 14일
0

C

목록 보기
13/17
post-thumbnail

명품 C++ 실습문제 Chapter3

3-1

#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 

3-2

(1)

#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

(2)

#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

3-3

#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가 정의되어 있지 않다면 이 코드 이후의 내용을 포함시키지 않는다.

3-4

#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를 저장
}

3-5

(1)

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

(2)

#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

3-6

#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

3-7

main

#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;
}

header

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

3-8

header (1)

#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

header(2)

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 반환
}

3-9

header

#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

main

#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 객체의 가로와 세로 값을 출력
}

3-10

(1)

#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;
}

(2)

그냥 분리해주고, 각 헤더 파일에 아래의 내용만 추가되면 됩니다.

#ifndef 클래스명
#define 클래스명

#include <iostream>
using namespace std; 

#endif

profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글