C-C++/명품 C++ Programming

[(개정판) 명품 C++ programming] 7장 실습 문제

최옥구 2023. 1. 6. 23:00
반응형

※문제 1 ~ 4까지 사용될 Book 클래스는 다음과 같다.

class Book
{
	string title;
	int price, pages;
public:
	Book(string title = " ", int price = 0, int pages = 0)
	{
		this->title = title;
		this->price = price;
		this->pages = pages;
	}
	void show()
	{
		cout << title << ' ' << price << "원 " << pages << "페이지" << endl;
	}
	string getTitle()
	{
		return title;
	}
};

1. Book 객체에 대해 다음 연산을 하고자 한다.

[결과]

1-1. +=, -= 연산자 함수를 Book 클래스의 멤버 함수로 구현하라.

#include <iostream>
using namespace std;

class Book
{
	string title;
	int price, pages;
public:
	Book(string title = " ", int price = 0, int pages = 0)
	{
		this->title = title;
		this->price = price;
		this->pages = pages;
	}

	Book &operator += (int x)
	{
		price = price + x;
		return *this;
	}

	Book& operator -= (int x)
	{
		price = price - x;
		return *this;
	}

	void show()
	{
		cout << title << ' ' << price << "원 " << pages << "페이지" << endl;
	}
	string getTitle()
	{
		return title;
	}
};

int main()
{
	Book a("청춘", 20000, 300), b("미래", 30000, 500);
	a += 500;
	b -= 500;
	a.show();
	b.show();
}

1-2. +=, -= 연산자 함수를 Book 클래스 외부 함수로 구현하라.

#include <iostream>
using namespace std;

class Book
{
	string title;
	int price, pages;
public:
	Book(string title = " ", int price = 0, int pages = 0)
	{
		this->title = title;
		this->price = price;
		this->pages = pages;
	}

	friend Book& operator += (Book &op, int x);
	friend Book& operator -= (Book &op, int x);

	void show()
	{
		cout << title << ' ' << price << "원 " << pages << "페이지" << endl;
	}
	string getTitle()
	{
		return title;
	}
};

Book& operator += (Book& op, int x)
{
	op.price = op.price + x;
	return op;
}

Book &operator -= (Book& op, int x)
{
	op.price = op.price - x;
	return op;
}

int main()
{
	Book a("청춘", 20000, 300), b("미래", 30000, 500);
	a += 500;
	b -= 500;
	a.show();
	b.show();
}

 

 


2. Book 객체를 활용하는 사례이다.

[결과]

2-1. 세 개의 == 연산자 함수를 가진 Book 클래스를 작성하라.

#include <iostream>
using namespace std;

class Book
{
	string title;
	int price, pages;
public:
	Book(string title = " ", int price = 0, int pages = 0)
	{
		this->title = title;
		this->price = price;
		this->pages = pages;
	}

	bool operator == (int price)
	{
		if (this->price == price)
			return true;
		else return false;
	}

	bool operator == (string title)
	{
		if (this->title == title)
			return true;
		else return false;
	}

	bool operator == (Book op2)
	{
		if (this->title == op2.title && this->price == op2.price && this->pages == op2.pages)
			return true;
		else return false;
	}
	

	void show()
	{
		cout << title << ' ' << price << "원 " << pages << "페이지" << endl;
	}
	string getTitle()
	{
		return title;
	}
};

int main()
{
	Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
	if (a == 30000) cout << "정가 30000원" << endl;
	if (a == "명품 C++") cout << "명픔 C++입니다." << endl;
	if (a == b) cout << "두 책이 같은 책입니다. " << endl;
}

2-2. 세 개의 == 연산자를 프렌드 함수로 작성하라.

#include <iostream>
using namespace std;

class Book
{
	string title;
	int price, pages;
public:
	Book(string title = " ", int price = 0, int pages = 0)
	{
		this->title = title;
		this->price = price;
		this->pages = pages;
	}

	bool operator == (int price)
	{
		if (this->price == price)
			return true;
		else 
            return false;
	}

	bool operator == (string title)
	{
		if (this->title == title)
			return true;
		else 
            return false;
	}

	bool operator == (Book op2)
	{
		if (this->title == op2.title && this->price == op2.price && this->pages == op2.pages)
			return true;
		else 
            return false;
	}
	
	void show()
	{
		cout << title << ' ' << price << "원 " << pages << "페이지" << endl;
	}
	string getTitle()
	{
		return title;
	}
};

