관리 메뉴

공부 기록장 💻

[C++] 명품 C++ Programming 9장 실습 문제 본문

# Language & Tools/C++

[C++] 명품 C++ Programming 9장 실습 문제

dream_for 2021. 6. 1. 00:58

명품 C++ 프로그래밍 9장 실습 문제

 

 

1. 

#include <iostream>
using namespace std;

class Converter{
protected:
	double ratio;
	virtual double convert(double src)=0; // src를 다른 단위로 변환 
	virtual string getSourceString()=0; // src 단위 명칭 
	virtual string getDestString()=0; // dest 단위 명칭
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(double ratio):Converter(ratio){	};
	virtual double convert(double src){ // src를 다른 단위로 변환
		return src/ratio;}
	virtual string getSourceString(){ // src 단위 명칭 
		return "원";
	}
	virtual string getDestString(){ // dest 단위 명칭
		return "달러";
	}
};
int main(){
	WonToDollar wd(1010); // 1달러에 1010원(ratio)
	wd.run();	 
}

 

 

2.

class KmToMile:public Converter{
public:
	KmToMile(double ratio):Converter(ratio){};
	virtual double convert(double src){ // src를 다른 단위로 변환
		return src/ratio;}
	virtual string getSourceString(){ // src 단위 명칭 
		return "Km";
	}
	virtual string getDestString(){ // dest 단위 명칭
		return "Mile";
	}
};

int main(){
	KmToMile toMile(1.6093441010); // 1 mile = 1.609344 Km
	toMile.run();	 
}

 

 

3.

#include <iostream>
using namespace std;

// 추상 클래스 
class LoopAdder{
	string name;
	int 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{
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. 

class WhileLoopAdder:public LoopAdder{
public:
	WhileLoopAdder(string name=""):LoopAdder(name){};
	int calculate(){
		int i=getX(), sum=0;
		while(i<=getY()){
			sum+=i++;
		}
		return sum;
	}
};

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

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

 

 

 

5. 

#include <iostream>
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); // 불린 값을 문자열 형태로 "true", "false"로 출력
	
	cout<< andGate.operation() << endl; 
	cout<< orGate.operation() << endl; 
	cout<< xorGate.operation() << endl; 
}

 

6. 

#include <iostream>
using namespace std;

class AbstractStack{
protected:
public:
	virtual bool push(int n)=0; // 스택에 n push하고 스택이 full이면 false return 
	virtual bool pop(int& n)=0; // 스택에서 정수를 n에 저장하고 스택이 empty면 false return 
	virtual int size()=0; // 현재 스택에 저장된 정수 리턴 
};

class IntStack:public AbstractStack{
	int top; // 스택의 상단 
	int capacity; // 전체 용량
	int *mem; // 동적 메모리 할당받을 포인터 
public:
	IntStack(int capacity){
		this->capacity=capacity;
		top=0;
		mem=new int[capacity];
	}
	~IntStack(){
		if(mem) delete []mem;
	} 
	bool push(int n){
		if(top==capacity) return false;
		mem[top++]=n;
		return true;
	}
	bool pop(int& n){
		if(top==0) return false;
		n=mem[--top];
		return true;		
	}
	int size(){return top;}
};

int main(){
	IntStack intStack(3); // 5개의 요소를 저장할 수 있는 스택 생성
	for(int i=0;i<5;i++){
		if(intStack.push(i)) cout<<"스택에 "<<i<<" push, 스택의 요소 개수 : "<<intStack.size()<<endl;
		else{
			cout<<"스택 포화"<<endl<<endl;;
			break;
		}
	}
	int data;
	for(int i=0;i<5;i++){
		if(intStack.pop(data)) cout<<"스택에서 "<<data<<" pop, 스택의 요소 개수 : "<<intStack.size()<<endl;
		else{
			cout<<"스택 공백"<<endl;
			break;
		}
	}
}

 

 

 

7.

#include <iostream>
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;}; // dummy 값 리턴
	string getName(){return name;} 
};

class Oval:public Shape{
public:
	Oval(string n="", int w=0, int h=0):Shape(n,w,h){}
	double getArea(){return 3.14*width*height;}
};

class Rect:public Shape{
public:
	Rect(string n="", int w=0, int h=0):Shape(n,w,h){}
	double getArea(){return width*height;}
};

class Triangular:public Shape{
public:
	Triangular(string n="", int w=0, int h=0):Shape(n,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];
}

 

 

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()=0; // 순수 가상 함수
	string getName(){return name;} 
};

 

virtual double getArea()=0; 으로 변경

 

728x90
반응형
Comments