1. 문제

 

Huma의 Food 먹기 게임

 

게임에는 Human, Monster, Food의 객체가 등장하며, 이들은 10x20 격저판에서 각각 정해진 규칙에 의해 움직인다. Human 객체는 사용자의 키에 의해 왼쪽(a 키), 아래(s 키), 위(d 키), 오른쪽(f 키)으로 한칸씩 움직이고, Monster는 한 번에 2칸씩, 왼쪽, 아래, 위, 오른쪽 방향으로 랜덤하게 움직인다. Food는 5번 중에 3번은 제자리에 있고, 나머지 2번은 4가지 방향 중 랜덤하게 한 칸씩 움직인다.

 

게임은 Hyman이 Monster를 피해 Food를 먹으면(Food의 위치로 이동) 성공으로 끝나고, Monster가 Food를 먹거나 Human이 Monster에게 잡히면 실패로 끝난다.

 

다음은 각 객체의 이동을 정의하는 move()와 각 객체의 모양을 정의하는 getShape() 함수를 순수 가상 함수로 가진 추상 클래스 GameObject이다. GameObject를 상속받아 Human, Monster, Food 클래스를 작성하라. 그리고 전체적인 게임을 진행하는 Game 클래스와 main() 함수를 작성하고 프로그램을 완성하라.

 

 

2. 결과

 

 

 

 

3. 코드

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

class GameObject {
protected:
	int distance;
	int x, y;
public:
	GameObject(int startX, int startY, int distance) {
		this->x = startX; this->y = startY;
		this->distance = distance;
	}
	virtual ~GameObject() {};
	virtual void move() = 0;
	virtual char getShape() = 0;

	int getX() { return x; }
	int getY() { return y; }
	bool collide(GameObject *p) {
		if (this->x == p->getX() && this->y == p->getY())
			return true;
		else
			return false;
	}
};
class Human : public GameObject {
public:
	Human(int starX, int starY, int dis) : GameObject(starX, starY, dis) { ; }
	void move() {
		char key;
		cout << "왼쪽(a), 아래(s), 위(d), 오른쪽(f) >> ";
		cin >> key;
		cout << endl;
		if (key == 'a') {
			if (y - distance < 0) y = 20 + y - distance;
			else y -= distance;
		}
		else if (key == 's') {
			if (x + distance > 9) x = x + distance - 10;
			else x += distance;
		}
		else if (key == 'd') {
			if (x - distance < 0) x = 10 + x - distance;
			else x -= distance;
		}
		else if (key == 'f') {
			if (y + distance > 19) y = y + distance - 20;
			else y += distance;
		}
	}
	char getShape() {
		return 'H';
	}
};
class Monster : public GameObject {
public:
	Monster(int starX, int starY, int dis) : GameObject(starX, starY, dis) {
		srand((unsigned)time(0));
	}
	void move() {
		int num;
		num = rand() % 2;
		switch (num) {
		case 0:
			if (x - distance < 0) x = 10 + x - distance;
			else x -= distance;
			break;
		case 1:
			if (x + distance > 9) x = x + distance - 10;
			else x += distance;
			break;
		}
		num = rand() % 2;
		switch (num) {
		case 0:
			if (y - distance < 0) y = 20 + y - distance;
			else y -= distance;
			break;
		case 1:
			if (y + distance > 19) y = y + distance - 20;
			else y += distance;
			break;
		}
	}
	char getShape() {
		return 'M';
	}
};
class Food : public GameObject {
	int count;
public:
	Food(int starX, int starY, int dis) : GameObject(starX, starY, dis) {
		srand((unsigned)time(0));
		count = 0;
	}
	void move() {
		int n1, n2;		//n1 : 2/5 확률, n2 : 방향 선택
		n1 = rand() % 5;
		n2 = rand() % 4;
		if (n1 >= 1 && n1 <= 2) {
			switch (n2) {
			case 0:
				if (y - distance < 0) y = 20 + y - distance;
				else y -= distance;
				break;
			case 1:
				if (x + distance > 9) x = x + distance - 10;
				else x += distance;
				break;
			case 2:
				if (x - distance < 0) x = 10 + x - distance;
				else x -= distance;
				break;
			case 3:
				if (y + distance > 19) y = y + distance - 20;
				else y += distance;
				break;
			}
		}
	}
	char getShape() {
		return '@';
	}
};

