Ласло Краус |
СИ2ОО1 Други колоквијум 12. 12. 2005. |
---|
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
dat<<t
).
S
, запремина је 4r3π/3 и у датотеку се пише у облику S(
r)
.
V
, запремина је r2πh и у датотеку се пише у облику V(
r,
h)
.
red+=pr
; покушај стављања у пун ред прекида програм), да се узме тело са почетка реда (покушај узимања из празног реда прекида програм) и да се садржај реда упише у датотеку (dat<<red
) у облику red[
t,
t,…,
t]
, где су t резултати писања појединих садржаних тела.
(20 поена) Написати на језику C++ главни програм који направи ред капацитета који прочита са главног улаза, чита разноврсна тела са главног улаза и ставља их у ред све док се ред не напуни, испише садржај реда на главном излазу, узимајући тела из реда док се ред не испразни израчуна средњу запремину свих тела у реду, испише добијени резултат на главном излазу и понавља претходне кораке док за капацитет реда не прочита недозвољену вредност.
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Које особине стандардних оператора се подразумевају при њиховом преклапању?
б) Навести два начина кориснички дефинисане конверзије и основне разлике између њих?
в) У чему је разлика између јавног и приватног извођења и којој релацији је слично приватно извођење?
г) Ако основна класа садржи један низ објеката, а изведена други низ – навести презизан редослед конструкције објекта изведене класе.
д) Који проблеми се појављују при вишеструком извођењу и како се решавају?
#include <iostream> #include <cstdlib> using namespace std; class Telo { public: virtual ~Telo () {} virtual char vrsta () const =0; virtual double V () const =0; virtual Telo* kopija () const =0; private: virtual void pisi (ostream&) const =0; friend ostream& operator<< (ostream& d, const Telo& t) { t.pisi (d); return d; } }; class Sfera: public Telo { double r; public: Sfera (double rr=1) { r = rr; } char vrsta () const { return 'S'; } double V () const { return 4 * r*r*r * 3.14159 / 3; } Sfera* kopija () const { return new Sfera (*this); } private: void pisi (ostream& d) const { d << "S(" << r << ')'; } }; class Valjak: public Telo { double r, h; public: Valjak (double rr=1, double hh=1) { r = rr; h = hh;} char vrsta () const { return 'V'; } double V () const { return r*r * 3.14159 * h; } Valjak* kopija () const { return new Valjak (*this); } private: void pisi (ostream& d) const { d << "V(" << r << ',' << h << ')'; } }; class Red { Telo** niz; int kap, prvi, posl, duz; void kopiraj (const Red&); void brisi (); public: explicit Red (int k=5); Red (const Red& r) { kopiraj (r); } ~Red () { brisi (); } Red& operator= (const Red& r) { if (this != &r) { brisi (); kopiraj (r); } return *this; } bool pun () { return duz == kap; } bool prazan () { return duz == 0; } Red& operator+= (const Telo& t) { if (duz == kap) exit (1); niz[posl++] = t.kopija (); duz++; if (posl == kap) posl = 0; return *this; } Telo* uzmi () { if (duz == 0) exit (2); Telo* t = niz[prvi]; niz[prvi++] = 0; duz--; if (prvi == kap) prvi = 0; return t; } friend ostream& operator<< (ostream&, const Red&); }; Red::Red (int k) { niz = new Telo* [kap = k]; for (int i=0; i<kap; niz[i++]=0); prvi = posl = duz = 0; } void Red::kopiraj (const Red& r) { niz = new Telo* [kap = r.kap]; for (int i=0; i<kap; i++) niz[i] = r.niz[i] ? r.niz[i]->kopija () : 0; prvi = r.prvi; posl = r.posl; duz = r.duz; } void Red::brisi () { for (int i=0; i<kap; delete niz[i++]); delete [] niz; } ostream& operator<< (ostream& d, const Red& r) { d << "red["; for (int i=0; i<r.duz; i++) { if (i) d << ','; d << *r.niz[(r.prvi+i)%r.kap]; } return d << ']'; } int main () { while (true) { cout << "kap? "; int k; cin >> k; if (k <= 0) break; Red red (k); while (! red.pun ()) { cout << "Vrsta (S,V)? "; char vr; cin >> vr; double r, h; switch (vr) { case 's': case 'S': cout << "r? "; cin >> r; red += Sfera (r); break; case 'v': case 'V': cout << "r,h? "; cin >> r >> h; red += Valjak (r, h); break; } } cout << red << endl; double V = 0; int n = 0; while (! red.prazan ()) { Telo* t = red.uzmi (); V += t->V (); n++; delete t; } if (n) V /= n; cout << "Vsr= " << V << endl; } return 0; }
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.