![]() Ласло Краус |
Објектно програмирање - испити Практични испит 9. 2. 1999 |
---|
Real
).
Предвидети:
+
),+=
),>>
), и<<
).Cmplx
) као изведену класу из класе реалних бројева. Поред
могућности те класе (са изузетком дохватања садржаја објекта) предвидети још:
=
),+=
),--
),
и<<
).Саставити главни програм на језику C++ који:
R
=ред за чекање,
S
=стек),R
=реалан,
K
=комплексан) и вредност податка преко главног улаза
и ставља у колекцију,G
(=готово),G
(=готово).// 990209.h
#ifndef __990209__h__
#define __990209__h__
#include <iostream.h>
class Real {
protected:
double x;
public:
Real (double xx=0) { x = xx; }
~Real() {}
virtual Real *kopija () const { return new Real (*this); }
double operator+ () const { return x; }
virtual Real & operator+= (const Real &rr)
{ x += rr.x; return *this; }
protected:
virtual void citaj (istream &dd) { dd >> x; }
virtual void pisi (ostream &dd) const { dd << x; }
friend istream & operator>> (istream &dd, Real &rr)
{ rr.citaj (dd); return dd; }
friend ostream & operator<< (ostream &dd, const Real &rr)
{ rr.pisi (dd); return dd; }
};
class Cmplx: public Real {
double y;
public:
Cmplx (double xx=0, double yy=0): Real (xx) { y = yy; }
Cmplx (const Real &rr): Real (rr) { y = 0; }
Real *kopija () const { return new Cmplx (*this); }
Cmplx & operator+=(const Real &cc)
{ x += +cc; y += ((Cmplx &)cc).y; return *this; }
private:
void citaj (istream &dd) { Real::citaj (dd); dd >> y; }
void pisi (ostream &dd) const
{ dd << '('; Real::pisi (dd); dd << ',' << y << ')'; }
};
class Red {
protected:
struct Elem { Real *broj; Elem *sled;
Elem (const Real &rr, Elem *ss=0)
{ broj=rr.kopija(); sled=ss; }
~Elem () { delete broj; }
};
Elem *prvi, *posl;
void kopiraj (const Red &rr);
void brisi ();
public:
enum Greska {PRAZAN = 1};
Red () { prvi = posl = 0; }
Red (const Real &rr) { prvi = posl = new Elem (rr); }
Red (const Red &rr) {kopiraj(rr);}
~Red () { brisi (); }
virtual Red & operator= (const Red &rr) {
if (this != &rr) { brisi (); kopiraj (rr); }
return *this;
}
virtual Red & operator+= (const Real &rr) {
posl = (posl ? posl->sled : prvi) = new Elem (rr);
return *this;
}
Real * operator-- () {
if (! prvi) throw PRAZAN;
Real *rr = prvi->broj;
Elem *stari = prvi; prvi = prvi->sled; stari->sled = 0;
delete stari;
return rr;
}
friend ostream & operator<< (ostream &dd, const Red &rr);
};
class Stek: public Red {
public:
Stek (): Red () {}
Stek (const Stek &ss): Red (ss) {}
Stek & operator+= (const Real &rr)
{ prvi = new Elem (rr, prvi); if (! posl) posl = prvi; return *this;}
};
#endif
// 990209.cpp
#include "990209.h"
void Red::kopiraj (const Red &rr) {
prvi = posl = 0;
for (Elem *tek=rr.prvi; tek; tek=tek->sled)
posl = (posl ? posl->sled : prvi) = new Elem (*(tek->broj));
}
void Red::brisi () {
while (prvi) { Elem *stari = prvi; prvi = prvi->sled; delete stari; }
posl = 0;
}
ostream & operator<< (ostream &dd, const Red &rr) {
dd << '[';
for (Red::Elem *tek=rr.prvi; tek; tek=tek->sled) {
dd << *(tek->broj);
if (tek->sled) dd << ',';
}
return dd << ']';
}
// 990209t.cpp
#include "990209.h"
#include <iostream.h>
void main () {
for (int dalje=1; dalje;) {
try {
cout<< "Vrsta kolekcije (Red, Stek, Gotovo)? ";
char izb; cin >> izb; Red *rs=0;
switch (izb) {
case 'R': case 'r': rs = new Red; break;
case 'S': case 's': rs = new Stek; break;
case 'G': case 'g': dalje = 0; break;
default: throw 1;
}
if (dalje) {
for (int jos=1; jos;) {
try {
cout << "Vrsta podatka (Realan, Kompleksan, Gotovo)? ";
char izb; cin >> izb; Real *rk=0;
switch (izb) {
case 'R': case 'r': rk = new Real; break;
case 'K': case 'k': rk = new Cmplx; break;
case 'G': case 'g': jos = 0; break;
default: throw 1;
}
if (jos) {
cout << "Vrednost podatka? "; cin >> *rk;
*rs += *rk; delete rk;
}
} catch (int) {
cout << "*** Neispravna vrsta podataka ***\n";
}
}
cout << "Procitano: " << *rs << endl;
Cmplx zbir;
try {
while (1) {Real *rk = --*rs; zbir += *rk; delete rk; }
} catch (Red::Greska) {
cout << "Zbir podataka = " << zbir << "\n\n";
}
delete rs;
}
} catch (int) {
cout << "*** Neispravan izbor ***\n";
}
}
}
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.