class Game {
public:
	void game() {
		bool exit = true;
		Human* h = new Human(0, 0, 1);	Monster *m = new Monster(5, 5, 2);
		Food* f = new Food(8, 9, 1);

		cout << "** Human의 Food 먹기 게임을 시작합니다." << endl << endl;
		while (exit) {					// 10x20의 게임판을 출력
			for (int i = 0; i<10; i++) {
				for (int ii = 0; ii<20; ii++) {
					if (m->getX() == i && m->getY() == ii) cout << m->getShape();		// 순서 중요함 몬스터->헌터->음식 순으로 if문을
					else if (h->getX() == i && h->getY() == ii) cout << h->getShape();	// 만들어야 같은 위치가 되었을 때 출력할 문자의 순서가 됨
					else if (f->getX() == i && f->getY() == ii) cout << f->getShape();
					else cout << '-';
				}
				cout << endl;
			}

			if (m->collide(h)) {
				cout << "Human is Loser!!" << endl << "인간이 몬스터에게 잡혔습니다." << endl << endl;
				exit = false;
				break;
			}
			else if (m->collide(f)) {
				cout << "Human is Loser!!" << endl << "몬스터가 음식을 먹었습니다." << endl << endl;
				exit = false;
				break;
			}
			else if (h->collide(f)) {
				cout << "Human is Winner!!" << endl << "인간이 음식을 먹었습니다." << endl << endl;
				exit = false;
				break;
			}

			h->move();
			m->move();
			f->move();
		}

	}
};

int main() {
	Game* g = new Game;
	g->game();
	delete g;
}

 

4. 설명

 

GameObject를 상속받는 Human, Monster, Food 클래스와

 

전체적인 게임을 진행하는 Game 클래스를 작성하면 된다.

 

 

Game 클래스의 game메소드는 3개의 객체를 각각 하나씩 생성하며 시작한다.

 

GameObject 클래스에서 순수 가상 함수 선언한 move()와 getShape를 Human, Monster, Food 클래스의서 알맞게 구현한 후 호출하면 된다.

 

 

설명은 중간중간 주석으로 입력해놨습니다.

 

+ rand() % 4 = 랜덤 수를 구합니다. 왼쪽식의 결과로는 0~3 사이의 수를 얻을 수 있습니다. 

rand()로는 0~32000정도의 수를 얻어오는데 이 수 중 어느 수라도 4로 나눈 후 나머지는 0~3이기 때문입니다.

 

+ srand((unsigned)time(0)); = 보통 위 rand()와 연계하여 사용하는 것 입니다. 이를 입력해주어야 실행 때마다 다른 결과를 얻을 수 있습니다.

 

1. 문제

 

10. 간단한 그래픽 편집기를 콘솔 바탕으로 만들어보자. 그래픽 편집기의 기능은 "삽입", "삭제", "모두보기", "종료" 의 4가지이고, 실행 과정은 다음과 같다.

 

 

2. 결과

 

 

3. 코드

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

class Shape {
	Shape* next;
protected:
	virtual void draw() = 0;
public:
	Shape() { next = NULL; }
	virtual ~Shape() { }
	void paint() { draw(); }
	Shape* add(Shape* p) { this->next = p; return p; }
	Shape* getNext() { return next; }
	void setNext(Shape *p) { this->next = p->next; }
};
class Circle : public Shape {
protected:
	virtual void draw() {
		cout << "Circle" << endl;
	}
};
class Rect : public Shape {
protected:
	virtual void draw() {
		cout << "Rectangle" << endl;
	}
};
class Line : public Shape {
protected:
	virtual void draw() {
		cout << "Line" << endl;
	}
};

class UI {
public:
	static int main_memu() {
		int n;
		cout << "삽입:1, 삭제:2, 모두보기:3, 종료:4 >> ";
		cin >> n;
		return n;
	}
	static int one_menu() {
		int n;
		cout << "선:1, 원:2, 사각형:3 >> ";
		cin >> n;
		return n;
	}
	static int two_menu() {
		int n;
		cout << "삭제하고자 하는 도형의 인덱스 >> ";
		cin >> n;
		return n;
	}
};

