Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Други колоквијум
8. 12. 2007.

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

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

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

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

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

б) Да ли се заштићеном члану основне класе O може приступити из методе приватно изведене класе I и да ли му се може приступити из методе класе II која је јавно изведена из I? Образложити.

в) При вишеструком извођењу, којим редоследом се позивају конструктори основних класа?

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

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

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


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


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

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

class Jedinica {
  char* naziv;
  void kpoiraj (const char* naz) {
    naziv = new char [strlen(naz)+1];
    strcpy (naziv, naz);
  }
  void brisi () { delete [] naziv; }
public:
  Jedinica (const char* naz) { kopiraj (naz); }
  Jedinica( const Jedinica& jed) { kopiraj( jed.naziv); }
  virtual ~Jedinica () { brisi (); }
  Jedinica& operator= (const Jedinica& jed) {
    if (this != &jed) { brisi (); kopiraj (jed.naziv); }
    return *this;
  }
  virtual char vrsta () const =0;
  virtual int brojStan () const =0;
protected:
  virtual void pisi (ostream& it) const
    { it << naziv << ':' << vrsta() << ':' << brojStan(); }
  friend ostream& operator<< (ostream& it, const Jedinica& jed)
    { jed.pisi (it); return it; }
};

class Naselje: public Jedinica {
  int brStan;
public:
  Naselje (const char* naz, int brS): Jedinica (naz) { brStan = brS; }
  char vrsta () const { return 'N'; }
  int brojStan() const { return brStan; }
};

class Oblast: public Jedinica {
  void kopiraj (const Oblast& obl);
  void brisi () { delete [] niz; niz=0; }
protected:
  const Jedinica** niz;
  int kap, duz;
public:
  Oblast (const char* naz, int k): Jedinica (naz) {
    niz = new const Jedinica* [kap = k];
    duz = 0;
  }
  Oblast (const Oblast& obl): Jedinica(obl) { kopiraj (obl); }
  ~Oblast () { brisi (); }
  Oblast& operator= (const Oblast& obl) {
    if (this != &obl) { brisi (); Jedinica::operator= (obl); kopiraj (obl); }
    return *this;
  }
  virtual bool moze (const Jedinica& jed) const =0;
  Oblast& operator+= (const Jedinica& jed) {
    if (duz == kap) exit (1);
    if (! moze (jed)) exit (2);
    niz[duz++] = &jed;
    return *this;
  }
  int brojStan () const;
  virtual double povrsina () const = 0;
private:
  void pisi (ostream& it) const;
};

void Oblast::kopiraj (const Oblast& obl){
  niz=new const Jedinica* [kap=obl.kap];
  duz = obl.duz;
  for (int i=0; i<duz; i++) niz[i] = obl.niz[i];
}

int Oblast::brojStan () const {
  int brSt = 0;
  for (int i=0; i<duz; brSt+=niz[i++]->brojStan());
  return brSt;
}

void Oblast::pisi (ostream& it) const {
  Jedinica::pisi (it);
  it << ':' << povrsina() << '[';
  for (int i=0; i<duz; i++) {
    if (i) it << ',';
    it << *niz[i];
  }
  it << ']';
}

class Opstina: public Oblast {
  double povrs;
public:
  Opstina (const char* naziv, double pov, int kap): Oblast (naziv, kap)
    { povrs = pov; }
  char vrsta () const { return 'O'; }
  double povrsina () const { return povrs; }
  bool moze (const Jedinica& jed) const { return jed.vrsta()  == 'N'; }
};

class Okrug: public Oblast {
public:
  Okrug (const char* naziv, int kap): Oblast (naziv, kap) {}
  char vrsta () const { return 'K'; }
  double povrsina () const;
  bool moze (const Jedinica& jed) const { return jed.vrsta()  == 'O'; }
};

double Okrug::povrsina () const {
  double p = 0;
  for (int i=0; i<duz; p+=((Opstina*)niz[i++])->povrsina());
  return p;
}

int main () { Okrug  okr("Okr", 4);
  Opstina o1("O1",7,2), o2("O2",4,2);
  Naselje n1("N1",6), n2("N2",4),
          n3("N3",3), n4("N4",5);
  okr += o1; okr += o2;
  o1  += n1; o1  += n2;
  o2  += n3; o2  += n4;
  cout << okr << endl;
  return 0;
}

Okr:K:18:11[O1:O:10:7[N1:N:6,N2:N:4],O2:O:8:4[N3:N:3,N4:N:5]]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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