Electronic Engineering/C++

C++ 실습 과제 마지막

해시브라우니 2022. 7. 5. 19:01

#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