int main()
{
	Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
	if (a == 30000) cout << "정가 30000원" << endl;
	if (a == "명품 C++") cout << "명픔 C++입니다." << endl;
	if (a == b) cout << "두 책이 같은 책입니다. " << endl;
}

 


 

3. 다음 연산을 통해 공짜 책인지 판별하도록 ! 연산자를 작성하라.

[결과]

[! 연산자와 메인 함수]

bool operator !()
	{
		if (price == 0)
			return true;
		else
			return false;
	}

. . .

int main()
{
	Book book("벼룩시장", 0, 50);
	if (!book)
		cout << "공짜다. " << endl;
}

 


 

4. 다음 연산을 통해 책의 제목을 사전 순으로 비교하고자 한다. < 연산자를 활용하라.

[결과]

[< 연산자와 메인 함수]

friend bool operator < (string name, Book op);

. . .

bool operator < (string name, Book op)
{
	if (name < op.title)
		return true;
	else
		return false;
}

int main()
{
	Book a("청춘", 20000, 300);
	string b;
	cout << "책 이름을 입력하세요. > ";
	getline(cin, b);
	if (b < a)
		cout << a.getTitle() << "이 " << b << "보다 뒤에 있구나!" << endl;
}

 


5. 다음 main()에서 Color 클래스는 3요소(빨강, 초록, 파랑)로 하나의 색을 나타내는 클래스이다.(4장 실습문제 1번 참고). + 연산자로 색을 더하고, == 연산자로 색을 비교하고자 한다. 실행 결과를 참고하여 Color 클래스와 연산자, 그리고 프로그래밍을 완성하라.

[결과]

5-1. + 와 == 연산자를 Color 클래스의 멤버 함수로 구현하라.

#include <iostream>
#include <string>
using namespace std;

class Color
{
	int red, green, blue;
public:
	Color(int red = 0, int green = 0, int blue = 0)
	{
		this->red = red;
		this->green = green;
		this->blue = blue;
	}

	Color operator + (Color op2)
	{
		Color tmp;
		tmp.red = this->red + op2.red;
		tmp.green = this->green + op2.green;
		tmp.blue = this->blue + op2.blue;
		return tmp;
	}
	bool operator == (Color fu)
	{
		if (red == fu.red && green == fu.green && blue == fu.blue)
			return true;
		else
			return false;
	}

	void show();
};

void Color::show()
{
	cout << red << ' ' << green << ' ' << blue << endl;
}

int main()
{
	Color red(255, 0, 0), blue(0, 0, 255), c;
	c = red + blue;
	c.show();

	Color fuchsia(255, 0, 255);
	if (c == fuchsia)
		cout << "보라색 맞음";
	else
		cout << "보라색 아님";
}

 

5-2. + 와 == 연산자를 Color 클래스의 프렌드 함수로 구현하라.

#include <iostream>
#include <string>
using namespace std;

class Color
{
	int red, green, blue;
public:
	Color(int red = 0, int green = 0, int blue = 0)
	{
		this->red = red;
		this->green = green;
		this->blue = blue;
	}

	friend Color operator + (Color op1, Color op2);
	friend bool operator == (Color op3, Color fu)
	{
		if (op3.red == fu.red && op3.green == fu.green && op3.blue == fu.blue)
			return true;
		else
			return false;
	}

	void show();
};

Color operator + (Color op1, Color op2)
{
	Color tmp;
	tmp.red = op1.red + op2.red;
	tmp.green = op1.green + op2.green;
	tmp.blue = op1.blue + op2.blue;
	return tmp;
}

void Color::show()
{
	cout << red << ' ' << green << ' ' << blue << endl;
}

int main()
{
	Color red(255, 0, 0), blue(0, 0, 255), c;
	c = red + blue;
	c.show();

	Color fuchsia(255, 0, 255);
	if (c == fuchsia)
		cout << "보라색 맞음";
	else
		cout << "보라색 아님";
}

 


 

6. 2차원 행렬이 가능하도록 Matrix 클래스를 작성하고, show() 멤버 함수와 다음 연산이 가능하도록 연산자를 모두 구현하라.

[결과]

6-1. 연산자 함수를 Matrix의 멤버 함수로 구현하라.

#include <iostream>
#include <string>
using namespace std;

class Matrix
{
	int first, second, third, fourth;
public:
	Matrix(int first = 0, int second = 0, int third = 0, int fourth = 0)
	{
		this->first = first;
		this->second = second;
		this->third = third;
		this->fourth = fourth;
	}

