1. 문제

 

다음과 같은 상속 관계를 가진 Product, Book, CompactDisk, ConversationBook 클래스를 작성하고 아래 실행 화면과 같이 상품을 관리하는 프로그램을 작성하라.

 

Product 클래스는 상품의 식별자(id), 상품 설명, 생산자, 가격을 나타내는 정보를 포함한다. Book 클래스는 ISBN 번호, 저자, 책 제목 정보를 포함한다. CompactDisc 클래스는 앨범 제목, 가수 이름 정보를 포함한다. ConversationBook은 회화 책에서 다루는 언어 명 정보를 포함한다. 객체 지향 개념에 부합하도록 적절한 접근 지정자, 멤버 변수 및 함수, 생성자 등을 작성하라. main()에서는 최대 100개의 상품을 관리하며, 모든 상품의 정보를 조회할 수 있다. 상품의 식별자는 상품을 등록할 때 자동으로 붙인다.

 

 

2. 결과

 

 

 

 

3. 코드

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

class Product {
	int id;
	string info;
	string pro;
	string price;
public :
	Product(){;}
	Product(int id, string info, string pro, string price) {  
		this->id = id;
		this->info = info; this->pro = pro; this->price = price; 
	}
	int getId() { return id; }
	string getInfo() { return info; }
	string getPro() { return pro; }
	string getPrice() { return price; }
	virtual void show() = 0;
};

class Book : public Product {
	string ISBN;
	string writer;
	string BName;
public :
	Book(int id, string info, string pro, string price, string IS, string writer, string BN) : Product(id, info, pro, price) {
		ISBN = IS; this->writer= writer; BName= BN; }
	string getISBN() { return ISBN; }
	string getWriter() { return writer; }
	string getBName() { return BName; }
	void show();
};
void Book::show() {
	cout << "--- 상품ID : " << getId() << endl;
	cout << "상품설명 : " << getInfo() << endl;
	cout << "생산자 : " << getPro() << endl;
	cout << "가격 : " << getPrice() << endl;
	cout << "ISBN : " << ISBN << endl;
	cout << "책제목 : " << BName << endl;
	cout << "저자 : " << writer << endl;
}

class CompactDisc : public Product {
	string AName;
	string singer;
public :
	CompactDisc(int id, string info, string pro, string price, string AN, string singer) : Product(id, info, pro, price) {
		AName = AN; this->singer = singer; }
	void show();
};
void CompactDisc::show() {
	cout << "--- 상품ID : " << getId() << endl;
	cout << "상품설명 : " << getInfo() << endl;
	cout << "생산자 : " << getPro() << endl;
	cout << "가격 : " << getPrice() << endl;
	cout << "앨범제목 : " << AName << endl;
	cout << "가수 : " << singer << endl;
}

class ConversationBook : public Book {
	string lan;
public :
	ConversationBook(int id, string info, string pro, string price, string IS, string writer, string BN, string lan) 
		: Book(id, info, pro, price, IS, writer, BN)
	{ this->lan = lan; }
	void show();
};
void ConversationBook::show() {
	cout << "--- 상품ID : " << getId() << endl;
	cout << "상품설명 : " << getInfo() << endl;
	cout << "생산자 : " << getPro() << endl;
	cout << "가격 : " << getPrice() << endl;
	cout << "ISBN : " << getISBN() << endl;
	cout << "책제목 : " << getBName() << endl;
	cout << "저자 : " << getWriter() << endl;
	cout << "언어 : " << lan << endl;
}

