Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО1
Колоквијум
21. 11. 2009.

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

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

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

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

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

б) Да ли се у свим функцијама чланицама може користити показивач this? Образложити.

в) Да ли се у наредби X x=100; позива operator=(int) или конструктор X(int) и зашто?

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

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

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


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


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

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

class Boja {
  float lambda, zasicen, intenz;

public:
  explicit Boja(float l=380, float z=1, float i=100) { lambda=l; zasicen=z; intenz=i; }

  friend bool operator== (const Boja& b1, const Boja& b2)
    { return b1.lambda==b2.lambda && b1.zasicen==b2.zasicen && b1.intenz==b2.intenz; }

  friend ostream& operator<<( ostream&it, const Boja& b)
    { return it << '(' << b.lambda << ',' << b.zasicen << ',' << b.intenz << ')'; }
};

class Krug {
  double r;
  Boja b;
  static int ukId;
  int id;

public:
  explicit Krug(double rr=1, const Boja&bb=Boja(255,0,0)): b(bb)
    { r = rr; id = ++ukId;}

  Krug(const Krug& k) { r = k.r; b = k.b; id = ++ukId;}

  Krug& operator=(const Krug& k) { r = k.r; b = k.b; return *this; }

  Boja boja() const { return b; }

  double P() const { return r*r*3.14159; }

  friend bool operator==(const Krug& k1, const Krug& k2) { return k1.r == k2.r; }

  friend bool operator<(const Krug& k1, const Krug& k2) { return k1.r < k2.r; }

  friend ostream& operator<<(ostream& it, const Krug& k)
    { return it << 'K' << k.id << '[' << k.r << ',' << k.b << ']'; }
};

int Krug::ukId = 0;

class Niz {
  Krug* niz; int kap, duz;

  void kopiraj(const Niz& nk);

  void brisi() {delete [] niz; }

  Krug* nadji(const Boja& b) const;

public:
  explicit Niz(int k=10) { niz = new Krug [kap = k]; duz = 0; }

  Niz(const Niz& nk) { kopiraj(nk); }

  ~Niz() { brisi(); }

  Niz& operator=(const Niz&nk) {
    if (this != &nk) { brisi(); kopiraj(nk); }
    return *this;
  }

  int kapacitet() const { return kap; }

  int duzina() const { return duz; }

  Niz& operator+=(const Krug& k) {
    if (duz == kap) exit( 1);
    niz[duz++] = k;
    return *this;
  }

  Krug& operator[](int ind) {
    if (ind<0 || ind>=duz) exit(2);
    return niz[ind];
  }

  const Krug& operator[](int ind) const{
    if (ind<0 || ind>=duz) exit(2);
    return niz[ind];
  }

  Krug* operator[](const Boja& b) { return nadji(b); }

  const Krug* operator[](const Boja& b) const { return nadji(b); }

  friend ostream& operator<<(ostream& it, const Niz& nk);
};

void Niz::kopiraj(const Niz& nk) {
  niz = new Krug [kap = nk.kap];
  duz = nk.duz;
  for (int i=0; i<duz; i++) niz[i] = nk.niz[i];
}

Krug* Niz::nadji(const Boja& b) const {
  int i = 0; while (i<duz && !(niz[i].boja()==b)) i++;
  return i<duz ? niz+i : 0;
}

ostream& operator<<(ostream& it, const Niz& nk) {
  for (int i=0; i<nk.duzina(); it<<nk[i++]<<endl);
  return it;
}

int main() {
  Niz nk(5);
  nk += Krug(3, Boja());
  nk += Krug(5, Boja(500,0.5f,35));
  nk += Krug(2, Boja(600,0.2f,10));
  nk += Krug(4, Boja(500,0.5f,35));
  nk += Krug(1, Boja());
  cout << nk << endl;
  Krug* pk = nk[Boja(500,0.5f,35)];
  cout << "prvi: ";
  if (pk) cout << *pk << endl;
    else cout << "nema!\n";
  int imin = -1;
  double min;
  for (int i=0; i<nk.duzina(); i++)
    if (imin==-1 || nk[i].P()< min)
      { imin = i; min = nk[i].P(); }
    cout << "min: " << nk[imin] << endl;
  return 0;
}

K1[3,(380,1,100)] K2[5,(500,0.5,35)] K3[2,(600,0.2,10)] K4[4,(500,0.5,35)] K5[1,(380,1,100)] prvi: K2[5,(500,0.5,35)] min: K5[1,(380,1,100)]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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