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

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

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

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

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

а) Попунити следећу табелу знаком + за дозвољено и знаком − за недозвољено:

дефиниција
пре и декларације и дефиниције класе после декларације, пре дефиниције класе после дефиниције класе
објекта      
показивача на објекат      

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

в) Да ли је механизам преклапања операторских функција у језику C++ статички или динамички и зашто?

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

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

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


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


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

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

class Vekt {
  double x, y, z;
  double int2() const { return x*x + y*y + z*z; }
public:
  explicit Vekt(double a=0, double b=0, double c=0)
    { x = a; y = b; z = c; }
  friend bool operator<(const Vekt& v1, const Vekt& v2)
    { return v1.int2() < v2.int2(); }
  friend bool operator==(const Vekt& v1, const Vekt& v2)
    { return v1.int2() == v2.int2(); }
  friend Vekt operator+(const Vekt& v1, const Vekt& v2)
    { return Vekt(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z);}
  friend Vekt operator*(double s, const Vekt& v)
    { return Vekt(s*v.x, s*v.y, s*v.z); }
  Vekt& operator+=(const Vekt& v2) { return *this = *this + v2; }
  friend ostream& operator<<(ostream& it, const Vekt&v)
    { return it << '(' << v.x << ',' << v.y << ',' << v.z << ')'; }
};

class Cest {
  Vekt r, v;
public:
  explicit Cest(const Vekt& rr=Vekt(), const Vekt& vv=Vekt()): r(rr), v(vv){}
  Vekt polozaj() const { return r; }
  Vekt brzina() const { return v; }
  Cest& operator<<=(double t) { r += t * v; return *this; }
  friend ostream& operator<<(ostream& it, const Cest& c)
    { return it << '[' << c.r << '|' << c.v << ']'; }
};

class Oblak {
  char* ime;
  Cest* niz; int kap, duz;
  void kopiraj(const Oblak& obl);
  void brisi() { delete [] ime; delete [] niz; }
public:
  explicit Oblak(const char* i, int k=10){
    ime = new char [strlen(i) + 1];
    strcpy(ime, i);
    niz = new Cest [kap = k]; duz = 0;
  }
  Oblak(const Oblak& obl) {kopiraj(obl);}
  ~Oblak() { brisi(); }
  Oblak& operator=(const Oblak& obl) {
    if (this != &obl) { brisi(); kopiraj(obl); }
    return *this;
  }
  int brCest() const { return duz; }
  Oblak& operator+=(const Cest& cest);
  const Cest& operator[](int i) const {
    if (i<0 && i>=duz) exit(2);
    return niz[i];
  }
  Oblak& operator<<=(double t);
  friend ostream& operator<<(ostream& it, const Oblak& obl);
};

void Oblak::kopiraj(const Oblak& obl) {
  ime = new char [strlen(obl.ime) + 1];
  strcpy(ime, obl.ime);
  niz = new Cest [kap = obl.kap];
  duz = obl.duz;
  for (int i=0; i<duz; i++) niz[i] = obl.niz[i];
}

Oblak& Oblak::operator+=(const Cest& cest)
{
  if (duz == kap) exit(1);
  int i = duz-1;
  while (i>=0 && cest.polozaj()<niz[i].polozaj())
    { niz[i+1] = niz[i]; i--; }
  niz[i+1] = cest; duz++;
  return *this;
}

Oblak& Oblak::operator<<=(double t) {
  for (int i=0; i<duz; niz[i++]<<=t);
  for (int i=0; i<duz-1; i++)
    for (int j=i+1; j<duz; j++)
      if (niz[j].polozaj() < niz[i].polozaj())
        { Cest c = niz[i]; niz[i] = niz[j]; niz[j] = c; }
  return *this;
}

ostream& operator<<(ostream& it, const Oblak& obl) {
  it << obl.ime << endl;
  for (int i=0; i<obl.duz; it<<obl.niz[i++]<<endl);
  return it;
}

int main() {
  Oblak obl("Oblak");
  obl += Cest(Vekt(3,0,0), Vekt(0,2,0));
  obl += Cest(Vekt(0,1,0), Vekt(0,0,1));
  obl += Cest(Vekt(0,0,2), Vekt(0,1,0));
  obl += Cest(Vekt(3,4,12), Vekt(-.3,-.4,-1.2));
  obl += Cest(Vekt(), Vekt(1,0,0));
  cout << obl;
  cout << endl << (obl<<=10);
  return 0;
}

Oblak [(0,0,0)|(1,1,1)] [(0,1,0)|(0,0,2)] [(0,0,2)|(0,1,0)] [(3,0,0)|(0,2,0)] [(3,4,12)|(-0.3,-0.4,-1.2)] Oblak [(0,0,0)|(-0.3,-0.4,-1.2)] [(0,10,2)|(0,1,0)] [(10,10,10)|(1,1,1)] [(0,1,20)|(0,0,2)] [(3,20,0)|(0,2,0)]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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