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

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

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

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

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

а) Ако је: class O{protected:int x;}; class I:O{}; да ли се и како може постићи да у класи I наслеђени члан x буде (1) приватан (2) заштићен (3) јаван?

б) Ако важи class I: public O{};, коју вредност ће имати аргумент x по напуштању функције f: void f(int&x) {x=0; try {x=1; throw new I; x=2;} catch(O*i) {x=3;} catch(I*i) {x=4;}}. Програм се успешно преводи и извршава.

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

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

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

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


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


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

#include <iostream>
#include <cstdlib>
using namespace std;

class Osoba {
  static int posId;
  int id;
  Osoba(const Osoba&) {}
  void operator=(const Osoba&) {}
public:
  Osoba() { id = ++posId; }
  virtual ~Osoba() {}
  virtual char vrsta() const =0;
protected:
  virtual void pisi (ostream& it) const { it << vrsta() << id; }
  friend ostream& operator<<(ostream& it, const Osoba& oso)
    { oso.pisi(it); return it; }
};

int Osoba::posId = 0;

class Klijent: public Osoba {
  char usl;
  void pisi(ostream& it) const
    { Osoba::pisi(it); it << '(' << usl << ')'; }
public:
  static const char usluge[];
  explicit Klijent() { usl = usluge[rand() % 3]; }
  char vrsta() const { return 'K'; }
  char dohvUsl() const { return usl; }
};

const char Klijent::usluge[] = {'a', 'b', 'c'};

class GPrazan {};
inline ostream& operator<<(ostream& it, const GPrazan&)
  { it << "*** Red je prazan!"; }

template <typename T>
class Red {
  struct Elem {
    T t; Elem* sled;
    Elem(const T& tt) { t = tt; sled = 0; }
  };
  Elem *prvi, *posl;
  void kopiraj(const Red& r);
  void brisi();
public:
  Red() { prvi = posl = 0; }
  Red(const Red& r) { kopiraj(r); }
  ~Red() { brisi(); }
  Red& operator=(const Red& r) {
    if (this != &r) { brisi(); kopiraj(r); }
    return *this;
  }
  Red& stavi(const T& t) {
    posl = (!prvi ? prvi : posl->sled)= new Elem(t);
    return *this;
  }
  T uzmi() {
    if (!prvi) throw GPrazan();
    T t = prvi->t;
    Elem* stari = prvi; prvi = prvi->sled;
    delete stari;
    if (!prvi) posl = 0;
    return t;
  }

  bool prazan() const { return !prvi; }
};

template <typename T>
void Red<T>::kopiraj(const Red& r) {
  prvi = posl = 0;
  for (Elem* tek=r.prvi; tek; tek=tek->sled)
    posl = (!prvi ? prvi : posl->sled) = new Elem(tek->t);
}

template <typename T>
void Red<T>::brisi() {
  while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; }
  posl = 0;
}

class Radnik: public Osoba {
protected:
  Klijent* kli;
  void pisi(ostream& it) const {
    if (kli) { Osoba::pisi(it); it << '[' << *kli << ']'; }
  }
public:
  Radnik() { kli = 0; }
  virtual void radi() =0;
};

class Portir: public Radnik {
  Red<Klijent*>* ulaz;
public:
  Portir(Red<Klijent*>* ul) { ulaz = ul; kli = 0; }
  char vrsta() const { return 'P'; }
  void radi() {
    ulaz->stavi(kli = new Klijent());
    if (kli) cout << *this << endl;
  }
};

class Razvodnik: public Radnik {
  Red<Klijent*>* ulaz;
  Red<Klijent*>* salteri;
public:
  Razvodnik(Red<Klijent*>* ul, Red<Klijent*> salt[])
    { ulaz = ul; salteri = salt; }
  char vrsta() const { return 'R'; }
  void radi() {
    try {
      kli = ulaz->uzmi();
      char uls = kli->dohvUsl();
      salteri[kli->dohvUsl() - Klijent::usluge[0]].stavi(kli);
    } catch (GPrazan) { kli = 0; }
    if (kli) cout << *this << endl;
  }
};

class Sluzbenik: public Radnik {
  Red<Klijent*>* salter;
public:
  Sluzbenik(Red<Klijent*>* salt) { salter = salt; }
  char vrsta() const { return 'S'; }
  void radi () {
    try { kli = salter->uzmi(); }
      catch (GPrazan) { kli = 0; }
      if (kli) {
        cout << *this << endl;
        delete kli; kli = 0;
      }
  }
};

class Sluzba {
  Red<Klijent*> ulaz;
  Red<Klijent*> salteri[3];
  Radnik** r;
  Sluzba(const Sluzba&) {}
  void operator=(const Sluzba&) {}
public:
  Sluzba() {
    r = new Radnik* [5];
    r[0] = new Portir(&ulaz);
    r[1] = new Razvodnik(&ulaz, salteri);
    r[2] = new Sluzbenik(&salteri[0]);
    r[3] = new Sluzbenik(&salteri[1]);
    r[4] = new Sluzbenik(&salteri[2]);
  }
  ~Sluzba();
  void radi(int n);
};

Sluzba::~Sluzba() {
  for (int i=0; i<5; delete r[i++]);
}

void Sluzba::radi(int n) {
  for (int i=0; i<n; i++) r[rand()%5]->radi();
}

int main() { Sluzba().radi(100); return 0; }

P1[K6(c)] P1[K7(c)] R2[K6(c)] R2[K7(c)] P1[K8(c)] R2[K8(c)] S5[K6(c)] P1[K9(c)] R2[K9(c)] S5[K7(c)] S5[K8(c)] P1[K10(a)] R2[K10(a)] S3[K10(a)] S5[K9(c)] P1[K11(c)] R2[K11(c)] P1[K12(c)] S5[K11(c)] R2[K12(c)] P1[K13(c)] S5[K12(c)] P1[K14(c)] R2[K13(c)] R2[K14(c)] S5[K13(c)] S5[K14(c)] P1[K15(b)] R2[K15(b)] S4[K15(b)] P1[K16(b)] P1[K17(a)] R2[K16(b)] S4[K16(b)] R2[K17(a)] P1[K18(c)]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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