![]() Ласло Краус |
Објектно програмирање - испити Практични испит 1. 7. 1999 |
---|
Predmet
) у којој је предвиђено да све изведене класе
имају следеће могућности:
+
),
<<
).
Prost
)
као изведену класу из класе за предмете. Прости предмети су описани
специфичном тежином и запремином. Поред могућности наслеђених из
основне класе, предвидети:
=
).
Slozen
) као изведену класу из класе предмета. Сложен
предмет се састоји од произвољног броја предмета (простих и сложених).
Поред могућности наслеђених из основне класе, предвидети:
=
),
и
USlozen
) као изведену класу из класе сложених предмета са
истим могућностима као и оснвна класа. Подаци о компонентним предметима
треба да су уређени по тежинама тих предмета.Саставити на језику C++ главни програм који:
N
=неуређена,
U
=уређена),
P
=прост, S
=сложен)
и податке о предмету и ставља их у склоп (сложени предмети у
склопу се састоје само од простих предмета и уређени су ако је
склоп уређен),
G
(=готово),
G
(=готово).
// 990701.h
#ifndef __990701__h__
#define __990701__h__
#include <iostream.h>
class Predmet {
public:
virtual Predmet *kopija () const =0;
virtual double operator+ () const =0;
virtual ~Predmet () {}
private:
virtual void pisi (ostream &dd) const =0;
friend ostream & operator<< (ostream &dd, const Predmet &pp)
{ pp.pisi (dd); return dd; }
};
class Prost: public Predmet {
double v, ro;
public:
Prost (double vv=1, double rro=1) { v = vv; ro = rro; }
Predmet *kopija () const { return new Prost (*this); }
double operator+ () const { return v * ro; }
protected:
void pisi (ostream &dd) const { dd << '(' << v << ',' << ro << ')'; }
};
class Slozen: public Predmet {
protected:
struct Elem { Predmet *predm; Elem *sled;
Elem (const Predmet &pp, Elem *ss=0) { predm=pp.kopija(); sled=ss; }
~Elem () { delete predm; }
};
Elem *prvi, *posl;
void kopiraj (const Slozen &ss);
void brisi ();
public:
Slozen () { prvi = posl = 0; }
Slozen (const Prost &pp) { prvi = posl = new Elem (pp); }
Slozen (const Slozen &ss) { kopiraj (ss); }
~Slozen () { brisi (); }
Slozen & operator= (const Slozen &ss) {
if (this != &ss) { brisi (); kopiraj (ss); }
return *this;
}
Predmet *kopija () const { return new Slozen (*this); }
double operator+ () const;
virtual Slozen & operator+=(const Predmet &pp) {
posl = (posl ? posl->sled : prvi) = new Elem (pp);
return *this;
}
protected:
void pisi (ostream &dd) const;
};
class USlozen: public Slozen {
public:
USlozen (): Slozen() {}
USlozen (const Prost &pp): Slozen(pp) {}
USlozen (const Slozen &ss): Slozen(ss) {}
USlozen & operator= (const Slozen &ss) {
if (this != &ss) { brisi (); kopiraj ((const Slozen &)ss); }
return *this;
}
USlozen & operator+=(const Predmet &pp);
};
#endif
// 990701.cpp
#include "990701.h"
void Slozen::kopiraj (const Slozen &ss) {
Elem* posl = prvi = 0;
for (Elem *tek=ss.prvi; tek; tek=tek->sled)
posl = (posl ? posl->sled : prvi) = new Elem (*(tek->predm));
}
void Slozen::brisi () {
while (prvi) { Elem *stari = prvi; prvi = prvi->sled; delete stari; }
}
double Slozen::operator+ () const {
double q=0;
for (Elem *tek=prvi; tek; tek=tek->sled) q += +*tek->predm;
return q;
}
void Slozen::pisi (ostream &dd) const {
dd << '[';
for (Elem *tek=prvi; tek; tek=tek->sled) {
dd << *(tek->predm);
if (tek->sled) dd << ',';
} dd << ']';
}
USlozen & USlozen::operator+= (const Predmet &pp) {
for (Elem *tek=prvi, *preth=0; tek && +*tek->predm<+pp;
preth=tek, tek=tek->sled);
(preth ? preth->sled : prvi) = new Elem (pp, tek);
return *this;
}
// 990701t.cpp
#include "990701.h"
#include <iostream.h>
void main () {
for (int dalje=1; dalje;) {
try {
cout<< "Vrsta sklopa (Neuredjena, Uredjena, Gotovo)? ";
char izb1; cin >> izb1; Slozen *sklop=0;
switch (izb1) {
case 'N': case 'n': sklop = new Slozen; break;
case 'U': case 'u': sklop = new USlozen; break;
case 'G': case 'g': dalje = 0; break;
default: throw 1;
}
if (dalje) {
for (int jos=1; jos;) {
try {
cout << "Vrsta predmeta (Prost, Slozen, Gotovo)? ";
char izb2; cin >> izb2;
switch (izb2) {
case 'p': case 'P': {
double v, ro; cout << "V, Ro? "; cin >> v >> ro;
*sklop += Prost (v, ro);
break;
} case 's': case 'S': {
Slozen *slozen = (izb1 == 'N' || izb1 == 'n') ?
new Slozen : new USlozen;
while (1) {
double v, ro; cout << "V, Ro? "; cin >> v >> ro;
if (v<0 || ro < 0) break;
*slozen += Prost (v, ro);
}
*sklop += *slozen;
break;
} case 'G': case 'g': jos = 0; break;
default: throw 1;
}
} catch (int) {
cout << "*** Neispravna vrsta predmeta ***\n";
}
}
cout << "Sklop= " << *sklop << endl
<< "Tezina= " << +*sklop << endl;
}
} catch (int) {
cout << "*** Neispravan izbor ***\n";
}
}
}
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.