class GraphicEditor {
	Shape *pStart;
	Shape *pLast;
	int count;
public:
	GraphicEditor() { pStart = NULL; count = 0; }
	void create(int num) {
		switch (num) {
		case 1:
			if (count == 0) {
				pStart = new Line();
				pLast = pStart;
			}
			else
				pLast = pLast->add(new Line());
			count++;
			break;

		case 2:
			if (count == 0) {
				pStart = new Circle();
				pLast = pStart;
			}
			else
				pLast = pLast->add(new Circle());
			count++;
			break;

		case 3:
			if (count == 0) {
				pStart = new Rect();
				pLast = pStart;
			}
			else
				pLast = pLast->add(new Rect());
			count++;
			break;

		}
	}
	void indelete(int num) {
		Shape *p = pStart;
		Shape *del = pStart;

		if (num < count) {
			for (int i = 0; i<num; i++) {
				p = del;
				del = del->getNext();
			}
			if (num == 0)
				pStart = p->getNext();
			else
				p->setNext(del);
			count--;
			if (count == 1) pLast = pStart;
			delete del;

		}
		else
			cout << "인덱스를 잘못 입력하셨습니다." << endl;
	}
	void call() {
		bool exit = true;
		cout << "그래픽 에디터입니다." << endl;
		while (exit) {
			switch (UI::main_memu()) {
			case 1:
				create(UI::one_menu());
				break;
			case 2:
				indelete(UI::two_menu());
				break;
			case 3: {
				Shape* p = pStart;
				for (int i = 0; i< count; i++) {
					cout << i << ": "; p->paint();
					p = p->getNext();
				}
				break;
			}
			case 4:
				exit = false;
				break;

			}
		}
	}
};

int main() {
	GraphicEditor* editor = new GraphicEditor;
	editor->call();
	delete editor;
}

 

4. 설명

 

Shape 클래스를 상속하는 Line, Circle, Rect 클래스

 

GrapgicEditor 클래스

 

UI 클래스

 

크게는 이 3부분으로 나누어 진다.

 

 

힌트 그림을 참고하여서 구현하였기 때문에 그림을 같이 보시면 이해하는데 도움이 될 것이다.

 

UI 클래스는 정적 메소드로 선언하였기 때문에 "UI::메소드 이름" 으로 호출할 수 있다.

 

GraphiEditor 클래스는 Shape 포인터 변수 pStart와 pLast를 멤버 변수로 가지며 리스트를 관리한다.

 

Shape 클래스를 상속하는 Line, Circle, Rect 클래스들은 리스트에서의 한 개의 노드(데이터 + 포인터) 라 생각하면 된다.

 

 

 

 

1. 문제

 

9. 다음 그림과 같은 상속 구조를 갖는 클래스를 설계한다.

 

모든 프린터는 모델명(model), 제조사(manufacturer), 인쇄 매수(printedCount), 인쇄 종이 잔량(availableCount)을 나타내는 정보를 가진다. print(int pages) 함수와 show() 함수는 가상 함수로 구현하라. print(int pages)는 pages 만큼 프린트 하는 함수이고, show() 함수는 현재 프린트의 모델, 제조사, 인쇄 매수, 인쇄 종이 잔량 등을 출력하는 함수이다.

 

잉크젯 프린터는 잉크 잔량(availableInk) 정보를 추가적으로 가지며, 레이저 프린터는 토너 잔량(availableToner) 정보를 추가적으로 가진다. 이들의 print(int pages) 멤버 함수는 프린터 타입에 맞게 구현하라. 각 클래스를 설계 구현하고 다음과 같이 실행되도록 전체 프로그램을 완성하라. InkJetPrinter 객체와 LaserPrinter 객체를 각각 하나만 동적으로 생성하여 시작한다.

 

 

2. 결과

 

 

 

3. 코드

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

