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

Аутори: Игор Тартаља и Ласло Краус

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

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

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

а) Како се може иницијализовати атрибут који је референца (упућивач) у некој класи?

б) Колико пута се изврши конструктор основне класе B при креирању објекта класе D која је вишеструко изведена из класа X, Y, Z, ако је класа B (1) виртуелна (2) невиртуелна основна класа за класе X, Y и Z?

в) Да ли је механизам генерика (шаблона) статички или динамички и зашто?

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

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

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


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


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

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

class GPrazna{};
inline ostream& operator<<( ostream& it, const GPrazna&)
  { return it << "*** Lista je prazna!"; }

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

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

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

class Element {
  char* mod; double tez;
  void kopiraj (const Element& ele) {
    mod = strcpy( new char[strlen(ele.mod)+1], ele.mod);
    tez = ele.tez;
  }
  void brisi() { delete [] mod; }
public:
  Element( const char* m, double t) {
    mod = strcpy( new char [strlen(m)+1], m);
    tez = t;
  }
  Element( const Element& ele) { kopiraj( ele); }
  virtual ~Element() { brisi(); }
  Element& operator=( const Element& ele) {
    if (this != &ele) { brisi(); kopiraj( ele); }
    return *this;
  }
  const char* model() const { return mod; }
  double tezina() const { return tez; }
  virtual const char* vrsta() const =0;
protected:
  virtual void pisi( ostream& it) const { it << '('
    << mod << ',' << vrsta() << ',' << tez << ')'; }
  friend ostream& operator<<( ostream& it,
    const Element& ele) { ele.pisi(it); return it; }
};

class Motor: public Element {
  static int ukId;
  int id, brCil;
  void pisi( ostream& it) const {
    Element::pisi( it);
    it << '[' << id << ',' << brCil << ']';
  }
public:
  Motor( const char* mod, double tez, int brC=4):
    Element( mod, tez) { brCil = brC; id = ++ukId; }
  Motor( const Motor& m):
    Element( m) { brCil = m.brCil; id = ++ukId;}
  Motor& operator=( const Motor& m)
    { Element::operator=( m); brCil = m.brCil; }
  const char* vrsta () const { return "motor"; }
};

int Motor::ukId = 0;

class Sasija: public Element {
public:
  enum Boja {BELA,ZUTA,CRVENA,ZELENA,PLAVA,CRNA };
private:
  static int ukId;
  int id; Boja boja;
  static const char* boje[];
  void pisi( ostream& it) const {
    Element::pisi( it);
    it << '[' << id << ',' << boje[boja] << ']';
  }
public:
  Sasija( const char* mod, double tez, Boja b=BELA):
    Element( mod, tez) { boja = b; id = ++ukId; }
  Sasija( const Sasija& s): Element( s) { boja = s.boja; id = ++ukId; }
  Sasija& operator=( const Sasija& s) { Sasija::operator=( s); boja = s.boja; }
  const char* vrsta () const { return "sasija"; }
};

int Sasija::ukId = 0;

const char* Sasija::boje[] = { "bela", "zuta", "crvena", "zelena", "plava", "crna" };

class GModel {};
inline ostream& operator<<( ostream& it, const GModel&)
  { return it << "*** Razliciti modeli delova!"; }

class Automobil {
  Motor mot; Sasija sas;
public:
  Automobil( const Motor& m, const Sasija& s): mot(m), sas(s) {
    if (strcmp( m.model(), s.model()) != 0) throw GModel();
  }
  friend ostream& operator<<( ostream& it, const Automobil& a) {
    return it <<"auto{" <<a.sas <<";" <<a.mot <<'}';
  }
};

class Traka {
  Lista<Automobil*> lst;
  Traka( const Traka&) {}
  void operator=( const Traka&) {}
public:
  Traka() {}
  ~Traka();
  Traka &operator<<(Automobil* a) { lst.dodaj(a); return *this; }
  Traka &operator>>(Automobil*& a) { a=!lst.prazna()?lst.uzmi():0; return *this; }
};

Traka::~Traka() {
  while (!lst.prazna()) delete lst.uzmi();
};

int main() { Traka t;
  try {
    t << new Automobil(Motor("BMW", 400), Sasija("BMW", 3000, Sasija::BELA));
    t << new Automobil(Motor("VW",  300), Sasija("VW",  2500, Sasija::ZELENA));
    t << new Automobil(Motor("Kia", 500), Sasija("Kia", 3500, Sasija::CRNA));
    Automobil* a;
    t >> a; if (a) { cout << *a << endl; delete a; }
    t >> a; if (a) { cout << *a << endl; delete a; }
  } catch (GModel g)  { cout << g << endl; }
  return 0;
}

auto{(BMW,sasija,3000)[2,bela];(BMW,motor,400)[2,4]} auto{(VW,sasija,2500)[4,zelena];(VW,motor,300)[4,4]}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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