Ласло Краус |
ИР2ОО1/СИ2ОО1 Испит 17. 1. 2013. |
---|
Одговорити концизно (једна или две реченице) и прецизно на следећа питaња:
а) Ако је за K
k;
T
t;
I
i;
потребно дозволити израз t=k[i]
, а спречити израз k[i]=t
, при чему се и параметар преноси и резултат враћа по референци, написати декларацију операторске функције []
за класу K
.
б) Како се право приступа наслеђеном члану код приватног извођења може променити у случајевима када је право приступа у основној класи (1) приватно (2) заштићено (3) јавно?
в) Да ли се у време извршавања може променити тип елемента неке генеричке (шаблонске) збирке елемената? Зашто?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене писањем текста поруке):
up1==up2
).
it<<pro
) пишући ознаку врсте и идентификатор. Два производа су једнака ако имају исту ознаку врсте.
S
. Два сандука су једнакa ако одговарајуће ивице имају исте дужине. У излазни ток се пишу и димензије сандука.
B
. Два бурета су једнака ако имају исте полупречнике основе и висине. У излазни ток се пишу и димензије бурета.
zbr+=&pod
; грешка је ако нема слободног места), да се из збирке извади први податак који је једнак задатом податку (zbr-=pod
; грешка је ако таквог податка нема), да се одреди број слободних места у збирци и да се збирка упише у излазни ток (it<<zbr
) у облику [
податак,…,
податак]
.
(5 поена) Написати на језику C++ програм који направи складиште и изврши неколико операција стављања и вађења производа уз исписивање складишта на главном излазу после сваке операције. Користити фиксне параметре (не треба ништа учитавати с главног улаза).
#include <iostream> using namespace std; class Uporediv { public: virtual ~Uporediv() {} virtual bool operator==(const Uporediv& u) const =0; }; class Proizvod: public Uporediv { static int posId; int id; public: Proizvod() { id = ++posId; } Proizvod(const Proizvod&) { id = ++posId; } Proizvod& operator=(const Proizvod&) { return *this; } virtual char vrsta() const =0; virtual double zapr() const =0; virtual Proizvod* kopija() const =0; bool operator==(const Uporediv& u) const { return vrsta() == ((const Proizvod&)u).vrsta(); } protected: virtual void pisi(ostream& it) const { it << vrsta() << id; } friend ostream& operator<< (ostream& it, const Proizvod& p) { p.pisi(it); return it; } }; int Proizvod::posId = 0; class Sanduk: public Proizvod { double a, b, c; public: Sanduk(double p, double q, double r) { a = p; b = q; c = r; } char vrsta() const { return 'S'; } double zapr() const { return a*b*c; } Sanduk* kopija() const { return new Sanduk(*this); } bool operator==(const Uporediv& u) const { const Sanduk& s = (const Sanduk&)u; return Proizvod::operator==(u) && a==s.a && b==s.b && c==s.c; } private: virtual void pisi(ostream& it) const { Proizvod::pisi(it); it << '(' << a << ',' << b << ',' << c << ')'; } }; class Bure: public Proizvod { double r, h; public: Bure(double rr, double hh) { r = rr; h = hh; } char vrsta() const { return 'B'; } double zapr() const { return r * r * 3.14159 * h; } Bure* kopija() const { return new Bure(*this); } bool operator==(const Uporediv& u) const { const Bure& b = (const Bure&)u; return Proizvod::operator==(u) && r==b.r && h==b.h; } private: virtual void pisi(ostream& it) const { Proizvod::pisi(it); it << '(' << r << ',' << h << ')'; } }; class GPuna {}; inline ostream& operator<<(ostream& it, const GPuna&) { return it << "*** Zbirka je puna!";} class GNema {}; inline ostream& operator<<(ostream& it, const GNema&) { return it << "*** Nema podatka!"; } template <class C> class Zbirka { protected: C** niz; int kap; private: void kopiraj(const Zbirka& z); void brisi(); public: explicit Zbirka(int k = 10); Zbirka(const Zbirka&z) { kopiraj(z); } virtual ~Zbirka() { brisi(); } Zbirka& operator=(const Zbirka& z) { if (this != &z) { brisi(); kopiraj(z); } return *this; } virtual Zbirka& operator+=(C* c); C* operator-=(const C& c); int slobodno() const; template <typename T> friend ostream& operator<< (ostream& it, const Zbirka<T>& z); }; template <class C> Zbirka<C>::Zbirka(int k) { niz = new C* [kap = k]; for (int i=0; i<kap; niz[i++]=0); } template <class C> void Zbirka<C>::kopiraj(const Zbirka& z) { niz = new T* [kap = z.kap]; for (int i=0; i<kap; i++) niz[i] = z.niz[i] ? z.niz[i]->kopija() : 0; } template <class C> void Zbirka<C>::brisi() { for (int i=0; i<kap; delete niz[i++]); delete [] niz; } template <class C> Zbirka<C>& Zbirka<C>::operator+=(C* c) { int i = 0; while(i<kap && niz[i]) i++; if (i == kap) throw GPuna(); niz[i] = c; return *this; } template <class C> C* Zbirka<C>::operator-=(const C& c) { int i = 0; while (i<kap && (!niz[i] || !(*niz[i]==c))) i++; if (i == kap) throw GNema(); C* pc = niz[i]; niz[i] = 0; return pc; } template <class C> int Zbirka<C>::slobodno() const { int n = 0; for (int i=0; i<kap; n+=niz[i++]!=0); return n; } template <typename T> ostream& operator<<(ostream& it, const Zbirka<T>& z){ it << '['; for (int i=0; i<z.kap; i++) { if (i) it << ','; if (z.niz[i]) it << *z.niz[i]; } return it << ']'; } class GPrevelik{}; inline ostream& operator<<(ostream& it, const GPrevelik&) {return it<<"*** Prevelik proizvod!";} class Skladiste:public Zbirka<Proizvod>{ double Vmax; public: Skladiste(int kap, double maxV): Zbirka<Proizvod>(kap) { Vmax = maxV;} double ukZapr() const; Skladiste& operator+=(Proizvod* p) { if (ukZapr()+p->zapr() > Vmax) throw GPrevelik(); Zbirka<Proizvod>::operator+=(p); return *this; } double jos() const { return Vmax - ukZapr(); } }; double Skladiste::ukZapr() const { double V = 0; for (int i=0; i<kap; i++) if (niz[i]) V += niz[i]->zapr(); return V; } int main() { Skladiste skl(5, 500); try { skl += new Sanduk(1, 2, 3); cout << skl << endl; skl += new Bure(1, 2); cout << skl << endl; delete (skl -= Sanduk(1, 2, 3)); cout << skl << endl; skl += new Bure(2, 3); cout << skl << endl; delete (skl -= Bure(1, 2)); cout << skl << endl; skl += new Sanduk(2, 3, 4); cout << skl << endl; skl += new Bure(3, 4); cout << skl << endl; delete (skl -= Bure(2, 3)); cout << skl << endl; delete (skl -= Sanduk(1, 1, 1)); } catch (GPuna g) { cout << g << endl; } catch (GNema g) { cout << g << endl; } catch (GPrevelik g) { cout << g << endl; } cout << skl << endl; return 0; }(⇒ почетак)
[S1(1,2,3),,,,] [S1(1,2,3),B2(1,2),,,] [,B2(1,2),,,] [B4(2,3),B2(1,2),,,] [B4(2,3),,,,] [B4(2,3),S6(2,3,4),,,] [B4(2,3),S6(2,3,4),B7(3,4),,] [,S6(2,3,4),B7(3,4),,] *** Nema podatka! [,S6(2,3,4),B7(3,4),,]
Copyright © 2013, Laslo Kraus
Последња ревизија: 12.2.2013.