	Matrix operator + (Matrix op2)
	{
		Matrix tmp;
		tmp.first = this->first + op2.first;
		tmp.second = this->second + op2.second;
		tmp.third = this->third + op2.third;
		tmp.fourth = this->fourth + op2.fourth;
		return tmp;
	}

	Matrix& operator += (Matrix op2)
	{
		this->first += op2.first;
		this->second += op2.second;
		this->third += op2.third;
		this->fourth += op2.fourth;
		return *this;
	}

	bool operator == (Matrix op3)
	{
		if (this->first == op3.first && this->second == op3.second && this->third == op3.third && this->fourth == op3.fourth)
			return true;
		else
			return false;
	}

	void show()
	{
		cout << "Matrix = {" << first << ' ' << second << ' ' << third << ' ' << fourth << "} \n";
	}
};

int main()
{
	Matrix a(1, 2, 3, 4), b(2, 3, 4, 5), c;
	c = a + b;
	a += b;
	a.show(); b.show(); c.show();
	if (a == c)
		cout << "a and c are the smae" << endl;
}

 

6-2. 연산자 함수를 Matrix의 프렌드 함수로 구현하라.

#include <iostream>
#include <string>
using namespace std;

class Matrix
{
	int first, second, third, fourth;
public:
	Matrix(int first = 0, int second = 0, int third = 0, int fourth = 0)
	{
		this->first = first;
		this->second = second;
		this->third = third;
		this->fourth = fourth;
	}

	friend Matrix operator + (Matrix op1, Matrix op2);
	friend Matrix& operator += (Matrix &op1, Matrix op2);
	friend bool operator == (Matrix op1, Matrix op3);

	void show()
	{
		cout << "Matrix = {" << first << ' ' << second << ' ' << third << ' ' << fourth << "} \n";
	}
};

Matrix operator + (Matrix op1, Matrix op2)
{
	Matrix tmp;
	tmp.first = op1.first + op2.first;
	tmp.second = op1.second + op2.second;
	tmp.third = op1.third + op2.third;
	tmp.fourth = op1.fourth + op2.fourth;
	return tmp;
}

Matrix& operator += (Matrix &op1, Matrix op2)
{
	op1.first += op2.first;
	op1.second += op2.second;
	op1.third += op2.third;
	op1.fourth += op2.fourth;
	return op1;
}

bool operator == (Matrix op1, Matrix op3)
{
	if (op1.first == op3.first && op1.second == op3.second && op1.third == op3.third && op1.fourth == op3.fourth)
		return true;
	else
		return false;
}

int main()
{
	Matrix a(1, 2, 3, 4), b(2, 3, 4, 5), c;
	c = a + b;
	a += b;
	a.show(); b.show(); c.show();
	if (a == c)
		cout << "a and c are the smae" << endl;
}

 


 

7. 2차원 행렬을 추상화한 Matrix 클래스를 활용하는 다음 코드가 있다.

[결과]

7-1. << , >> 연산자 함수를 Matrix의 멤버 함수로 구현하라.

#include <iostream>
#include <string>
using namespace std;

class Matrix
{
	int a, b, c, d;
public:
	Matrix(int a = 0, int b = 0, int c = 0, int d = 0)
	{
		this->a = a;
		this->b = b;
		this->c = c;
		this->d = d;
	}

	Matrix operator >> (int arr[])
	{
		int* p = arr;
		p[0] = this->a;
		p[1] = this->b;
		p[2] = this->c;
		p[3] = this->d;
		return *p;
	}

	Matrix& operator << (int arr[])
	{ 
		this->a = arr[0];
		this->b = arr[1];
		this->c = arr[2];
		this->d = arr[3];
		return *this;
	}

	void show()
	{
		cout << "Matrix = {" << a << ' ' << b << ' ' << c << ' ' << d << "} \n";
	}
};

int main()
{
	Matrix a(4, 3, 2, 1), b;
	int x[4], y[4] = { 1, 2, 3, 4 };
	a >> x;
	b << y;

	for (int i = 0; i < 4; i++)
		cout << x[i] << ' ';
	cout << endl;
	b.show();
}

7-2. << , >> 연산자 함수를 Matrix의 프렌드 함수로 구현하라.

#include <iostream>
#include <string>
using namespace std;

class Matrix
{
	int a, b, c, d;
public:
	Matrix(int a = 0, int b = 0, int c = 0, int d = 0)
	{
		this->a = a;
		this->b = b;
		this->c = c;
		this->d = d;
	}
	