class printer {
protected:
	string model;
	string manufacturer;
	int printedCount;
	int availableCount;
public:
	printer(string m, string ma, int avail) { model = m; manufacturer = ma; availableCount = avail; }
	virtual void print(int pages) = 0;
	virtual void show() = 0;
	int getAvail() { return availableCount; }
};
class InkJetPrinter : public printer {
	int availableInk;
public:
	InkJetPrinter(string m, string ma, int avail, int availInk) : printer(m, ma, avail) {
		availableInk = availInk;
	}
	void print(int pages) {
		printedCount = pages;
		availableCount -= printedCount;
		availableInk -= printedCount;
	}
	void show() {
		cout << model << " ," << manufacturer << " ,남은 종이 " << availableCount << "장 ,남은 잉크 " << availableInk << endl;
	}
};
class LaserPrinter : public printer {
	int availableToner;
public:
	LaserPrinter(string m, string ma, int avail, int availToner) : printer(m, ma, avail) {
		availableToner = availToner;
	}
	void print(int pages) {
		printedCount = pages;
		availableCount -= printedCount;
		availableToner -= printedCount;
	}
	void show() {
		cout << model << " ," << manufacturer << " ,남은 종이 " << availableCount << "장 ,남은토너 " << availableToner << endl;
	}
};

int main() {
	InkJetPrinter* Ink = new InkJetPrinter("Officejet V40", "HP", 5, 10);
	LaserPrinter* Laser = new LaserPrinter("SCX-6x45", "삼성전자", 3, 20);
	int a, b;
	string exit;

	cout << "현재 작동중인 2 대의 프린터는 아래와 같다" << endl;
	cout << "잉크젯 : "; Ink->show();
	cout << "레이저 : "; Laser->show();

	while (1) {
		cout << endl << "프린터(1:잉크젯, 2:레이저)와 매수 입력>>";
		cin >> a >> b;
		if (a == 1) {
			if (b > Ink->getAvail()) {
				cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
				Ink->show();
				Laser->show();
			}
			else {
				cout << "프린트하였습니다." << endl;
				Ink->print(b);
				Ink->show();
				Laser->show();
			}
		}
		else if (a == 2) {
			if (b > Laser->getAvail()) {
				cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
				Ink->show();
				Laser->show();
			}
			else {
				cout << "프린트하였습니다." << endl;
				Laser->print(b);
				Ink->show();
				Laser->show();
			}
		}
		cout << "계속 프린트 하시겠습니까(y/n)>>";
		cin >> exit;
		if (exit == "n") break;
	}
}

 

4. 설명

 

print, show 함수를 가상 함수로 선언한 후 자식 클래스에서 각각 알맞게 구현하였습니다.

 

main에서는 각 객체를 하나 씩 동적으로 생성하였습니다.

 

 

※ 예시 그림에는 남은 토너 수가 19개가 되어있는데 저는 장당 1개씩 빼서 18개가 되었습니다. 

 

 

 

 

1. 문제

 

7. Shape 클래스를 상속받아 타원을 표현하는 Oval, 사각형을 표현하는 Rect, 삼각형을 표현하는 Triangular 클래스를 작성하라. main()을 작성하고 실행하면 다음과 같다.

 

8. 문제 7에 주어진 Shape 클래스를 추상 클래스로 만들고 문제 7을 다시 작성하라.

 

 

 

2. 결과

 

7.

8.

 

 

3. 코드

 

7.

#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() { return 0; }
	string getName() { return name; }
};

class Oval : public Shape {
public :
	Oval(string n, int w, int h) : Shape(n, w, h) {;}
	double getArea() { return width*height*3.14; }
};
class Rect : public Shape {
public :
	Rect(string n, int w, int h) : Shape(n, w, h) {;}
	double getArea() { return width*height; }
};
class Triangular : public Shape {
public :
	Triangular(string n, int w, int h) : Shape(n, w, h) {;}
	double getArea() { return width*height/2; }
};

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

8.

#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 n, int w, int h) : Shape(n, w, h) {;}
	double getArea() { return width*height*3.14; }
};
class Rect : public Shape {
public :
	Rect(string n, int w, int h) : Shape(n, w, h) {;}
	double getArea() { return width*height; }
};
class Triangular : public Shape {
public :
	Triangular(string n, int w, int h) : Shape(n, w, h) {;}
	double getArea() { return width*height/2; }
};

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

 