int main() {
	
	int num;
	int id=-1;
	string info, pro, price, AN, singer, BN, writer, lan, ISBN;
	Product* p[100];
	bool exit = true;

	cout << "***** 상품 관리 프로그램을 작동합니다 *****" << endl;
	while( exit ) {
		cout << "상품 추가(1), 모든 상품 조회(2), 끝내기(3) ? ";
		cin >> num;
		switch( num ) 
		{
		case 1 :
			cout << "상품 종류 책(1), 음악CD(2), 회화책(3) ? ";
			cin >> num;
			cin.ignore(1);
			id++;
			if( id >= 100 ) break;
			if( num == 1) {
				cout << "상품설명>>"; getline(cin, info );
				cout << "생산자>>"; getline(cin, pro );
				cout << "가격>>"; getline(cin, price );
				cout << "책제목>>"; getline(cin, BN );
				cout << "저자>>"; getline(cin, writer );
				cout << "ISBN>>"; getline(cin, ISBN );
				Book* b = new Book(id, info, pro, price, BN, writer, ISBN);
				p[id] = b;
			}
			if( num == 2) {
				cout << "상품설명>>"; getline(cin, info);
				cout << "생산자>>"; getline(cin, pro );
				cout << "가격>>"; getline(cin, price );
				cout << "앨범제목>>"; getline(cin, AN);
				cout << "가수>>"; getline(cin, singer);
				CompactDisc* d = new CompactDisc(id, info, pro, price, AN, singer);
				p[id] = d;
			}
			if( num == 3) {
				cout << "상품설명>>"; getline(cin, info );
				cout << "생산자>>"; getline(cin, pro );
				cout << "가격>>"; getline(cin, price );
				cout << "책제목>>"; getline(cin, BN );
				cout << "저자>>"; getline(cin, writer );
				cout << "언어>>"; getline(cin, lan);
				cout << "ISBN>>"; getline(cin, ISBN );
				ConversationBook* cb = new ConversationBook(id, info, pro, price, BN, writer, ISBN, lan);
				p[id] = cb;
			}
			cout << endl;
			break;
		case 2 :
			for(int i=0; i<=id; i++)
				p[i]->show();
			cout << endl;
			break;
		case 3 : 
			exit = false;
			break;
		}
	}
}



 

4. 설명

 

 

show() 함수를 순수 가상 함수로 만들었습니다.

 

순수 가상 함수는 9장에서 배우지만 코드를 간단히 하기 위하여 사용하였습니다.

 

순수 가상 함수를 간단히 설명하자면 부모 클래스에는 선언만 한 후 자식 클래스에서 구현부를 입력하여 다른 자식 클래스에서는 각각 서로가 구현한 show()함수를 실행 시킵니다.

 

 

 

1. 문제

 

9. 비행기 예약 프로그램을 작성하라. 이 문제는 여러 개의 클래스와 객체들을 다루는 연습을 위한 것이다. 클래스 사이의 상속 관계는 없다. 항공사 이름은 '한성항공'이고, 8개의 좌석을 가진 3대의 비행기로 서울 부산 간 운항 사업을 한다. 각 비행기는 하루에 한 번만 운항하며 비행 시간은 7시, 12시, 17시이다. 비행기 예약 프로그램은 다음의 기능을 가진다.

-예약 : 비행 시간, 사용자의 이름, 좌석 번호를 입력받아 예약한다.

-취소 : 비행 시간, 사용자의 이름, 좌석 번호를 입력받고 예약을 취소한다.

-예약 보기 : 예약된 좌석 상황을 보여준다.

 

 

2. 결과

 

 

3. 코드

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

class Console {
public:
	int menu() {
		int num;
		cout << "\n예약:1, 취소:2, 보기:3, 끝내기:4 >>";
		cin >> num;
		return num;
	}
	int time_menu() {
		int num;
		cout << "7시:1, 12시:2, 17시:3 >>";
		cin >> num;
		return num;
	}

};

class Seat {
	string name;
	int number;
public:
	Seat() { this->name = "---"; this->number = -1; }
	void setName(string name) { this->name = name; }
	string getName() { return name; }
};

class Schedule {
	Seat *seat;
public:
	Schedule() {
		seat = new Seat[8];
	}
	void show(int num) {
		if (num == 1) cout << "7시:";
		else if (num == 2) cout << "12시:";
		else if (num == 3) cout << "17시:";

		for (int i = 0; i<8; i++)
			cout << "\t" << seat[i].getName();
		cout << endl;
	}
	void setN(int num, string name) { seat[num - 1].setName(name); }
	string getN(int num) { return seat[num - 1].getName(); }
};

class AirlineBook {
	Schedule *s;
public:
	AirlineBook() {
		s = new Schedule[3];
	}
	void program() {
		bool exit = true;
		int num;
		Console c;
		int seat_num;
		string name;

		while (exit) {
			num = c.menu();
			if (num == 1) {
				num = c.time_menu();

				if (num == 1 || num == 2 || num == 3) {
					s[num - 1].show(num);
					cout << "좌석 번호 >>"; cin >> seat_num;
					cin.ignore(1);
					cout << "이름 입력 >>"; getline(cin, name);
					s[num - 1].setN(seat_num, name);
				}
				else
					cout << "숫자를 잘못 입력하셨습니다." << endl;
			}
			else if (num == 2) {
				num = c.time_menu();

				if (num == 1 || num == 2 || num == 3) {
					s[num - 1].show(num);
					cout << "좌석 번호 >>"; cin >> seat_num;
					cin.ignore(1);
					cout << "이름 입력 >>"; getline(cin, name);
					if (name != s[num - 1].getN(seat_num))
						cout << "해당 좌석에 예약되어 있는 이름과 일치하지 않습니다." << endl;
					else
						s[num - 1].setN(seat_num, "---");
				}
				else
					cout << "숫자를 잘못 입력하셨습니다." << endl;
			}
			else if (num == 3) {
				s[0].show(1);
				s[1].show(2);
				s[2].show(3);
			}
			else if (num == 4) {
				cout << "예약 시스템을 종료합니다." << endl;
				exit = false;
			}
			else
				cout << "숫자를 잘못 입력하셨습니다." << endl;
		}
	}
};



