Ласло Краус |
ИР2ОО1 Други колоквијум 11. 2. 2005. |
---|
Коришћењем приложених готових класа вектора и тачака у простору, реализовати на језику C++ следећи систем класа (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни):
d<<e
) у облику (
x,
y,
z)
.
S{(
x,
y,
z),
r}
.
(
x,
y,
z)[
vx,
vy,
vz]
.
V{(
x,
y,
z)[
vx,
vy,
vz],
r,
h}
.
s+=e
). Препуњавање структуре пријављивати изузетком типа једноставне класе која је у стању да испише одговарајућу поруку. Структура се у датотеку пише у облику <(
x,
y,
z)[
vx,
vy,
vz],
e,
e,…,
e>
, где су e резултати писања садржаних елемената.
(10 поена) Написати на језику C++ главни програм који састави пример структуре са фиксним параметрима (није потребно учитавање делова са главног улаза), испише на главни излаз добијену структуру, заједно са њеном запремином.
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Објаснити зашто наведена конструкција није исправна:
class A { int i; public: A(int ii){i=ii;} }; class B: public A { int j; public: B(int jj){j=jj;} };
б) Да ли конструктор може бити виртуелна функција и зашто?
в) Да ли виртуелна метода може да промени throw()
листу методе из базне класе и како?
#include <iostream> using namespace std; ///////////////////////////// Nije deo resenja //////////////////////////////////// /// class Vektor { /// double vx, vy, vz; /// public: /// Vektor (double xv=1,double yv=0,double zv=0) { vx = xv; vy = yv, vz = zv; } /// friend ostream& operator<< (ostream& d, const Vektor& v) /// { return d << '[' << v.vx << ',' << v.vy << ',' << v.vz << ']'; } /// }; /// /// class Tacka { /// double x, y, z; /// public: /// Tacka (double xx=0,double yy=0,double zz=0) { x = xx; y = yy, z = zz; } /// friend ostream& operator<< (ostream& d, const Tacka& t) /// { return d << '(' << t.x << ',' << t.y << ',' << t.z << ')'; } /// }; /// /// ///////////////////////////// Nije deo resenja //////////////////////////////////// class Element { Tacka t; public: Element (const Tacka& tt): t (tt) {} virtual ~Element () {} virtual Element* kopija () const =0; Element& premesti (const Tacka& tt) { t = tt; return *this; } virtual double V () const =0; protected: virtual void pisi (ostream& d) const {d<<t;} friend ostream& operator<< (ostream& d, const Element& e) { e.pisi (d); return d; } }; class Sfera: public Element { double r; void pisi (ostream& d) const { d << "S{"; Element::pisi (d); d << ',' << r << '}'; } public: Sfera (const Tacka& tt, double rr) : Element (tt) { r = rr; } Sfera* kopija () const { return new Sfera (*this); } double V () const { return 4 * r*r*r * 3.14159 / 3; } }; class OElement: public Element { Vektor v; public: OElement (const Tacka& tt, const Vektor& vv) : Element (tt), v (vv) {} OElement& okreni (const Vektor& vv) { v = vv; return *this; } protected: void pisi (ostream& d) const { Element::pisi (d); d << v; } }; class Valjak: public OElement { double r, h; void pisi (ostream& d) const { d << "V{"; OElement::pisi (d); d << ',' << r << ',' << h << '}'; } public: Valjak (const Tacka& tt, const Vektor& vv, double rr, double hh) : OElement (tt, vv) { r = rr; h = hh; } Valjak* kopija () const { return new Valjak (*this); } double V () const { return r*r*3.14159*h; } }; class GStrPuna {}; ostream& operator<< (ostream& d, const GStrPuna&) { return d << "*** Struktura je puna!\n"; } class Struktura: public OElement { Element** niz; int kap, duz; void kopiraj (const Struktura&); void brisi (); void pisi (ostream&) const; public: explicit Struktura (const Tacka& t, const Vektor& v, int k=5): OElement (t, v) { niz = new Element* [kap = k]; duz = 0; } Struktura (const Struktura& s): OElement (s) { kopiraj (s); } ~Struktura () { brisi (); } Struktura& operator= (const Struktura& s) { if (this != &s) { brisi (); OElement::operator= (s); kopiraj (s); } return *this; } Struktura* kopija () const { return new Struktura (*this); } Struktura& operator+= (const Element& e) { if (duz == kap) throw GStrPuna (); niz[duz++] = e.kopija (); return *this; } double V () const; }; void Struktura::kopiraj (const Struktura& s) { niz = new Element* [kap=s.kap]; duz = s.duz; for (int i=0; i<duz; i++) niz[i] = s.niz[i]->kopija (); } void Struktura::brisi () { for (int i=0; i<duz; delete niz[i++]); delete [] niz; } void Struktura::pisi (ostream& d) const { d << '<'; OElement::pisi (d); for (int i=0;i<duz;i++) d << ',' << *niz[i]; d << '>'; } double Struktura::V () const { double v = 0; for (int i=0; i<duz; v+=niz[i++]->V()); return v; } int main () { try { Struktura s1 (Tacka(1,2,3), Vektor(), 10); s1 += Sfera (Tacka(1,1), 3); s1 += Valjak (Tacka(2,0,3), Vektor(-2,0,5), 1, 3); Struktura s2 (Tacka(-1,-2,-3), Vektor(-1), 5); s2 += Sfera (Tacka(5), 1); s2 += Valjak (Tacka(), Vektor(0,-2), 3,2); s1 += s2; cout << s1 << " V=" << s1.V() << endl; } catch (GStrPuna g) { cout << g << endl; } return 0; }(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.