#include <iostream>
using namespace std;
class BaseArray {//BaseArray 클래스 생성
int capacity;//용량 변수 선언
int* mem;//정수형 변수 포인터 선언
protected:
BaseArray(int capacity = 100) {//용량 Default값 100으로 설정, 생성자 함수 선언, 정의
this->capacity = capacity;//용량을 입력받는다면 용량변경
mem = new int[capacity];//정수형 열 용량만큼 생성
}
~BaseArray() { delete[] mem; }//소멸자 함수 생성, 정의
void put(int index, int val) { mem[index] = val; }//put함수 선언 , 정의 . mem은 정수를 입력받음
int get(int index) { return mem[index]; }//mem 정수열 반환
int getCapacity() { return capacity; }//용량 반환
};
class MyQueue :public BaseArray {//BaseArray를 상속하는 큐 클래스 생성
int num;//정수열 순서 및 갯수
int start = 0;//큐처럼 작동시키기 위한 변수(제일 먼저 입력들어간 변수를 나타내기위한)
public:
MyQueue(int capacity) :BaseArray(capacity) { num = 0; }//파생클래스의 생성자가 기본클래스의 생성자 선택 호출
void enqueue(int n) { put(num, n); num++; }//파생클래스의 n으로 기본클래스의 put함수를 사용, 정수열 순서 증가
int dequeue() {
num--;//들어간 size만큼 반복시키기 위함
start++;//제일 먼저들어간 변수를 차례로 나타내기 위함
return get(start - 1);//++가 먼저 사용되므로 -1 해줌, 안해주면 6번째 정수열의 주소값이 튀어나오는 결과 발생.
}//기본클래스에서 정수열반환, 단, 0번째 정수열부터 반환->큐처럼 동작함은 입력해준 순서로 나오는 것이기 때문.
int capacity() { return getCapacity(); }//기본클래스에서 용량을 반환
int length() { return num; }//갯수 반환
};
int main() {
MyQueue mQ(100);//capacity에 100이 들어가고 큐 객체 생성
int n;
cout << "큐에 삽입할 5개의 정수를 입력하라>> ";
for (int i = 0; i < 5; i++) {//5개의 정수를 입력하기 위한 과정
cin >> n;
mQ.enqueue(n);//파생클래스의 enqueue 함수 실행
}
cout << "큐의 용량: " << mQ.capacity() << ", 큐의 크기: " << mQ.length() << endl;//파생클래스에서 선언한 함수들 사용
cout << "큐의 원소를 순서대로 제거하여 출력한다>> ";
while (mQ.length() != 0) {//파생클래스의 정수형 변수 num이 0이 될때까지 반복
cout << mQ.dequeue() << " ";//입력받은 순서대로 반환하는 큐처럼 동작함
}
cout << endl << "큐의 현재 크기 : " << mQ.length() << endl;//큐의 현재 크기 출력
}
#include <iostream>
#include <string>
using namespace std;
class BaseArray {//BaseArray 클래스 생성
private:
int capacity;//용량 변수 선언
int* mem;//정수형 변수 포인터 선언
protected:
BaseArray(int capacity = 100) {//용량 Default 값을 100으로 설정, 생성자 함수 선언과 정의
this->capacity = capacity;//용량을 입력받는다면 용량 변경
mem = new int[capacity];// 정수열 용량만큼 생성
}
~BaseArray() { delete[]mem; }//소멸자 함수 생성과 정의
void put(int index, int val) { mem[index] = val; }//put 함수 선언, 정의, mem은 입력받은 정수가 들어감
int get(int index) { return mem[index]; }//mem정수열 반환
int getCapacity() { return capacity; }//용량크기 반환
};
class MyStack :public BaseArray {//스택 클래스 생성, BaseArray상속
int num;//정수열 순서 및 갯수(들어간 순서)
public:
MyStack(int capacity) :BaseArray(capacity) { num = 0; }// 파생클래스의 생성자가 기본클래스의 생성자 선택 호출
void push(int n) { put(num, n); num++; }//파생클래스의 입력받는 n으로 기본클래스의 put함수 실행. <-> 큐와 다른 점은 enqueue
int pop() { num--; return get(num); }// 스택처럼 동작하기 위한 장치(스택은 입력받는 순서의 반대 순서로 출력됨.)
int capacity() { return getCapacity(); }//기본클래스에서 용량을 반환.
int length() { return num; }//갯수반환
};
int main() {
MyStack mStack(100);//capacity에 100이 들어가고 스택 객체 생성
int n;
cout << "스택에 삽입할 5개의 정수를 입력하라>> ";
for (int i = 0; i < 5; i++) {//5개의 정수를 입력하기 위한 반복
cin >> n;
mStack.push(n);//파생클래스의 push함수 실행
}
cout << "스택 용량:" << mStack.capacity() << ", 스택 크기:" << mStack.length() << endl;//파생클래스에서 선언한 함수 사용
cout << "스택의 모든 원소를 팝하여 출력한다>> ";
while (mStack.length() != 0) {//스택이 들어간 만큼 반복.
cout << mStack.pop() << ' ';//파생클래스의 pop함수 사용. 나중에 들어간 순서로 출력됨
}
cout << endl << "스택의 현재 크기 : " << mStack.length() << endl;//pop한 후의 현재크기 출력
}
#include <iostream>
#include <string>
using namespace std;
class Printer {//프린터 클래스 생성
protected://상속하는 클래스들의 사용가능한 변수
string model;
string manufacturer;
int availableCount = 0;
public:
Printer() {};//생성자 함수 선언
Printer(string model, string manufacturer, int availableCount) {//매개변수를 가지는 생성자함수 선언 후 정의, 조건에서 model과 manufacturer, availbleCount를 모두 가진다 하였으니 추가.
this->model = model;
this->manufacturer = manufacturer;
this->availableCount = availableCount;
}
virtual int print(int pages) { return pages; }//가상함수 Print 선언
virtual void show() {};//가상함수 show 선언
};
class Inkjet : public Printer {//잉크젯 클래스 생성 프린터클래스 상속
int availableInk;//상속받은 변수 외 추가적인 정보를 가지는 변수
public:
Inkjet(string model, string manufacturer, int availableCount, int availableInk) {//상속한 변수들과 함께 생성자 함수 선언 후 정의
this->model = model;
this->manufacturer = manufacturer;
this->availableCount = availableCount;
this->availableInk = availableInk;
}
int print(int pages) {//Print함수 정의
if (availableCount - pages < 0)//만약 인쇄가능한 종이보다 출력해야할 종이가 많다면
cout << "용지가 부족하여 프린트 할 수 없습니다." << endl;//다음을 출력
else {//아니라면 아래 문구 출력
cout << "프린트하였습니다." << endl;
availableCount -= pages, availableInk -= pages;//각 변수에서 출력에 사용된 양 빼주기
}
return availableCount, availableInk;//값 반환
}
void show() {//show 함수 정의
cout << model << " ," << manufacturer << " ,남은 종이 " << availableCount << "장" << ", 남은 잉크 " << availableInk << endl;//프린터의 기본정보 출력
}
};
class Raser : public Printer {//레이저 클래스 생성, 프린터 클래스 상속
int availableToner;//추가적인 정보를 가지는 변수
public:
Raser(string model, string manufacturer, int availableCount, int availableToner) {//상속한 변수들과 함께 생성자 함수 선언 후 정의
this->model = model;
this->manufacturer = manufacturer;
this->availableCount = availableCount;
this->availableToner = availableToner;
}
int print(int pages) {//print함수 정의(잉크젯하고 다름)
if (availableCount - pages < 0)//작동방식은 잉크젯과 같음
cout << "용지가 부족하여 프린트 할 수 없습니다." << endl;
else {
cout << "프린트하였습니다." << endl;
availableCount -= pages, availableToner -= pages;//작동방식은 같지만 사용되는 변수는 다름(잉크->토너)
}
return availableCount, availableToner;//값 반환
}
void show() {//기본정보 출력
cout << model << " ," << manufacturer << " ," << "남은 종이 " << availableCount << "장" << " ,남은 토너 " << availableToner << endl;
}
};
int main() {
Inkjet* IJ = new Inkjet("Officejet V40", "HP", 5, 10);//동적할당으로 잉크젯객체 생성 후 기본정보까지 추가
Raser* RP = new Raser("SCX-6x45", "삼성전자", 3, 20);//동적할당으로 레이저객체 생성 후 기본정보까지 추가
cout << "현재 작동중인 2 대의 프린터는 아래와 같다." << endl;
cout << "잉크젯 : ";
IJ->show();//잉크젯객체 의 기본정보 출력
cout << "레이저 : ";
RP->show();//레이저 객체의 기본정보 출력
cout << endl;
while (1) {//무한 반복
int a, b = 0;//프린터 번호, 인쇄할 매수 변수 선언
char ans;//질문의 답을 받은 문자 선언
cout << "프린터(1: 잉크젯, 2: 레이저)와 매수 입력>>";
cin >> a >> b; // 프린터 번호와 매수를 순서대로 입력받음
if (a == 1) {//잉크젯 선택
IJ->print(b);//잉크젯객체로 프린트
}
else if (a == 2) {//레이저 선택
RP->print(b);//레이저객체로 프린트
}
IJ->show();//잉크젯객체 기본정보 출력
RP->show();//레이저객체 기본정보 출력
cout << "계속 프린트 하시겠습니까(y/n)>>";
cin >> ans;//답 입력받음
if (ans != 'y')//y가 아니면 반복을 멈추고 종료함(n은 종료, 나머지 문자들은 못읽으니까 종료)
break;
cout << endl;
}
delete IJ;//동적할당 소멸
delete RP;//동적할당 소멸
}
'Electronic Engineering > C++' 카테고리의 다른 글
C++ SFML 과제 (0) | 2022.07.05 |
---|---|
C++ 실습 과제 3 (0) | 2022.07.05 |
C++ 실습 과제 2 (0) | 2022.07.05 |
C++ 실습 과제 (0) | 2022.07.05 |
C언어 Level Test (0) | 2022.07.05 |