int main() {
	AirlineBook *Air = new AirlineBook();

	cout << "*** 한성한공에 오신것을 환영합니다. ***\n";
	Air->program();
}

 

 

4. 설명

 

 힌트에서 설명했듯이 AirlineBook 클래스, Schedule 클래스, Seat 클래스, Console 클래스, 이 4개의 클래스 함수를 작성하였습니다. 

 

 지금은 편의상 한 cpp 파일에 다 작성을 하였지만 본래 문제에서도 말하였듯이 여러 개의 클래스를 다루는 연습을 하기 위해서라도 각 클래스를 각각 다른 파일의 구현하는 것이 좋습니다. 여기서는 하나의 파일의 다 작성하였고, 어느 클래스의서는 다른 클래스 변수를 사용하기 때문에 클래스를 선언하는 순서가 중요합니다.

 

 

 

- Console 클래스 : 메뉴를 물어보고 선택한 숫자를 return 해주는 menu 멤버 함수와 시간 대를 물어보고 어느 시간 대를 선택하였는지 return 해주는 time_menu 멤버 함수를 구현하였습니다.

 

- Seat 클래스 : 좌석 클래스로서 name, number를 멤버 변수로 가집니다. name은 이름을, number은 각각 좌석 번호를 저장하는 변수 입니다. 또한 생성자에서 name = "---"로 초기화 해주므로서 예약되지 않은 좌석이 출력될 때 "---"가 출력되도록 합니다. 그 밖에 이름을 변경하는 setName 멤버 함수와 이름을 return하는 getName 멤버 함수를 가집니다.

 

- Schedule 클래스 : Seat 변수를 가지며, 생성자에서 크기가 8인 동적 배열을 선언합니다. 그리고 좌석을 예약할 시 또는 취소할 시 해당하는 시간 대의 좌석 상황을 보여주기 위한 show 멤버 함수를 가집니다. show 멤버 함수는 num 매개변수를 하나 입력 받아서 해당하는 시간 대의 좌석 현황만 보여줍니다. 그 밖에 좌석을 예약, 취소 시 이름을 수정하기 위한 setN 멤버 함수와 해당 좌석에 이름을 return하는 getN 멤버 함수를 가집니다.

 

- AirlineBook 클래스 : Schedule 변수를 가지며, 생성자에서 크기가 3인 동적 배열을 선언합니다. 전체적인 프로그램을 구현한 program 멤버 함수를 가지며, program 멤버 함수에서 전체 프로그램을 작성하였기 때문에 main 함수에서는 AirlineBook 변수를 동적으로 생성한 후 "->"를 사용하여서 program 멤버 함수를 실행하기만 하면 됩니다.

 

 

 

 이건 여담이지만 파일이 날라가서 코드를 다시 작성하였는데 문제를 안 읽고해서인지는 몰라도 상속관계로 구현하였다가 실패하고 잠시 해매면서 다시 작성하였내요 ㅎㅎ; 그래도 느낌상 처음보다 더 잘 만든 코드인 것 같습니다. 여러분들도 나중에 한번 씩 다시 해보시는 것이 좋을 것 같습니다.

 

 

 

1. 문제

 

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

모든 프린터는 모델명 (model), 제조사 (manufacturer), 인쇄 매수 (prontedCount), 인쇄 종이 잔량 (availableCount)을 나타내는 정보와 print (int pages) 멤버 함수를 가지며, print()가 호출할 때마다 pages 매의 용지를 사용한다. 잉크젯 프린터는 잉크 잔량 (availableInk) 정보와 printInkJet (int pages) 멤버 함수를 추가적으로 가지며, 레이저 프린터는 토너 잔량 (availableToner) 정보와 역시 printLaser (int pages) 멤버 함수를 추가적으로 가진다. 각 클래스에 적절한 접근 지정으로 멤버 변수와 함수, 생성자, 소멸자를 작성하고, 다음과 같이 실행되도록 전체 프로그램을 완성하라. 잉크젯 프린터 객체와 레이저 프린터 객체를 각각 하나만 동적 생성하여 시작한다.

 

 

