관리 메뉴

공부 기록장 💻

명품 C++ Programming 8장 실습 문제 - 클래스 상속, 기본 클래스, 파생 클래스, 객체 포인터, 접근 지정 본문

# Language & Tools/C++

명품 C++ Programming 8장 실습 문제 - 클래스 상속, 기본 클래스, 파생 클래스, 객체 포인터, 접근 지정

dream_for 2021. 5. 9. 02:01

(명품 C++ 프로그래밍 8장)

 

 

1.

#include <iostream>
using namespace std; 

class Circle{
	int radius;
public:
	Circle(int radius=0){this->radius=radius;}
	int getRadius(){return radius;}
	void setRadius(int radius){this->radius=radius;}
	double getArea(){ return 3.14*radius*radius;}
};

class NamedCircle:public Circle{
	string name;
public:
	NamedCircle(int radius=1, string name="circle"):Circle(radius){
		this->name=name;
	}
	void show(){cout<<"반지름이 "<<getRadius()<<"인 "<<name<<endl;}
};

int main(){
	NamedCircle waffle(3,"waffle");
	waffle.show();
}

 

1, 2.

#include <iostream>
using namespace std; 

class Circle{
	int radius;
public:
	Circle(int radius=0){this->radius=radius;}
	int getRadius(){return radius;}
	void setRadius(int radius){this->radius=radius;}
	double getArea(){ return 3.14*radius*radius;}
};

class NamedCircle:public Circle{
	string name;
public:
	NamedCircle(int radius=1, string name="circle"):Circle(radius){
		this->name=name;
	}
	string getName(){return name;	}
	void setName(string name){this->name=name;}
	void show(){cout<<"반지름이 "<<getRadius()<<"인 "<<name<<endl;}
};

int main(){
	NamedCircle waffle(3,"waffle");
	waffle.show();
	
	NamedCircle pizza[5];
	cout<<"5 개의 정수 반지름과 원의 이름을 입력하세요"<<endl;
	
	int r;
	string name;
	for(int i=0;i<5;i++){
		cout<<i+1<<">> ";
		cin>>r>>name;
		pizza[i].setRadius(r);
		pizza[i].setName(name);
	}
	
	NamedCircle max_pizza=pizza[0];
	for(int i=1;i<5;i++)
		if(pizza[i].getRadius()>max_pizza.getRadius()) max_pizza=pizza[i];
	cout<<"가장 면적이 큰 피자는 "<<max_pizza.getName()<<"입니다"<<endl;
}

 

 

 

3, 4.

#include <iostream>
using namespace std;

class Point{
	int x,y;
public:
	Point(int x, int y){this->x=x;this->y=y;}
	int getX(){return x;}
	int getY(){return y;}
protected:
	void move(int x, int y){this->x=x;this->y=y;}
};

class ColorPoint:public Point{
	string color;
public:
	ColorPoint(int x=0, int y=0, string color="BLACK"):Point(x,y){this->color=color;}
	void setPoint(int x, int y){move(x,y);}
	void setColor(string color){this->color=color;}
	void show(){cout << color<<"색으로 ("<<getX()<<","<<getY()<<")에 위치한 점입니다."<<endl;}
};

int main(){
	ColorPoint zeroPoint;
	zeroPoint.show();
	
	ColorPoint cp(5,5,"RED");
	cp.setPoint(10,20);
	cp.setColor("BLUE");
	cp.show();	
}

 

 

5. 

큐처럼 작동하는 MyQueue 클래스.

문제 조금 변형해봄

#include <iostream>
using namespace std;

class BaseArray{
private:
	int capacity; // 배열의 크기 
	int *mem; // 정수 배열을 만들기 위한 메모리의 포인터
protected:
	BaseArray(int capacity=100){
		this->capacity=capacity;
		mem=new int[capacity];
	}
	~BaseArray(){delete []mem;}
	void put(int index, int val){mem[index]=val;}
	int get(int index){return mem[index];}
	int getCapacity(){return capacity;}
};

