Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Трећи колоквијум
3. 2. 2008.

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

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

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

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

а) Шта се дешава када се у некој catch грани изврши наредба throw; ?

б) Која врста повезивања се примењује на имена анонимног простора имена и како се користе имена из анонимног простора?

в) Шта се назива делимичном, а шта потпуном специјализацијом шаблона? Навести декларације као примере обе специјализације шаблона template <class T1, class T2> class S;

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

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

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


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

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

class GPun {};
class GIndeks {};
class GPrazno {};

template <class T>
class Niz { T** niz; int kap;
  void kopiraj (const Niz& n);
  void brisi ();
public:
  explicit Niz (int k=10);
  Niz (const Niz& n) { kopiraj (n); }
  ~Niz () { brisi (); }
  Niz& operator= (const Niz& n) {
    if (this != &n) { brisi(); kopiraj(n); }
    return *this;
  }
  int kapac () const { return kap; }
  Niz& operator+= (const T& t);
  Niz& izbaci (int i) {
    if (i>=0 && i<kap) { delete niz[i]; niz[i] = 0; }
    return *this;
  }
  T& operator[] (int i) {
    if (i<0 || i>=kap) throw GIndeks ();
    if (! niz[i]) throw GPrazno ();
    return *niz[i];
  }
  const T& operator[] (int i) const {
    if (i<0 || i>=kap) throw GIndeks ();
    if (! niz[i]) throw GPrazno ();
    return *niz[i];
  }
  template <class T>
  friend ostream& operator<< (ostream& it, const Niz<T>& n);
};

template <class T>
void Niz<T>::kopiraj (const Niz& n) {
  niz = new T* [kap = n.kap];
  for (int i=0; i<kap; i++)
    niz[i] = n.niz[i] ? n.niz[i]->kopija():0;
}

template <class T>
void Niz<T>::brisi () {
  for (int i=0; i<kap; delete niz[i++]);
  delete [] niz;
}

template <class T>
Niz<T>::Niz (int k) {
  niz = new T* [kap = k];
  for (int i=0; i<k; niz[i++]=0);
}

template <class T>
Niz<T>& Niz<T>::operator+= (const T& t) {
  int i = 0; while (i<kap && niz[i]) i++;
  if (i == kap) throw GPun ();
  niz[i] = t.kopija ();
  return *this;
}

template <class T>
ostream& operator<< (ostream& it, const Niz<T>& n) {
  it << '<';
  for (int i=0; i<n.kap; i++) {
    if (i) it << " # ";
    if (n.niz[i]) it << *n.niz[i];
  }
  return it << '>';
}

class Crtez: public Figura {
  Niz<Figura> niz;
  void pisi (ostream& it) const{ it << niz; }
public:
  explicit Crtez (int kap): niz(kap) {}
  Crtez& operator+= (const Figura& f) { niz += f; return *this;}
  Crtez& operator+= (const Vektor& v);
  Crtez* kopija () const { return new Crtez (*this); }
};

Crtez& Crtez::operator+= (const Vektor& v) {
  for (int i=0; i<niz.kapac(); i++)
    try { niz[i] += v; } catch (GPrazno) {}
  return *this;
}

int main () {
  Crtez crt (3);
  crt += Duz (Vektor(1,1),Vektor(2,3));
  crt += Duz (Vektor(-1,0),Vektor(0,-5));
  crt += Duz (Vektor(0,0),Vektor(-2,-3));
  cout << crt << endl;
  crt += Vektor (2, 1);
  cout << crt << endl;
  return 0;
}

<(1,1)-(2,3) # (-1,0)-(0,-5) # (0,0)-(-2,-3)> <(3,2)-(4,4) # (1,1)-(2,-4) # (2,1)-(0,-2)>
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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