2. 결과

 

 

 

3. 코드

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

class printer {
	string model;
	string manufacturer;
	int printedCount;
	int availableCount;
public :
	printer(string m, string ma, int a ) {
		model = m;
		manufacturer = ma;
		availableCount = a;
	}
	string getModel() { return model;}
	string getManu() { return manufacturer;}
	int getAvail() { return availableCount; }
	bool print(int pages) {
		printedCount = pages;
		if( availableCount >= printedCount ) {
			availableCount -= printedCount;
			return true;
		}
		else {
			cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
			return false;
		}
	}
};

class Ink : public printer {
	int availableInk;
public :
	Ink(string m, string ma, int a, int aInk ) : printer( m,  ma,  a ) {
		availableInk = aInk;
	}
	void printInkJet(int pages) {
		if( print(pages) ) {
			if( availableInk >= pages ) {
				availableInk -= pages;
				cout << "프린트하였습니다." << endl;
			}
		}
	}
	void show() {
		cout << getModel() << " ," << getManu() << " ,남은 종이 " << getAvail() << "장 ,남은 잉크 " << availableInk << endl;
	}
};

class Laser : public printer {
	int availableToner;
public :
	Laser(string m, string ma, int a, int aToner ) : printer( m,  ma,  a ) {
		availableToner = aToner;
	}
	void printLaser(int pages) {
		if( print(pages) ) {
			if( availableToner >= pages ) {
			availableToner -= pages;
			cout << "프린트하였습니다." << endl;
			}
		}
	}
	void show() {
		cout << getModel() << " ," << getManu() << " ,남은 종이 " << getAvail() << "장 ,남은토너 " << availableToner << endl;
	}
};

int main() {
	Ink* IP = new Ink("Officejet V40", "HP", 5, 10);
	Laser* LP = new Laser("SCX-6x45", "삼성전자", 3, 20 );
	int n1, n2;
	char a;

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

	while(1) {
		cout << endl << "프린터(1:잉크젯, 2:레이저)와 매수 입력>>";
		cin >> n1 >> n2;
		if( n1 == 1 ) 
		{
			IP->printInkJet( n2);
			IP->show();
			LP->show();
		}
		if( n1 == 2 )
		{
			LP->printLaser( n2);
			IP->show();
			LP->show();
		}
		cout << "계속 프린트 하시겠습니까(y/n)>>";
		cin >> a;
		if( a == 'n' ) break;
	}
}

 

4. 설명

 

 프린터 클래스와 프린터 클래스를 상속 받는 잉크젯 프린터 클래스, 레이저 프린터 클래스를 작성합니다.

 

문제 마지막 부분을 보면 잉크젯 프린터 객체와 레이저 프린터 객체를 각각 하나만 동적 생성하여 시작한다고 하였으므로 이에 따라 정보를 입력 받도록 생성자들을 생성 합니다.

 

Priter 클래스는 모델명, 제조사, 인쇄 종이 잔량을 매개변수로 가지는 생성자를 생성하고 Ink 와 Laser 클래스에서 각각 추가적으로 잉크 잔량과 토너 잔량을 입력 받아서 총 매개변수 갯수가 4개인 생성자를 생성합니다.

 

 

 

 Ink 클래스나 Laser 클래스의 생성자에서  ": Printer( m, ma, a )" 을 해준 것은 Printer 클래스에서 printer(string m, string ma, int a ) 생성자가 실행되도록 입니다. 이렇게 지정을 하지 않는다면 기본 생성자를 실행합니다.

 

 

 그 후 print 멤버 함수를 구현하면, print 멤버 함수는 입력받은 매개 변수와 인쇄 종이 잔량을 비교하여서 인쇄 종이 잔량이 같거나 더 많으면 True를 리턴 하고 그렇지 않다면 용지가 부족하다는 매세지를 출력 후 false를 리턴 합니다.

 

