명품C++프로그래밍
명품 C++ Programming 실습문제 9장 9번
anycoding
2021. 6. 6. 01:07
반응형
8장 8번을 응용한 문제입니다.
https://p-coding.tistory.com/24
명품 C++ Programming 실습문제 8장 8번
문제 다음 그림과 같은 상속 구조를 갖는 클래스를 설계한다. 모든 프린터는 모델명(model), 제조사(manufacturer), 인쇄 매수(printedCount), 인쇄 종이 잔량(availableCount)을 나타내는 정보와 print(int pages..
p-coding.tistory.com
문제
다음 그림과 같은 상속 구조를 갖는 클래스를 설계한다.
모든 프린터는 모델명(model), 제조사(manufacturer), 인쇄 매수(printedCount), 인쇄 종이 잔량(availableCount)을 나타내는 정보와 print(int pages) 멤버 함수를 가지며, print()가 호출할 때마다 pages 매의 용지를 사용한다. 잉크젯 프린터는 잉크 잔량(availableInk) 정보와 printInkJet(int pages) 멤버 함수를 추가적으로 가지며, 레이저 프린터는 토너 잔량(availableToner) 정보와 역시 printLaser(int pages) 멤버 함수를 추가적으로 가진다. 각 클래스에 적절한 접근 지정으로 멤버 변수와 함수, 생성자, 소멸자를 작성하고, 다음과 같이 실행되도록 전체 프로그램을 완성하라. 잉크젯 프린터 객체와 레이저 프린터 객체를 각각 하나만 동적 생성하여 시작한다.
결과
소스코드
#include<iostream>
using namespace std;
#include<iostream>
#include<string>
using namespace std;
class Printer {
string model; //모델
string manufacturer; //제조사
int printedCount; //인쇄 매수
int availableCount; //인쇄 잔량
public:
Printer(string m, string f, int ac) {
model = m;
manufacturer = f;
availableCount = ac;
}
string getmodel() { return model; } //모델명 리턴
string getmanufacturer() { return manufacturer; } //제조사 리턴
int getCount() { return availableCount; } //인쇄 잔량 리턴
virtual void show() = 0;
virtual int getavailable() = 0;
virtual void printitem(int pages) = 0;
virtual int getavailableCount() = 0;
void print(int pages) {
printedCount = pages;
availableCount -= printedCount;
}
};
class IPrinter : public Printer {
int availbleInk; //잉크 잔량
public:
IPrinter(string m, string f, int aCount, int aInk) : Printer(m, f, aCount) { availbleInk = aInk; }
virtual int getavailableCount() { return getCount(); }
virtual void printitem(int pages) {
availbleInk -= pages;
print(pages);
}
virtual int getavailable() { return availbleInk; }
virtual void show() {
cout << getmodel() << ", " << getmanufacturer()
<< ", 남은 종이" << getavailableCount() << ", 남은 잉크" << getavailable() << endl;
}
};
class RPrinter : public Printer {
int availableToner; //토너 잔량
public:
RPrinter(string m, string f, int aCount, int aToner) : Printer(m, f, aCount) { availableToner = aToner; } //토너 초기화
virtual int getavailableCount() { return getCount(); }
virtual void printitem(int pages) {
availableToner -= pages;
print(pages);
}
virtual int getavailable() { return availableToner; }
virtual void show() {
cout << getmodel() << ", " << getmanufacturer()
<< ", 남은 종이" << getavailableCount() << ", 남은 토너" << getavailable() << endl;
}
};
int main()
{
IPrinter IP("Officejet V40", "HP", 5, 10);
RPrinter RP("SCX-6x45", "삼성전자", 3, 20);
char q = 'y';
int printer, pages;
cout << "현재 작동중인 2대의 프린터는 아래와 같다" << endl;
cout << "잉크젯 : ";
IP.show();
cout << "레이저 : ";
RP.show();
while (true) {
cout << endl;
cout << "프린터 (1:잉크젯, 2:레이저)와 매수 입력>>";
cin >> printer >> pages;
if (!(printer == 1 || printer == 2)) //프리터 1번 또는 2번을 선택하지 않았다면
cout << "프린터가 존재하지 않습니다." << endl;
else
{
if (printer == 1) { //잉크젯 선택
if (IP.getavailableCount() < pages) //용지가 부족할 경우
cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
else {
IP.printitem(pages);
cout << "프린터하였습니다.\n";
}
}
else { //그 외 선택
if (RP.getavailableCount() < pages) //용지가 부족할 경우
cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
else {
RP.printitem(pages);
cout << "프린터하였습니다.\n";
}
}
}
IP.show();
RP.show();
cout << "계속 프린트 하시겠습니까?(y/n)>>";
cin >> q; //n이면 루프 종료
if (q == 'y')
continue;
else //그이외에의 값 종료 while(q != 'n')을 쓰셔도 됩니다.
exit(1);
}
}
반응형