class MyQueue : public BaseArray{
	int front, rear; 
public:
	MyQueue(int capacity):BaseArray(capacity){front=0;rear=0;};
	void enqueue(int n){
		if(rear==getCapacity()) return;
		put(rear++, n); // mem[size]=n;
	}
	int capacity(){	return getCapacity();}
	int length(){return (rear-front);}
	int dequeue(){
		if(length()==0) exit(1);
	return get(front++);}
};

int main(){
	MyQueue mQ(5); // 5개의 정수를 저장할 수 있는 큐 생성 
	int size;
	cout<<"큐에 몇 개의 정수를 삽입하시겠습니까? >> ";
	cin>>size;
	
	int n;
	cout<<"큐에 삽입할 "<<size<<"개의 정수를 입력하라>> ";
	for(int i=0;i<size;i++){
		cin>>n;
		mQ.enqueue(n); // 큐에 삽입 
	}
	
	cout<<"큐의 용량: "<<mQ.capacity()<<", 큐의 크기: "<<mQ.length()<<endl;
	
	cout<<"큐의 원소를 순서대로 몇 개 제거하시겠습니까? >> ";
	cin>>size;
	for(int i=0;i<size;i++)
		cout<<mQ.dequeue()<<' ';
		
	cout<<endl<<endl<<"큐의 현재 크기: "<<mQ.length()<<endl;
	cout<<"남아있는 모든 원소를 제거합니다"<<endl;
	while(mQ.length()!=0){cout<<mQ.dequeue()<<' ';}
	cout<<endl<<"큐의 현재 크기: "<<mQ.length()<<endl;
}

 

 

6. 스택

#include <iostream>
using namespace std;

class BaseArray{
private:
	int capacity; // 배열의 크기 
	int *mem; // 정수 배열을 만들기 위한 메모리의 포인터
protected:
	BaseArray(int capacity=100){
		this->capacity=capacity;
		mem=new int[capacity];
	}
	~BaseArray(){delete []mem;}
	void put(int index, int val){mem[index]=val;}
	int get(int index){return mem[index];}
	int getCapacity(){return capacity;}
};

class MyStack:public BaseArray{
	int top; 
public:
	MyStack(int capacity):BaseArray(capacity){top=0;}
	void push(int n){
		if(top==getCapacity()) return;
		put(top++, n); // mem[size]=n;
	}
	int capacity(){	return getCapacity();}
	int length(){return top;}
	int pop(){
		if(length()==0) exit(1);
		return get(--top);}
};


int main(){
	MyStack mStack(5); // 5개의 정수를 저장할 수 있는 큐 생성 
	int size;
	cout<<"스택에 몇 개의 정수를 삽입하시겠습니까? >> ";
	cin>>size;
	
	int n;
	cout<<"스택에 삽입할 "<<size<<"개의 정수를 입력하라>> ";
	for(int i=0;i<size;i++){
		cin>>n;
		mStack.push(n); // 큐에 삽입 
	}
	
	cout<<"스택의 용량: "<<mStack.capacity()<<", 스택의 크기: "<<mStack.length()<<endl;
	
	cout<<"스의 원소를 몇 개 팝하시겠습니까? >> ";
	cin>>size;
	for(int i=0;i<size;i++)
		cout<<mStack.pop()<<' ';
		
	cout<<endl<<endl<<"스택의 현재 크기: "<<mStack.length()<<endl;
	cout<<"남아있는 모든 원소를 팝합니다"<<endl;
	while(mStack.length()!=0){cout<<mStack.pop()<<' ';}
	cout<<endl<<"스택의 현재 크기: "<<mStack.length()<<endl;
}

 

 

7.

#include <iostream>
using namespace std;

class BaseMemory{
	char *mem;
protected:
	BaseMemory(int size){mem=new char[size];}
	char getMem(int i){return mem[i];}
	void putMem(int i, char ch){mem[i]=ch;}
};

class ROM:public BaseMemory{
	int size;
public:
	ROM(int capacity, char *arr, int len):BaseMemory(capacity){
		size=0;
		for(int i=0;i<len;i++)
			putMem(size++, arr[i]);	
	}
	char read(int i){return getMem(i);}
};