-> Ink 클래스나 Laser 클래스는 Printer의 자식 클래스이므로 Printer 클래스의 멤버 함수인 print를 사용할 수 있습니다.

 

  void printInkJet(int pages) 와 void printLaser(int pages) 에서 print 멤버 함수로 용지 잔량을 비교하여 참이였다면 각각 잉크 잔량과 토너 잔량을 비교하여서 잔량이 더 많다면 프린트를 성공 시키고, 그렇지 않으면 프린트를 실패 시킵니다.

 

 

 

 main 에서는 두 객체를 동적으로 생성한 후 while문과 if문을 사용하여서 프로그램을 진행시킵니다.

 

※ 동적으로 생성하였으므로 멤버 함수의 접근하기 위해서는 "->"를 사용하셔야 합니다.

 

1. 문제

 

7. 아래와 같은 BaseMemory 클래스를 상속받는 ROM( Read Only Memory ), RAM 클래스를 작성하라. BaseMemory 에 필요한 코드를 수정 추가하여 적절히 완성하라.

 

ROM은 읽기 전용 메모리이므로 작동 중에 값을 쓸 수가 없기 때문에, 공장에서 생산할 때 생산자가 요청한 데이터로 초기화하는데 이 작업을 굽는다( burn )라고 한다. 그러므로 ROM은 반드시 생성자에서 burn 작업이 일어나야 한다.

다음은 ROM과 RAM 메모리를 생성하고 사용하는 사례이다. ROM의 0번지에서 4번지까지 읽어 RAM 메모리의 0~4번지에 쓰고, 다시 RAM 메모리의 값을 화면에 출력한다. 전체 프로그램을 완성하라.

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
using namespace std;

class BaseMemory {
	char *mem;
protected:
	BaseMemory(int size) { mem = new char [size]; }
	~BaseMemory() { delete [] mem; }
	void setData(int index, char data) { mem[index] = data; }
	char getData(int index) { return mem[index]; }
};

class ROM : private BaseMemory {
	int length;
public :
	ROM( int size, char memory[], int len) : BaseMemory(size) {
		length = len;
		for(int i=0; i< len; i++)
			setData( i, memory[i] );
	}
	char read(int index) { return getData(index); }
};

class RAM : private BaseMemory {
public :
	RAM(int size) : BaseMemory(size) {;}
	void write(int index, int data) { setData( index, data); }
	char read(int index) { return getData(index); }
};

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

 

 

4. 설명

 

 ROM은 읽기 전용 메모리로서 매개변수로 입력받은 char형 배열을 메모리 (배열)의 저장하도록 합니다.

 

 

 

RAM 클래스 멤버는 생성자에서 size를 입력받고, 크기가 size인 배열을 동적으로 생성하도록 합니다.
 
main함수에서 보면 RAM 클래스 변수 mainMemory의 write 멤버 함수를 이용하여서 동적으로 생성했었던 배열의 해당하는 주소의 값을 저장합니다.
 
그 후 read 멤버함수로 출력을 해보면 hello가 출력되는 것을 알 수가 있습니다.

 

1. 문제

 

6. BaseArray 클래스를 상속받아 스택으로 작동하는 MyStack 클래스를 작성하라.

 

 

2. 결과

 

 

 

 

3. 코드

 


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

class BaseArray {
	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 size) : BaseArray(size){ top=0; }
	void push(int n){ put( top, n); top++; }
	int capacity() { return getCapacity(); }
	int length() { return top; }
	int pop() { top--; return get(top); }
};

int main() {
	MyStack mStack(100);
	int n;
	cout << "스택에 삽입할 5개의 정수를 입력하라>> ";
	for(int i=0; i<5; i++) {
		cin >> n;
		mStack.push(n);
	}
	cout << "스택용량:" << mStack.capacity() << ", 스택크기:" << mStack.length() << endl;
	cout << "스택의 모든 원소를 팝하여 출력한다>> ";
	while(mStack.length() != 0 ) {
		cout << mStack.pop() << ' ';
	}
	cout << endl << "스택의 현재 크기 : " << mStack.length() << endl;
}

 

 

4. 설명

 

 스택은 후입선출의 구조로서 나중에 들어간 데이터가 가장 먼저 나오는 구조 입니다.

 

 

앞서 구현하였더 Queue와 달리 Stack은 가장 꼭대기를 가리키는 top 멤버 변수 하나를 이용하여서 데이터를 삽입하거나 삭제 합니다.

 

 후입선출의 구조이므로 삽입할 시 top++;을 해주고 삭제 시 top--;를 해주면 됩니다.

 

 

※ 이미지가 잘못되었는데 귀찮아서 수정하지 않았습니다. 결과는 알맞게 나오도록 코드는 수정하였으니 문제 없습니다.

 

 

 