	friend Matrix operator >> (Matrix op1, int arr[]);
	friend Matrix &operator << (Matrix &op2, int arr[]);

	void show()
	{
		cout << "Matrix = {" << a << ' ' << b << ' ' << c << ' ' << d << "} \n";
	}
};

Matrix operator >> (Matrix op1, int arr[])
{
	int* p = arr;
	p[0] = op1.a;
	p[1] = op1.b;
	p[2] = op1.c;
	p[3] = op1.d;
	return *p;
}

Matrix& operator << (Matrix& op2, int arr[])
{
	op2.a = arr[0];
	op2.b = arr[1];
	op2.c = arr[2];
	op2.d = arr[3];
	return op2;
}

int main()
{
	Matrix a(4, 3, 2, 1), b;
	int x[4], y[4] = { 1, 2, 3, 4 };
	a >> x;
	b << y;

	for (int i = 0; i < 4; i++)
		cout << x[i] << ' ';
	cout << endl;
	b.show();
}

 


 

8. 원을 추상화한 Circle 클래스는 간단히 아래와 같다. . . . 다음 연산이 가능하도록 연산자를 프렌드 함수로 작성하라

[결과]

[메인 함수]

#include <iostream>
#include <string>
using namespace std;

class Circle
{
	int radius;
public:
	Circle(int radius = 0) { this->radius = radius; }
	friend Circle& operator++ (Circle &op);
	friend Circle& operator++(Circle& op, int x);
	void show() { cout << "radius = " << radius << " 인 원" << endl; }
};

Circle& operator++ (Circle& op)
{
	++op.radius;
	return op;
}

Circle& operator++ (Circle& op, int x)
{
	Circle tmp = op;
	op.radius++;
	return tmp;
}

int main()
{
	Circle a(5), b(4);
	++a;
	b = a++;
	a.show();
	b.show();
}

 


 

9. 문제 8번의 Circle 객체에 대해 다음 연산이 가능하도록 연산자를 구현하라.

[결과]

[소스 코드]

#include <iostream>
#include <string>
using namespace std;

class Circle
{
	int radius;
public:
	Circle(int radius = 0) { this->radius = radius; }
	friend Circle operator + (int x, Circle op);
	void show() { cout << "radius = " << radius << " 인 원" << endl; }
};

Circle operator + (int x, Circle op)
{
	int y = x + op.radius;
	return y;
}

int main()
{
	Circle a(5), b(4);
	b = 1 + a;
	a.show();
	b.show();
}

 


 

10. 통계를 내는 Statistic 클래스를 만들려고 한다. 데이터는 Statistic 클래스 내부에 int 배열을 동적으로 할당받아 유지한다. 다음과 같은 연산이 잘 이루어지도록 Statistic 클래스와 ! , >> , << , ~ 연산자 함수를 작성하라.

[결과]

뭔가 좀 아쉽다..

[소스 코드]

#include <iostream>
#include <string>
using namespace std;

class Statistic
{
	int i = 0;
	int count = 0;
	int* pArray = new int[50];
	bool isClear;
public:
	Statistic()
	{
		for (int i = 0; i < 50; i++)
			pArray[i] = 0;
		isClear = true;
	}

	~Statistic()
	{
		delete[] pArray;
	}

	bool operator ! ()
	{
		if (isClear)
			return true;
		else
			return false;
	}

	void operator ~()
	{
		for (int i = 0; i < count; i++)
		{
			cout << pArray[i] << ' ';
		}
		cout << endl;
	}

	Statistic& operator << (int x)
	{
		isClear = false;
		pArray[i] = x;
		i++;
		count++;
		
		return *this;
	}

	void operator >> (int &avg)
	{
		int sum = 0;
	
		for (int i = 0; i < count; i++)
		{
			sum += pArray[i];
		}
		avg = sum / count;
	}
};

int main()
{
	Statistic stat;
	if (!stat) cout << "현재 통계 데이터가 없습니다." << endl;

	int x[5];
	cout << "5개의 정수를 입력하라 >> ";
	for (int i = 0; i < 5; i++)
		cin >> x[i];

	for (int i = 0; i < 5; i++)
		stat << x[i];

	stat << 100 << 200;
	~stat;

	int avg;
	stat >> avg;
	cout << "avg = " << avg << endl;
}

 


 

11. 스택 클래스 Stack을 만들고 푸시(push)용으로 << 연산자를, 팝(pop)을 위해 >> 연산자를, 비어 있는 스택인자를 알기 위해 ! 연산자를 작성하라, 다음 코드를 main()으로 작성하라.

