#include <iostream>
#include <string>
using namespace std;
class Printer { //프린터 클래스
protected:
string
model; //모델명 스트링
string
manufacturer; //제조사명 스트링
int printedcount; //총 출력된 매수
int availableCount; // 앞으로 출력 가능한 매수
int print(int
pages); //프린트 원형 함수
Printer(string
model, string manufacturer, int
availableCount); //생성자
void show(); // 화면 출력 함수
};
class InkjetPrinter : public Printer { //프린터를 상속받은 잉크젯 프린터 클래스
private:
int availableInk; //잉크잔량
public:
InkjetPrinter(string
model, string manufacturer, int
availableCount,int availableInk); //생성자
void printInkJet(int
pages); //잉크젯 프린트 함수
void inkjetshow(); //잉크젯 화면 출력 함수
};
class LaserPrinter : public Printer { //프린터를 상속받은 레이저 프린터 클래스
private:
float availableToner; //토너잔량
public:
LaserPrinter(string
model, string manufacturer, int
availableCount, float availableToner); //생성자
void printLaser(int
pages); //레이저 프린트 함수
void lasershow(); //레이저 화면 출력 함수
};
Printer::Printer(string model, string manufacturer, int availableCount) {
this->model = model;
this->manufacturer = manufacturer;
this->printedcount = 0; //객체 생성시 한장도 안뽑았으므로 0장
this->availableCount = availableCount;
}
int Printer::print(int pages) {
if (availableCount - pages < 0) { cout << "용지가 부족하여 프린트 할 수 없습니다." << endl; return 0; }
else { availableCount -= pages; printedcount +=
pages; return
1; }
} //사용가능한 용지보다 뽑아야하는 용지 수가 많으면 fail, 아니면 success 이때는 사용가능 페이지를 사용한 만큼 - 해준다. 그리고 사용한 페이지를 +해준다.
//리턴 타입을 정해준 이유는 아래 프린트잉크젯이나 프린트레이저에서 프린트가 가능 할 때만 if문이 실행되게 하기 위해서 그렇다.
void Printer::show() {
cout
<< this->model << ", " << this->manufacturer
<< ", " << "남은 종이" << this->availableCount
<< "장";
} //모델명, 제조사명, 남은종이 출력
InkjetPrinter::InkjetPrinter(string model, string
manufacturer, int availableCount, int availableInk) : Printer(model, manufacturer,
availableCount) {
this->availableInk = availableInk;} //프린터 생성자와 동시에 사용가능잉크 입력
void InkjetPrinter::printInkJet(int pages) {if (print(pages)) {
if(availableInk-pages<0){ cout << "잉크가 부족하여 프린트 할 수 없습니다." << endl; availableCount+=pages;} //잉크 부족시 에러
else {cout << "프린트하였습니다." << endl; availableInk -= pages;} }} //페이지 수만큼 출력가능하면 잉크 그만큼 -해줌.
void InkjetPrinter::inkjetshow() {
show();
cout << ", 남은 잉크 " << this->availableInk
<< endl;} //print의 show 실행 후 남은 잉크 출력
LaserPrinter::LaserPrinter(string model, string
manufacturer, int availableCount, float availableToner) : Printer(model,
manufacturer, availableCount) {
(this->availableToner) = (float)availableToner; } //프린터 생성자와 동시에 사용가능토너 입력
void LaserPrinter::printLaser(int pages) { if (print(pages)) {
if((float)(availableToner*2)-(float)pages<0){ cout << "토너가 부족하여 프린트 할 수 없습니다." << endl; availableCount+=pages;} //토너 부족시 에러
else {cout << "프린트하였습니다." << endl; (float)availableToner -=
((float)pages/2);} } } // 페이지 수만큼 출력가능하면 토너 그것의 1/2만큼 - 해줌.
void LaserPrinter::lasershow() {
show();
cout << ", 남은 잉크 " << (float)(this->availableToner) << endl;} //print의 show 실행 후 남은 토너 출력
int main(void) {
char check = 0; // check는 y/n을 나타낸다.
InkjetPrinter
ip("Officejet V40", "HP", 20, 10); // 잉크젯프린터 ip 생성
LaserPrinter
lp("SCX-6x45", "삼성전자", 30, 10.0); // 레이저프린터 lp 생성
cout
<< "현재 작동 중인 2 대의 프린터는 아래와 같다." << endl;
cout
<< "잉크젯 : "; ip.inkjetshow(); cout << "레이저 : "; lp.lasershow(); //화면 출력
while (1) {
cout
<< "프린터(1:잉크젯, 2:레이저)와 매수 입력>> ";
int which = 0; int
pg = 0; //which는 잉크젯과 레이저를 구분
cin
>> which >> pg; cin.ignore(100, '\n');
//개행문자 삭제를 위하여 ignore 사용
if (which == 1) { //잉크젯이면
ip.printInkJet(pg);
//pg만큼 출력한다.
cout
<< "잉크젯 : "; ip.inkjetshow(); cout << "레이저 : "; lp.lasershow(); //화면 출력
while (1) {
cout
<< "계속 프린트 하시겠습니까?(y/n)>>";
check=cin.get();
cin.ignore(100, '\n'); //'y','n'을 받고 개행문자 없애기 위함.
if (check == 'y'||check=='n') { break; } //'y'나 'n'이면 브레이크
else { cout << "잘못된 입력입니다." << endl; continue;
} //이상한 것 들어오면 다시 실행
}
if (check=='y') continue; else if (check=='n') break; //y면 루프 처음으로 n이면 브레이크
}
else if (which ==
2) { //레이저면
lp.printLaser(pg);
//pg만큼 출력한다.
cout
<< "잉크젯 : "; ip.inkjetshow(); cout << "레이저 : "; lp.lasershow(); //화면 출력
while (1) {
cout
<< "계속 프린트 하시겠습니까?(y/n)>>";
check
= cin.get(); cin.ignore(100, '\n'); //'y','n'을 받고 개행문자 없애기 위함.
if (check == 'y'
|| check == 'n') { break; } //'y'나 'n'이면 브레이크
else { cout << "잘못된 입력입니다." << endl; continue;
} //이상한 것 들어오면 다시 실행
}
if (check == 'y')
continue; else
if (check == 'n')
break; //y면 루프 처음으로 n이면 브레이크
}
else { cout << "잘못된 입력입니다." << endl; continue;
} //which가 1이나 2가아니면 출력되는 에러
}
return 0;
}
|