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

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

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

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

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

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

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

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

а) Објаснити зашто наведена конструкција није исправна:

      class A { int i; public: A(int ii){i=ii;} };
      class B: public A { int j; public: B(int jj){j=jj;} };

б) Да ли конструктор може бити виртуелна функција и зашто?

в) Да ли виртуелна метода може да промени throw() листу методе из базне класе и како?


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


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

#include <iostream>
using namespace std;

///////////////////////////// Nije deo resenja ////////////////////////////////////
                                                                                ///
class Vektor {                                                                  ///
  double vx, vy, vz;                                                            ///
public:                                                                         ///
  Vektor (double xv=1,double yv=0,double zv=0) { vx = xv; vy = yv, vz = zv; }   ///
  friend ostream& operator<< (ostream& d, const Vektor& v)                      ///
    { return d << '[' << v.vx << ',' << v.vy << ',' << v.vz << ']'; }           ///
};                                                                              ///
                                                                                ///
class Tacka {                                                                   ///
  double x, y, z;                                                               ///
public:                                                                         ///
  Tacka (double xx=0,double yy=0,double zz=0) { x = xx; y = yy, z = zz; }       ///
  friend ostream& operator<< (ostream& d, const Tacka& t)                       ///
    { return d << '(' << t.x << ',' << t.y << ',' << t.z << ')'; }              ///
};                                                                              ///
                                                                                ///
///////////////////////////// Nije deo resenja ////////////////////////////////////

class Element {
  Tacka t;
public:
  Element (const Tacka& tt): t (tt) {}
  virtual ~Element () {}
  virtual Element* kopija () const =0;
  Element& premesti (const Tacka& tt) { t = tt; return *this; }
  virtual double V () const =0;
protected:
  virtual void pisi (ostream& d) const {d<<t;}
  friend ostream& operator<< (ostream& d, const Element& e) { e.pisi (d); return d; }
};

class Sfera: public Element {
  double r;
  void pisi (ostream& d) const { d << "S{"; Element::pisi (d); d << ',' << r  << '}'; }
public:
  Sfera (const Tacka& tt, double rr) : Element (tt) { r = rr; }
  Sfera* kopija () const { return new Sfera (*this); }
  double V () const { return 4 * r*r*r * 3.14159 / 3; }
};

class OElement: public Element {
  Vektor v;
public:
  OElement (const Tacka& tt, const Vektor& vv) : Element (tt), v (vv) {}
  OElement& okreni (const Vektor& vv) { v = vv; return *this; }
protected:
  void pisi (ostream& d) const { Element::pisi (d); d << v; }
};

class Valjak: public OElement {
  double r, h;
  void pisi (ostream& d) const
    { d << "V{"; OElement::pisi (d); d << ',' << r << ',' << h << '}'; }
public:
  Valjak (const Tacka& tt, const Vektor& vv, double rr, double hh) : OElement (tt, vv)
    { r = rr; h = hh; }
  Valjak* kopija () const { return new Valjak (*this); }
  double V () const { return r*r*3.14159*h; }
};

class GStrPuna {};

ostream& operator<< (ostream& d, const GStrPuna&) { return d << "*** Struktura je puna!\n"; }

class Struktura: public OElement {
  Element** niz; int kap, duz;
  void kopiraj (const Struktura&);
  void brisi ();
  void pisi (ostream&) const;
public:
  explicit Struktura (const Tacka& t, const Vektor& v, int k=5): OElement (t, v)
    { niz = new Element* [kap = k]; duz = 0; }
  Struktura (const Struktura& s): OElement (s) { kopiraj (s); }
  ~Struktura () { brisi (); }
  Struktura& operator= (const Struktura& s) {
    if (this != &s) { brisi (); OElement::operator= (s); kopiraj (s); }
    return *this;
  }
  Struktura* kopija () const { return new Struktura (*this); }
  Struktura& operator+= (const Element& e) {
    if (duz == kap) throw GStrPuna ();
    niz[duz++] = e.kopija ();
    return *this;
  }
  double V () const;
};

void Struktura::kopiraj (const Struktura& s) {
  niz = new Element* [kap=s.kap]; duz = s.duz;
  for (int i=0; i<duz; i++) niz[i] = s.niz[i]->kopija ();
}

void Struktura::brisi () {
  for (int i=0; i<duz; delete niz[i++]);
  delete [] niz;
}

void Struktura::pisi (ostream& d) const {
  d << '<'; OElement::pisi (d);
  for (int i=0;i<duz;i++) d << ',' << *niz[i];
  d << '>';
}

double Struktura::V () const {
  double v = 0;
  for (int i=0; i<duz; v+=niz[i++]->V());
  return v;
}

int main () {
  try {
    Struktura s1 (Tacka(1,2,3), Vektor(), 10);
    s1 += Sfera (Tacka(1,1), 3);
    s1 += Valjak (Tacka(2,0,3), Vektor(-2,0,5), 1, 3);
    Struktura s2 (Tacka(-1,-2,-3), Vektor(-1), 5);
    s2 += Sfera (Tacka(5), 1);
    s2 += Valjak (Tacka(), Vektor(0,-2), 3,2);
    s1 += s2;
    cout << s1 << " V=" << s1.V() << endl;
  } catch (GStrPuna g) { cout << g << endl; }
  return 0;
}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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