Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО1
Први колоквијум
30. 10. 2009.

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

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

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

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

а) Које варијанте декларација функција су исправне и зашто?

  1. int f(int a=0, int b=0);
  2. int f(int a=0, int b);
  3. int f(int a, int b=0);
  4. int f(int a, int b);

б) Навести неки чест разлог да се пише конструктор копије и деструктор за класу.

в) Шта означава модификатор static за неки атрибут класе? Која је разлика ако не постоји?

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

Написати на језику C++ следеће класе (класе опремити оним конструкторима и деструктором који су потребни за безбедно коришћење класа):

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


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


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

#include <iostream>
using namespace std;

class Prsten {
  int id;
  Prsten( const Prsten&) {}
public:
  explicit Prsten( int iid) { id = iid; }
  int dohvId() const { return id; }
  void pisi() const { cout << id; }
};

class Golub {
public:
  enum Boja {BEAZ, ARAP, MAVIJAN, TEKIR, DARCIN};
private:
  static const char* boje[];
  Prsten* prsten;
  Boja boja; double maxLet;
public:
  Golub( Boja b, double mxLet) { prsten = 0; boja = b; maxLet = mxLet; }
  Golub( const Golub& g) { prsten = 0; boja = g.boja; maxLet = g.maxLet; }
  ~Golub() { delete prsten; }
  Prsten* dohvPrsten() const { return prsten; }
  Boja dohvboju() const { return boja; }
  double dohvMaxLet() const { return maxLet; }
  void postPrsten(Prsten* p) { delete prsten; prsten = p; }
  void pisi() const {
    cout << "G(";
    if (prsten) prsten->pisi(); else cout << '?';
    cout << ',' << boje[boja] << ')';
  }
};

const char* Golub::boje[] = {"Beaz", "Arap", "Mavijan", "Tekir", "Darcin"};

class Golubarnik {
  bool bojaZadata;
  Golub::Boja boja;
  struct Elem {
    Golub* golub;
    Elem* sled;
    Elem( Golub* g) { golub = g; sled = 0; }
    ~Elem() { delete golub; }
  };
  Elem *prvi, *posl;
  Golubarnik( const Golubarnik&) {}
public:
  Golubarnik() { prvi = posl = 0; bojaZadata = false; }
  explicit Golubarnik( Golub::Boja b)
    { prvi = posl = 0; boja = b; bojaZadata = true; }
  ~Golubarnik();
  bool ubaci( Golub* g) {
    if (bojaZadata && g->dohvboju()!=boja) return false;
    posl = (!prvi ? prvi : posl->sled) = new Elem( g);
    return true;
  }
  Golub* rekorder() const;
  void pisi() const;
};

Golubarnik::~Golubarnik() {
  while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; }
}

Golub* Golubarnik::rekorder() const {
  Golub* g = 0; double max = 0;
  for (Elem* tek=prvi; tek; tek=tek->sled)
    if (tek->golub->dohvMaxLet() > max)
      max = (g = tek->golub)->dohvMaxLet();
  return g;
}

void Golubarnik::pisi() const {
  cout << '{';
  for (Elem* tek=prvi; tek; tek=tek->sled) {
    tek->golub->pisi();
    if (tek->sled) cout << ',';
  }
  cout << '}';
}

int main () {
  Golubarnik golubarnik;
  Golub* g = new Golub( Golub::BEAZ, 20);
  g->postPrsten( new Prsten(55));
  golubarnik.ubaci( g);
  g = new Golub( Golub::TEKIR, 25);
  golubarnik.ubaci( g);
  g = new Golub( Golub::ARAP, 25);
  g->postPrsten( new Prsten(32));
  golubarnik.ubaci( g);
  golubarnik.pisi(); cout << endl;
  golubarnik.rekorder()->pisi(); cout << endl;
  return 0;
}

{G(55,Beaz),G(?,Tekir),G(32,Arap)} G(?,Tekir)
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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