Ласло Краус |
ИР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.