4. 설명

 

사실 코드를 2개 써 작성해 놨지만 한 줄만 다를 뿐 결국은 같은코드이다.

 

8번 문제의 의도는 추상 클래스가 무엇인지 알고 있는지 물어보는 것인 것 같다.

 

추상 클래스란 최소 하나의 순수 가상 함수를 가진 클래스를 말한다.

 

Shape 함수의 getArea메소드는 어차피 각 자식 클래스에서 오버라이딩 하므로 Shape의 getArea메소드를 순수 가상함수로 만들어주면 Shape는 추상 클래스로 만들면서 같은 결과를 구할 수 있다.

 

 

 

1. 문제

 

6. 다음 AbstractStack은 정수 스택 클래스로서 추상 클래스이다.

 

이를 상속받아 정수를 푸시, 팝하는 IntStack 클래스를 만들고 사용 사례를 보여라.

 

 

2. 결과

 

 

3. 코드

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

class AbstractStack {
public :
	virtual bool push(int n) = 0;
	virtual bool pop(int& n) = 0;
	virtual int size() = 0;
};

class IntStack : public AbstractStack {
	int* stack;
	int top;
	int max;
public :
	IntStack(int n){ stack = new int[n]; max = n;  top=-1; }
	bool push(int n) {
		if( top == max ) return false;
		else {
		top++;
		stack[top] = n;
		return true;
		}
	}
	bool pop(int& n) {
		if( top < 0 ) return false;
		else {
		n = stack[top];
		top--;
		return true;
		}
	}
	int size() {
		return top+1;
	}
};

int main() {
	IntStack intstack(50);
	int re;

	intstack.push(10);
	intstack.push(20);
	intstack.push(30);
	intstack.push(40);
	cout << "현재 원소 개수 : " << intstack.size() << "개" << endl;
	intstack.pop(re); 
	cout << "pop : " << re << endl;
	intstack.pop(re); 
	cout << "pop : " << re << endl;
	intstack.pop(re); 
	cout << "pop : " << re << endl;
	cout << "현재 원소 개수 : " << intstack.size() << "개" << endl;
}

 

4. 설명

 

스택은 후입선출의 구조로서 가장 나중에 들어온 값이 가장 먼저 나가는 형태입니다.

 

main 함수를 보면 push로 10, 20, 30, 40을 순서대로 스택에 넣었습니다.

 

그 후 pop을 하면 가장 나중에 들어온 순서대로 40, 30, 20이 나간 후 현재 원소 개수를 size() 메소드로 알아보면 1개가 남은 것을 알 수 있습니다.

 

1. 문제

 

5. 디지털 회로에서 기본적인 게이트로 OR 게이트, AND 게이트, XOR 게이트 등이 있다. 이들은 각각 두 입력 신호를 받아 OR 연산, AND 연산, XOR 연산을 수행한 결과를 출력한다. 이 게이트들을 각각 ORGate, XORGate, ANDGate 클래스로 작성하고자 한다. ORGate, XORGate, ANDGate 클래가 AbstractGate를 상속받도록 작성하라.

 

 

2. 결과

 

 

3. 코드

#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() {
		if (x == true && y == true) return true;
		else return false;
	}
};
class ORGate : public AbstractGate {
public:
	bool operation() {
		if (x == true || y == true) return true;
		else return false;
	}
};
class XORGate : public AbstractGate {
public:
	bool operation() {
		if (x != y) return true;
		else return false;
	}
};

int main() {
	ANDGate a;
	ORGate o;
	XORGate xo;

	a.set(true, false);
	o.set(true, false);
	xo.set(true, false);
	cout.setf(ios::boolalpha);
	cout << a.operation() << endl;
	cout << o.operation() << endl;
	cout << xo.operation() << endl;
}

 

4. 설명

 

and, or, xor 은 각각 &&, ||, != 로 표현 합니다.

 

 

visual studio 2017에서 and, or, xor 변수명이 오류가 발생하여서 임의로 바꾸어 실행 하였습니다.

 

 