문제 5~6에 적용되는 BaseArray 클래스는 다음과 같다.

 

1. 문제

 

5. BaseArray를 상속받아 큐처럼 작동하는 MyQueue 클래스를 작성하라. MyQueue를 활용하는 사례는 다음과 같다.

 

 

2. 결과

 

 

 

3. 코드

 


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

class BaseArray {
	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 enindex;
	int deindex;
public :
	MyQueue(int size) : BaseArray(size){ enindex=0; deindex=-1; }
	void enqueue(int n){ put( enindex, n);
								enindex++; }
	int capacity() { return getCapacity(); }
	int length() { return enindex; }
	int dequeue() { enindex--;
					deindex++; return get(deindex); }
};

int main() {
	MyQueue mQ(100);
	int n;
	cout << "큐에 삽입할 5개의 정수를 입력하라>> ";
	for(int i=0; i<5; i++) {
		cin >> n;
		mQ.enqueue(n);
	}
	cout << "큐의 용량:" << mQ.capacity() << ", 큐의 크기:" << mQ.length() << endl;
	cout << "큐의 원소를 순서대로 제거하여 출력한다>> ";
	while(mQ.length() != 0 ) {
		cout << mQ.dequeue() << ' ';
	}
	cout << endl << "큐의 현재 크기 : " << mQ.length() << endl;
}

 

 

4. 설명

 

 큐는 선입선출의 구조로서 가장 먼저 들어간 데이터가 가장 먼저 나오는 구조 입니다.

 

BaseArray 클래스의 생성자는 입력받는 매개변수 값만큼 동적으로 배열을 생성합니다.

 

 

 MyQueue 클래스의 생성자에서는 : BaseArray( size )를 해 주어서 BaseArray의 매개변수 있는 생성자가 실행되도록 합니다.

 

MyQueue 클래스는 2개의 멤버 변수를 가지는데 하나는 삽입할 위치에 인덱스 번호를, 또 다른 하나는 삭제할 요소의 인덱스 번호를 저장합니다.

 

 

 

1. 문제

 

4. 다음 main() 함수가 실행되도록 Point 클래스를 상속받는 ColorPoint 클래스를 작성하고, 전체 프로그램을 완성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <string>
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 name;
public :
	ColorPoint(int x=0, int y=0, string name="BLACK") : Point(x, y) {
		this->name = name; }
	void setPoint(int x, int y){ move(x, y); }
	void setColor(string name) { this->name = name; }
	void show() { cout << name << "색으로 (" << getX() << "," << getY() << ")에 위치한 점입니다." << endl; }
};

int main() {
	ColorPoint zeroPoint;
	zeroPoint.show();

	ColorPoint cp(5, 5);
	cp.setPoint(10, 20);
	cp.setColor("BLUE");
	cp.show();
}

 

 

4. 설명

 

 매개변수가 없는 ColorPoint 클래스 변수를 생성하기 위해서는 디폴트 매개변수를 가진 생성자로 작성 합니다.

 

매개변수 없이 선언된 변수 zeroPoint의 결과를 보았을 때 (0, 0) "BLACK" 으로 각각 디폴트 매개변수를 줍니다.

 

 

추가적으로 setPoint, setColor, show 멤버 함수를 작성하여 줍니다.

 

 

문제 3~4에 적용되는 2차원 상의 한 점을 표현하는 Point 클래스가 있다.

 

1. 문제

 

3. 다음 main() 함수가 실행되도록 Point 클래스를 상속받은 ColorPoint 클래스를 작성하고, 전체 프로그램을 완성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <string>
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 name;
public :
	ColorPoint(int x, int y, string name) : Point(x, y) {
		this->name = name; }
	void setPoint(int x, int y){ move(x, y); }
	void setColor(string name) { this->name = name; }
	void show() { cout << name << "색으로 (" << getX() << "," << getY() << ")에 위치한 점입니다." << endl; }
};

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

 

4. 설명

 

 Point 클래스를 상속받은 ColorPoint 클래스를 작성합니다.

 

ColorPoint 클래스는 추가적으로 색을 입력 받으므로 string 변수 name을 선언합니다.

 

: Point( x, y) 를 추가하여서 Point클래스에서 Point( int x, int y) 생성자가 실행되도록 만들어 줍니다.

 

 

추가적으로 위치를 재설정하는 setPoint 멤버함수와 , 색을 재설정하는 setColor 멤버함수, show 멤버 함수를 작성합니다.

 

+ Recent posts