Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО1/СИ2ОО1
Испит
17. 1. 2013.

Аутори: Игор Тартаља, Ласло Краус и Ђорђе Ђурђевић

Задаци: 1 2 | Напоменe | Решења: 2

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (једна или две реченице) и прецизно на следећа питaња:

а) Ако је за K k; T t; I i; потребно дозволити израз t=k[i], а спречити израз k[i]=t, при чему се и параметар преноси и резултат враћа по референци, написати декларацију операторске функције [] за класу K.

б) Како се право приступа наслеђеном члану код приватног извођења може променити у случајевима када је право приступа у основној класи (1) приватно (2) заштићено (3) јавно?

в) Да ли се у време извршавања може променити тип елемента неке генеричке (шаблонске) збирке елемената? Зашто?

Поставка задатка 2 (укупно 70 поена) ( решење | почетак)

Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене писањем текста поруке):

(5 поена) Написати на језику C++ програм који направи складиште и изврши неколико операција стављања и вађења производа уз исписивање складишта на главном излазу после сваке операције. Користити фиксне параметре (не треба ништа учитавати с главног улаза).


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

#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),,]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2013, Laslo Kraus
Последња ревизија: 12.2.2013.