class RAM:public BaseMemory{
	int size;
public:
	RAM(int capacity):BaseMemory(capacity){size=0;}
	void write(int i, char ch){ putMem(size++, ch);}
	char read(int i){return getMem(i);	}
};

int main(){
	char x[5]={'h', 'e', 'l', 'l','o'};
	ROM biosROM(1024*10, x, 5);
	RAM mainMemory(1024*1024);
	
	for(int i=0;i<5;i++) mainMemory.write(i, biosROM.read(i));
	for(int i=0;i<5;i++) cout<<mainMemory.read(i);
}

 

 

8. 

#include <iostream>
using namespace std;

class Printer{
protected:
	string model, manufacturer;
	int printedCount; // 인쇄 매수
	int availableCount; // 인쇄 종이 잔량
public:
	Printer(string name, string manu, int pages){
		model=name;
		manufacturer=manu;
		availableCount=pages;
		printedCount=0;
	}
	void print(int pages){ // pages 매의 용지를 사용 턴 
		availableCount-=pages;
		printedCount+=pages;
	}
	string getName(){return model;}
	string getManu(){return manufacturer;}
	int getPages(){return availableCount;} // 남은 잔량 리 	
};

class InkJetPrinter:public Printer{
	int availableInk;
public:
	InkJetPrinter(string name, string manu, int pages, int ink):Printer(name, manu,pages){
		model=name;
		manufacturer=manu;
		availableCount=pages;
		availableInk=ink;
		printedCount=0;		
	}
	void printInkJet(int pages){
		availableInk-=pages; // 잉크 
		availableCount-=pages; // 매수 
		printedCount+=pages;
	}
	int getInk(){return availableInk;}
	void printInkJetPrinter(){
		cout<<"잉크젯 : "<<getName()<<", "<<getManu()<<", "<<"남은 종이 "<<getPages()<<", 남은 잉크: "<<getInk()<<endl;
	}
};

class LaserPrinter:public Printer{
	int availableToner;
public:
	LaserPrinter(string name, string manu, int pages, int toner):Printer(name, manu,pages){
		model=name;
		manufacturer=manu;
		availableCount=pages;
		availableToner=toner;		
	}
	void printLaser(int pages){
		availableToner-=pages; // 토너 
		availableCount-=pages; // 매수
		printedCount+=pages; 
	}
	int getToner(){return availableToner;}
	void printLaserPrinter(){
		cout<<"레이저 : "<<getName()<<", "<<getManu()<<", "<<"남은 종이 "<<getPages()<<", 남은 토너: "<<getToner()<<endl;
	}
	
};

int main(){
	InkJetPrinter *Ink=new InkJetPrinter("Officejet V40", "HP", 5, 10);
	LaserPrinter *Laser=new LaserPrinter("SCX-6x45", "삼성전자", 3, 20);
	
	cout<<"현재 작동중인 2 대의 프린터는 아래와 같다"<<endl;
	Ink->printInkJetPrinter();
	Laser->printLaserPrinter();
	
	char keep;
	do{
		int choice, n;
		cout<<endl<<endl<<"프린터(1: 잉크젯, 2:레이저)와 매수 입력>> ";
		cin>>choice>>n;
		if(choice==1){
			if(n>Ink->getInk() || n>Ink->getPages()){
				cout<<"용지가 부족하여 프린트할 수 없습니다"<<endl;
			}
			else{
				Ink->printInkJet(n);
				cout<<n<<"장 성공적으로 프린트하였습니다"<<endl; 
			}
		}
		else if(choice==2){
			if(n>Laser->getToner() || n>Laser->getPages()){
				cout<<"용지가 부족하여 프린트할 수 없습니다"<<endl;
			}
			else{
				Laser->printLaser(n);
				cout<<n<<"장 성공적으로 프린트하였습니다"<<endl; 
			}
		}
		Ink->printInkJetPrinter();
		Laser->printLaserPrinter();	
		cout<<endl<<"계속 프린트하시겠습니까(y/n)>>";
		cin>>keep;
	}while(keep=='y');
	
	delete []Ink;
	delete []Laser;
}

728x90
반응형
Comments