search

Внимание задача на польском языке!


Zadanie 11
Zaprojektować i zaimplementować hierarchię klas odwzorowującą roboty przemysłowe dwóch typów ( R1
i R2 ). Klasy robotów wyposaŜyć w polimorficzną metodę praca() wyświetlającą na standardowym wyjściu
operację wykonywaną przez robota.
Roboty zestawić w linię produkcyjną ( odwzorowaną w programie przez klasę Line ). W linii produkcyjnej
roboty róŜnych typów mogą być ustawione w dowolny sposób. W tym celu naleŜy zaimplementować metody
składowe klasy Line pozwalające na jej budowanie oraz modyfikację ( dodaj(), usun_ostatni(),
usun_wszystkie(), dodaj_n(), usun_n() ). Klasa Line powinna posiadać metodę do roboty()
uruchamiającą sekwencyjne wszystkie roboty w linii produkcyjnej, a takŜe metodę umoŜliwiającą tworzenie kopii
linii produkcyjnej.
Jako „nośnik danych” w klasie Line wykorzystać zasobnik sekwencyjny vector.
UWAGA !
 KaŜdy z destruktorów klas powinien na koniec swego działania wyświetlić na ekranie informację o jego wywołaniu.
 Przed zdefiniowaniem klasy Line warto skorzystać ze słowa kluczowego typedef ( typedef robot* wsk; )
Przykład kodu testującego
//...
 { Line l1 ; }
 { Line l2(5) ; }
 cout << "******1*******" << endl;
 Line lp1, lp2;
 lp1.dodaj(new R1);
 lp1.dodaj(new R1);
 lp1.dodaj(new R2);
 lp1.dodaj(new R2);

 lp2=lp1;

 {
 Line lp3;
 lp3.dodaj(new R1);
 lp3.dodaj(new R2);
 lp3.dodaj(new R1);
 lp3.dodaj(new R2);
 lp3.usun_ostatni();
 cout << "******2*******" << endl;
 lp3.do_roboty();
 lp1 = lp3;
 }
 cout << "******3*******" << endl;
 lp1.do_roboty();
 cout << "******4*******" << endl;
 wsk r[] = {new R2, new R1};
 line lp4(r, r+2);
 lp4.dodaj_n(1, new R2)
 lp4.do_roboty();
 cout << "******5*******" << endl;
 lp4 = lp2;
 lp4.do_roboty();
 cout << "******6*******" << endl;
 line lp6(lp1);
 lp6.usun_n(1);
 lp6.do_roboty();
 lp6.usun_wszystkie();
 lp6.do_roboty();
 cout << "******7*******" << endl;

 delete r[0];
 delete r[1];
//... 

Решение


//H.h
#pragma once
#include <iostream>
using namespace std; 
#define STOP system("pause"); 
#define COLOR_GREEN_TEXT system("color 0A");	

/*Athor Dombrovsky I.V.*/
#include <iostream>
#include <string>
#define _TEXT_GREEN_CMD system("color 0A");
#define _STOP_CONSOLE_WINDOWS system("pause"); 
using namespace std;
//========================================================
class Robot // Abstract class
{
public: 
	static int count_robots; // count objects (Security)
	Robot() : str(""), step(0) { Robot::count_robots++; } //DEFAULT
	Robot(string str) :str(str) { Robot::count_robots++; }
	Robot(string str, int step) :str(str), step(step) { Robot::count_robots++; }
	~Robot() { Robot::count_robots--; }
	virtual void action() = 0; // Virtual method
	Robot & operator -=(int value) // Overload operator -=
	{
		this->step -= value; 
		return *this; 
	}
	friend ostream& operator << (ostream &out, const Robot & obj) // overload operator << 
	{
		if(obj.step > 0) // SHOW
			out << obj.str << " na " << obj.step << " ones " << endl;
		else
			cout << obj.str << endl; // last output
		return out;
	}
protected: // Security
	int step; 
	string str;
};
//========================================================
int Robot::count_robots = -1; // Inicialization static veriable (Security key)
//========================================================
class rt1 : public Robot // class rt1 [robots]
{
public:
	rt1() :Robot() {} // DEFAULT
	rt1(string str) :Robot(str) { Robot::count_robots++; }
	rt1(string str, int step) :Robot(str, step) {}
	void action() const { cout << str << endl; } // Output const SMS
	virtual void action() override 
	{
		if(step > 0) // SHOW
			cout << str << " na " << step << " ones " << endl;
		else
			cout << str << endl; // last output
	}
};
//========================================================
class rt2 : public Robot // class rt2 [robots]
{
public:
	rt2() :Robot() {} // DEFAULT
	rt2(string str, int step) : Robot(str, step) {}
	virtual void action() override
	{
		if(step > 0)
			cout << str << " na " << step << " ones " << endl;
	}
};
//========================================================
int main() {
	_TEXT_GREEN_CMD // CONST DISPLAY TEXT COLOR GREEN
//--------------------------------------------------------
	Robot ** linia = new Robot *[5];
	const rt1 robot1("apply product finished");
	robot1.action();
	cout << "**********3**********\n";
//--------------------------------------------------------
	linia[0] = new rt1("put down");
	linia[1] = new rt2("stop", 5);
	linia[2] = new rt2("right", 4);
	linia[3] = new rt2("stop", 7);
	linia[4] = new rt1(robot1);
	for (int i = 0; i < 5; i++)
		linia[i]->action();
	cout << "**********7**********\n";
//--------------------------------------------------------
	*linia[3] -= 5;
	linia[3]->action();
	cout << "**********8**********\n";
//--------------------------------------------------------
	cout << "Count of robots: " << Robot::count_robots << endl;
	cout << "********9*******" << endl;
//--------------------------------------------------------
	for (int i = 0; i << 5; i++)
	{
		cout << *linia[i];
		delete linia[i];
	}
	cout << "Count of robots: " << Robot::count_robots << endl;
	linia[0] = new rt1("put down");
	linia[1] = new rt2("stop", 5);
	linia[2] = new rt2("right", 4);
	linia[3] = new rt2("stop", 7);
	linia[4] = new rt1(robot1);
	cout << "Count of robots: " << Robot::count_robots << endl;
	cout << "**********12**********\n";
//--------------------------------------------------------
	for(int i = 0; i < 5; i++)
		delete linia[i]; // CLEAR MEMORY
	_STOP_CONSOLE_WINDOWS // PAUSE SYSTEM CONSOLE WINDOWS 
	return 0; 
}

array