아마 2017로 오면서 예약어로 바뀐 것 같습니다.

 

1. 문제

 

[3~4] 다음 추상 클래스 LoopAdder가 있다.

 

3. LoopAdder 클래스를 상속받아 다음 main() 함수와 실행 결과처럼 되도록 ForLoopAdder 클래스를 작성하라. ForLoopAdder 클래스의 calculate() 함수는 for 문을 이용하여 합을 구한다.

 

4. LoopAdder 클래스를 상속받아 다음 main() 함수와 실행 결과처럼 되도록 WhileLoopAdder, DoWhileLoopAdder 클래스를 작성하라. while 문, do-while 문을 이용하여 합을 구하도록 calculate() 함수를 작성하면 된다.

 

 

2. 결과

 

3.

 

4.

3. 코드

 

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

class LoopAdder {
	string name;
	int x, y, sum;
	void read();
	void write();
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();
	sum = calculate();
	write();
}

class ForLoopAdder : public LoopAdder {
public :
	ForLoopAdder(string name) : LoopAdder(name){;}
	int calculate() { 
		int sum=0;
		for(int i=getX(); i<=getY(); i++) 
			sum += i; 
		return sum;
	}
};

int main() {
	ForLoopAdder forLoop("For Loop");
	forLoop.run();
}
 

4.

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

class LoopAdder {
	string name;
	int x, y, sum;
	void read();
	void write();
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();
	sum = calculate();
	write();
}

class WhileLoopAdder : public LoopAdder {
public :
	WhileLoopAdder(string name) : LoopAdder(name){;}
	int calculate() { 
		int sum=0;
		int x = getX();
		while( x <= getY() ) {
			sum += x; 
			x++;
		}
		return sum;
	}
};
class DoWhileLoopAdder : public LoopAdder {
public :
	DoWhileLoopAdder(string name) : LoopAdder(name){;}
	int calculate() { 
		int sum=0;
		int x = getX();
		do {
			sum += x; 
			x++;
		} while( x <= getY() );
		return sum;
	}
};


int main() {
	WhileLoopAdder whileLoop("While Loop");
	DoWhileLoopAdder doWhileLoop("Do while Loop");
	
	whileLoop.run();
	doWhileLoop.run();
}

4. 설명

 

순수 가상 함수인 calculate를 각각 함수의 용도에 맞게 구현하는 문제 입니다.

 

for문과 while문으로 구현하는 방법은 거의 같다고 봐도 무방합니다.

 

※ 주의 하실 점은 do-while문은 우선 한번 실행한 후 조건문을 비교한다는 것입니다.

 

 

1. 문제

 

1. Converter 클래스를 상속받아 달러를 원화로 환산하는 WonToDollar 클래스를 작성하라. main() 함수와 실행 결과는 다음과 같다.

 

 

2. Converter 클래스를 상속받아 km를 mile(마일)로 변환하는 KmToMile 클래스를 작성하라. main() 함수와 실행 결과는 다음과 같다.

 

 

 

2. 결과

1.

 

2.

 

 

3. 코드

1.

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

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

class WonToDollar : public Converter {
public :
	WonToDollar(int n) : Converter(n) { };
	double convert(double src) { 
		double re = src / 1010;
		return re;
	}
	string getSourceString() {
		return "원";
	}
	string getDestString() {
		return "달러";
	}
};

int main() {
	WonToDollar wd(1010);
	wd.run();
}

2.

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

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

class KmToMile : public Converter {
public :
	KmToMile(int n) : Converter(n) { };
	double convert(double src) { 
		double re = src / 1.609344;
		return re;
	}
	string getSourceString() {
		return "Km";
	}
	string getDestString() {
		return "Mile";
	}
};

int main() {
	KmToMile toMile(1.609344);
	toMile.run();
}

 

4. 설명

 

 

Converter의 선언된 순수 가상함수인 convert, getSourceString, getDestString 함수를 자식 클래스에서 각각의 맞게 구현해 줍니다.

 

※ 주의하실 점은 자식 클래스에서 이들 중 구현을 하지 않은게 있다면 오류가 발생합니다.

 

+ Recent posts