[결과]

[소스 코드]

#include <iostream>
#include <string>
using namespace std;

class Stack
{
	int size = 3, count = 2, i = 0;
	int* pArray = new int[size];
public:
	Stack()
	{
		for (int i = 0; i < size; i++)
			pArray[i] = 0;
	}

	~Stack()
	{
		delete[]pArray;
	}

	Stack &operator << (int x)
	{	
		pArray[i] = x;
		i++;

		return *this;
	}

	void operator >> (int &x)
	{
		x = pArray[count];
		count--;
		size--;
	}
	
	bool operator ! ()
	{
		if (size == 0)
			return true;
		else
			return false;
	}
};

int main()
{
	Stack stack;
	stack << 3 << 5 << 10;
	while (true)
	{
		if (!stack)
			break;
		int x;
		stack >> x; 
		cout << x << ' ';
	}
	cout << endl;
}

 


 

12. 정수 배열을 항상 증가 순으로 유지하는 SortedArray 클래스를 작성하려고 한다. 아래의 main() 함수가 작동할 만큼만 SortedArray 클래스를 작성하고 +와 = 연산자도 작성하라.

[결과]

복습 후 다시 풀어야겠다. 복사 생성자, 연산자 중복이 종합된 문제다. 인터넷에서 내용을 참고했다..

[소스 코드]

#include<iostream>
using namespace std;

class SortedArray {
    int size; // 현재 배열의 크기 
    int* p; // 정수 배열에 대한 포인터 
    void sort(); // 정수 배열을 오름차순으로 정렬 
public:
    SortedArray(); // p는 NULL로 size는 0으로 초기화 
    SortedArray(SortedArray& src); // 복사 생성자 
    SortedArray(int p[], int size); // 생성자. 정수 배열과 크기를 전달받음 
    ~SortedArray(); // 소멸자 
    SortedArray operator+ (SortedArray& op2); // 현재 배열에 op2 배열 추가 
    SortedArray& operator= (const SortedArray& op2); // 현재 배열에 op2 배열 복사 
    void show(); // 배열의 원소 출력 
};

void SortedArray::show() {
    sort();
    cout << "배열 출력 : ";
    for (int i = 0; i < size; i++)
        cout << p[i] << ' ';
    cout << endl;
}

SortedArray::SortedArray() {
    size = 0;
    p = NULL;
}

SortedArray::SortedArray(int p[], int size) {
    this->p = new int[size];
    this->size = size;
    for (int i = 0; i < size; i++)
        this->p[i] = p[i];
}

SortedArray::SortedArray(SortedArray& src) {
    this->size = src.size;
    this->p = new int[this->size];
    for (int i = 0; i < this->size; i++)
        this->p[i] = src.p[i];
}

SortedArray& SortedArray::operator= (const SortedArray& op2) {
    delete[] p; // 배열 메모리 delete
    this->size = op2.size;
    this->p = new int[this->size]; // 객체 op2의 크기만큼 다시 동적 할당
    for (int i = 0; i < this->size; i++)
        this->p[i] = op2.p[i];
    return *this;
}

SortedArray SortedArray::operator+ (SortedArray& op2) {
    SortedArray test;
    test.size = this->size + op2.size;
    test.p = new int[test.size];
    for (int i = 0; i < test.size; i++) {
        if (i < this->size)
            test.p[i] = this->p[i];
        else
            test.p[i] = op2.p[i - (test.size - op2.size)]; //total size - op2.size = this->size 
    }
    return test;
}

void SortedArray::sort() {
    int swp;
    for (int i = 0; i < size; i++) { //p[0] ~ p[size] sequential sort 
        for (int j = i; j < size; j++) {
            if (p[i] < p[j] || p[i] == p[j]);
            else {
                swp = p[i];
                p[i] = p[j];
                p[j] = swp;
            }
        }
    }
}

SortedArray::~SortedArray() {
    if (p) delete[] p;
}

int main() {
    int n[] = { 2, 20, 6 };
    int m[] = { 10, 7, 8, 30 };
    SortedArray a(n, 3), b(m, 4), c;

    c = a + b; // +, = 연산자 작성 필요
    // + 연산자가 SortedArray 객체를 리턴하므로 복사 생성자 필요

    a.show();
    b.show();
    c.show();
}

 


책에서 나오는 힌트나 조건들의 일부는 저작자 존중을 위해 일부러 작성하지 않았습니다. 

개인 공부용으로 올리는 만큼 풀이에 대한 지적 감사하겠습니다.

반응형