728x90
반응형
본 글은 "황기태"님의 [명품 C++ Programming]의 연습 문제 답을 공유하고자 작성되었으며, 필자가 직접 문제를 풀며 작성한 것이기에 오류가 있을 수 있습니다. 댓글로 알려주시면 반영하도록 하겠습니다.
시리즈 보기
[C++] 명품 C++ Programming 1장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 1장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 3장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 5장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 6장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 7장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 9장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 9장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 11장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 11장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 12장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 12장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 13장 연습 문제 풀이 (이론 문제)
9.1 - 9.2
class Converter {
protected:
double ratio;
virtual double convert(double src) = 0;
virtual string getSourceString() = 0;
virtual string getDestString() = 0;
public:
Converter(double ratio) { this->ratio = ratio; }
void run() {
double src;
cout << getSourceString() << "을 " << getDestString() << "로 바꿉니다.";
cout << getSourceString() << "을 입력하세요>> ";
cin >> src;
cout << "변환 결과 : " << convert(src) << getDestString() << endl;
}
};
💡
int main() {
WonToDollor wd(1010);
wd.run();
}
class WonToDollor : public Converter {
public:
WonToDollor(int ratio) : Converter(ratio) {}
double convert(double src) { return src / ratio; };
string getSourceString() { return "원"; }
string getDestString() { return "달러"; }
};
💡
int main() {
KmToMile toMile(1.609344);
toMile.run();
}
class KmToMile : public Converter {
public:
KmToMile(double ratio = 0.0) : Converter(ratio) { }
double convert(double src) { return src / ratio; }
string getSourceString() { return "Km"; }
string getDestString() { return "Mile"; }
};
9.3 - 9.4
class LoopAdder {
string name; // 루프 이름
int x, y, sum; // x에서 y까지의 합은 sum
void read(); // x, y 값을 읽어 들이는 함수
void write(); // sum을 출력하는 함수
protected:
LoopAdder(string name = "") { this->name = name; }
int getX() { return x; }
int getY() { return y; }
virtual int calculate() = 0; // 루프를 돌며 합을 구하는 함수
public:
void run(); // 연산 진행
};
void LoopAdder::read() {
cout << name << ":" << endl;
cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";
cin >> x >> y;
}
void LoopAdder::write() {
cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다." << endl;
}
void LoopAdder::run() {
read(); // x, y를 읽는다.
sum = calculate(); // 루프를 돌면서 계산한다.
write(); // 결과 sum을 출력한다.
}
💡
#include <iostream>
#include <string>
using namespace std;
class LoopAdder {
string name; // 루프 이름
int x, y, sum; // x에서 y까지의 합은 sum
void read(); // x, y 값을 읽어 들이는 함수
void write(); // sum을 출력하는 함수
protected:
LoopAdder(string name = "") { this->name = name; }
int getX() { return x; }
int getY() { return y; }
virtual int calculate() = 0; // 루프를 돌며 합을 구하는 함수
public:
void run(); // 연산 진행
};
void LoopAdder::read() {
cout << name << ":" << endl;
cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";
cin >> x >> y;
}
void LoopAdder::write() {
cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다." << endl;
}
void LoopAdder::run() {
read(); // x, y를 읽는다.
sum = calculate(); // 루프를 돌면서 계산한다.
write(); // 결과 sum을 출력한다.
}
class ForLoopAdder : public LoopAdder {
int sum = 0;
public:
ForLoopAdder(string name) : LoopAdder(name) {}
int calculate() {
for (int i = getX(); i <= getY(); i++) {
sum += i;
}
return sum;
}
};
int main() {
ForLoopAdder forLoop("For Loop");
forLoop.run();
}
💡
#include <iostream>
#include <string>
using namespace std;
class LoopAdder {
string name; // 루프 이름
int x, y, sum; // x에서 y까지의 합은 sum
void read(); // x, y 값을 읽어 들이는 함수
void write(); // sum을 출력하는 함수
protected:
LoopAdder(string name = "") { this->name = name; }
int getX() { return x; }
int getY() { return y; }
virtual int calculate() = 0; // 루프를 돌며 합을 구하는 함수
public:
void run(); // 연산 진행
};
void LoopAdder::read() {
cout << name << ":" << endl;
cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";
cin >> x >> y;
}
void LoopAdder::write() {
cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다." << endl;
}
void LoopAdder::run() {
read(); // x, y를 읽는다.
sum = calculate(); // 루프를 돌면서 계산한다.
write(); // 결과 sum을 출력한다.
}
class WhileLoopAdder :public LoopAdder {
int sum = 0;
public:
WhileLoopAdder(string name) : LoopAdder(name) {}
int calculate() {
int plus = getX();
while (plus <= getY()) {
sum += plus;
plus++;
}
return sum;
}
};
class DoWhileLoopAdder : public LoopAdder {
int sum = 0;
public:
DoWhileLoopAdder(string name) : LoopAdder(name) {}
int calculate() {
int ret = 0;
int plus = getX();
do {
ret += plus;
plus++;
} while (plus <= getY());
return ret;
}
};
int main() {
WhileLoopAdder whileLoop("while Loop");
DoWhileLoopAdder doWhileLoop("Do while Loop");
whileLoop.run();
doWhileLoop.run();
}
💡
class AbstractGate {
protected:
bool x, y;
public:
void set(bool x, bool y) { this->x = x; this->y = y; }
virtual bool operation() = 0;
};
int main() {
ANDGate andGate;
ORGate orGate;
XORGate xorGate;
andGate.set(true, false);
orGate.set(true, false);
xorGate.set(true, false);
cout.setf(ios::boolalpha);
cout << andGate.operation() << endl;
cout << orGate.operation() << endl;
cout << xorGate.operation() << endl;
}
#include <iostream>
#include <string>
using namespace std;
class AbstractGate {
protected:
bool x, y;
public:
void set(bool x, bool y) { this->x = x; this->y = y; }
virtual bool operation() = 0;
};
class ANDGate : public AbstractGate {
public:
bool operation() {
return x & y;
}
};
class ORGate : public AbstractGate {
public:
bool operation() {
return x | y;
}
};
class XORGate : public AbstractGate {
public:
bool operation() {
return x ^ y;
}
};
int main() {
ANDGate andGate;
ORGate orGate;
XORGate xorGate;
andGate.set(true, false);
orGate.set(true, false);
xorGate.set(true, false);
cout.setf(ios::boolalpha);
cout << andGate.operation() << endl;
cout << orGate.operation() << endl;
cout << xorGate.operation() << endl;
}
💡
#include <iostream>
#include <string>
using namespace std;
class AbstractStack {
public:
virtual bool push(int n) = 0; // 스택에 n을 푸시
virtual bool pop(int& n) = 0; // 스택에서 팝한 정수를 n에 저장
virtual int size() = 0; // 스택에 저장된 정수의 개수 리턴
};
class IntStack : public AbstractStack {
int stack[5] = { 0 };
int top = -1;
public:
bool push(int n) {
if (size() + 1 >= 5) {
cout << "스택이 가득 찼습니다." << endl;
return false;
}
stack[++top] = n;
return true;
}
bool pop(int& n) {
if (size() < 0) {
cout << "스택이 비어있습니다." << endl;
return false;
}
n = stack[top--];
return true;
}
int size() {
return top;
}
void show() {
cout << "스택 안의 내용 : ";
for (int i = 0; i <= top; i++) {
cout << stack[i] << ' ';
}
cout << endl;
}
};
int main() {
IntStack intStack;
for (int i = 0; i < 5; i++) {
intStack.push(i * 10);
}
intStack.show();
int n;
intStack.pop(n);
cout << n << " 이 나왔습니다." << endl;
intStack.show();
}
9.7 - 9.8
class Shape {
protected:
string name;
int width, height; // 도형이 내접하는 사각형의 너비와 높이
public:
Shape(string n = "", int w = 0, int h = 0) { name = n; width = w; height = h; }
virtual double getArea() { return 0; } // dummy 값 리턴
string getname() { return name; }
};
💡
int main() {
Shape* p[3];
p[0] = new Oval("빈대떡", 10, 20);
p[1] = new Rect("찰떡", 30, 40);
p[2] = new Triangular("토스트", 30, 40);
for (int i = 0; i < 3; i++) {
cout << p[i]->getname() << " 넓이는 " << p[i]->getArea() << endl;
}
for (int i = 0; i < 3; i++) delete p[i];
}
💡
#include <iostream>
#include <string>
using namespace std;
class Shape {
protected:
string name;
int width, height;
public:
Shape(string n = "", int w = 0, int h = 0) { name = n; width = w; height = h; }
virtual double getArea() = 0;
string getname() { return name; }
};
class Oval : public Shape {
public:
Oval(string name, int w, int h) : Shape(name, w, h) {}
double getArea() {
return 3.14 * width * height;
}
};
class Rect : public Shape {
public:
Rect(string name, int w, int h) : Shape(name, w, h) {}
double getArea() {
return width * height;
}
};
class Triangular : public Shape {
public:
Triangular(string name, int w, int h) : Shape(name, w, h) {}
double getArea() {
return 0.5 * width * height;
}
};
int main() {
Shape* p[3];
p[0] = new Oval("빈대떡", 10, 20);
p[1] = new Rect("찰떡", 30, 40);
p[2] = new Triangular("토스트", 30, 40);
for (int i = 0; i < 3; i++) {
cout << p[i]->getname() << " 넓이는 " << p[i]->getArea() << endl;
}
for (int i = 0; i < 3; i++) delete p[i];
}
💡
#include <iostream>
#include <string>
using namespace std;
class Printer {
string model;
string manufacturer;
int printedCount;
int availableCount;
protected:
Printer(string model, string manufacturer, int availableCount) {
this->model = model;
this->manufacturer = manufacturer;
this->availableCount = availableCount;
}
bool canPrint(int pages) {
if (availableCount - pages >= 0) return true;
else return false;
}
virtual void print(int pages) = 0;
virtual void show() = 0;
// print와 show 함수가 virtual이 되면서
// Printer 클래스의 private 멤버 변수 접근을 위한 함수들이 필요함
string getModel() { return model; }
string getManufacturer() { return manufacturer; }
int getPrintedCount() { return printedCount; }
int getAvailableCount() { return availableCount; }
void setModel(string model) { this->model = model; }
void setManufacturer(string manufacturer) { this->manufacturer = manufacturer; }
void setPrintedCount(int printedCount) { this->printedCount = printedCount; }
void setAvailableCount(int availableCount) { this->availableCount = availableCount; }
};
class InkJetPrinter : public Printer {
int availableInk;
public:
InkJetPrinter(string model, string manufacturer, int availableCount, int availableInk)
: Printer(model, manufacturer, availableCount) {
this->availableInk = availableInk;
}
int getAvailableInk() { return availableInk; }
void setAvailableInk(int availableInk) { this->availableInk = availableInk; }
bool canInkPrint(int pages) {
if (availableInk - pages >= 0) return true;
else return false;
}
void print(int pages) {
if (canPrint(pages)) {
if (canInkPrint(pages)) {
setPrintedCount(getPrintedCount() + pages);
setAvailableCount(getAvailableCount() - pages);
setAvailableInk(getAvailableInk() - pages);
cout << "프린트하였습니다" << endl;
}
else {
cout << "잉크가 부족하여 프린트할 수 없습니다." << endl;
}
}
else cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
}
void show() {
cout << getModel() << ", " << getManufacturer() << ", 남은 종이 " << getAvailableCount() << "장, 남은 잉크 " << getAvailableInk() << endl;
}
};
class LaserPrinter : public Printer {
int availableToner;
public:
LaserPrinter(string model, string manufacturer, int availableCount, int availableToner) : Printer(model, manufacturer, availableCount) {
this->availableToner = availableToner;
}
int getAvailableToner() { return availableToner; }
void setAvailableToner(int availableToner) { this->availableToner = availableToner; }
bool canLaserPrint(int pages) {
if (availableToner - pages >= 0) return true;
else return false;
}
void print(int pages) {
if (canPrint(pages)) {
if (canLaserPrint(pages)) {
setPrintedCount(getPrintedCount() + pages);
setAvailableCount(getAvailableCount() - pages);
setAvailableToner(getAvailableToner() - pages);
cout << "프린트하였습니다" << endl;
}
else {
cout << "토너가 부족하여 프린트할 수 없습니다." << endl;
}
}
else cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
}
void show() {
cout << getModel() << ", " << getManufacturer() << ", 남은 종이 " << getAvailableCount() << "장, 남은 토너 " << availableToner << endl;
}
};
int main() {
// 동적으로 생성하므로 포인터가 필요함
InkJetPrinter* ink = new InkJetPrinter("Officejet V40", "HP", 5, 10);
LaserPrinter* laser = new LaserPrinter("SCX-6x45", "삼성전자", 3, 20);
cout << "현재 작동중인 2대의 프린터는 아래와 같다" << endl;
cout << "잉크젯 : ";
ink->show();
cout << "레이저 : ";
laser->show();
int type, pages;
char cont;
while (true) {
cout << endl << "프린터(1:잉크젯, 2:레이저)와 매수 입력>>";
cin >> type >> pages;
switch (type) {
case 1: ink->print(pages); break;
case 2: laser->print(pages); break;
default: break;
}
ink->show();
laser->show();
cout << "게속 프린트 하시겠습니까(y/n)>>";
cin >> cont;
if (cont == 'n') break;
else continue;
}
return 0;
}
💡
// 잠시 미룸
반응형
'대학교 > 명품 C++programming 문제' 카테고리의 다른 글
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (실습 문제) (0) | 2022.12.06 |
---|---|
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (이론 문제) (0) | 2022.12.02 |
[C++] 명품 C++ Programming 9장 연습 문제 풀이 (이론 문제) (0) | 2022.11.30 |
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (실습 문제) (0) | 2022.11.29 |
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (이론 문제) (0) | 2022.11.25 |