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

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

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

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

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

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

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

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

а) Које особине стандардних оператора се подразумевају при њиховом преклапању?

б) Навести два начина кориснички дефинисане конверзије и основне разлике између њих?

в) У чему је разлика између јавног и приватног извођења и којој релацији је слично приватно извођење?

г) Ако основна класа садржи један низ објеката, а изведена други низ – навести презизан редослед конструкције објекта изведене класе.

д) Који проблеми се појављују при вишеструком извођењу и како се решавају?


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


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

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

class Telo {
public:
  virtual ~Telo () {}
  virtual char vrsta () const =0;
  virtual double V () const =0;
  virtual Telo* kopija () const =0;
private:
  virtual void pisi (ostream&) const =0;
  friend ostream& operator<< (ostream& d, const Telo& t) { t.pisi (d); return d; }
};

class Sfera: public Telo {
  double r;
public:
  Sfera (double rr=1) { r = rr; }
  char vrsta () const { return 'S'; }
  double V () const { return 4 * r*r*r * 3.14159 / 3; }
  Sfera* kopija () const { return new Sfera (*this); }
private:
  void pisi (ostream& d) const { d << "S(" << r << ')'; }
};

class Valjak: public Telo {
  double r, h;
public:
  Valjak (double rr=1, double hh=1) { r = rr; h = hh;}
  char vrsta () const { return 'V'; }
  double V () const { return r*r * 3.14159 * h; }
  Valjak* kopija () const { return new Valjak (*this); }
private:
  void pisi (ostream& d) const { d << "V(" << r << ',' << h << ')'; }
};

class Red {
  Telo** niz; int kap, prvi, posl, duz;
  void kopiraj (const Red&);
  void brisi ();
public:
  explicit Red (int k=5);
  Red (const Red& r) { kopiraj (r); }
  ~Red () { brisi (); }
  Red& operator= (const Red& r) {
    if (this != &r) { brisi (); kopiraj (r); }
    return *this;
  }
  bool pun () { return duz == kap; }
  bool prazan () { return duz == 0; }
  Red& operator+= (const Telo& t) {
    if (duz == kap) exit (1);
    niz[posl++] = t.kopija ();
    duz++;
    if (posl == kap) posl = 0;
    return *this;
  }

  Telo* uzmi () {
    if (duz == 0) exit (2);
    Telo* t = niz[prvi];
    niz[prvi++] = 0;
    duz--;
    if (prvi == kap) prvi = 0;
    return t;
  }
  friend ostream& operator<< (ostream&, const Red&);
};

Red::Red (int k) {
  niz = new Telo* [kap = k];
  for (int i=0; i<kap; niz[i++]=0);
  prvi = posl = duz = 0;
}

void Red::kopiraj (const Red& r) {
  niz = new Telo* [kap = r.kap];
  for (int i=0; i<kap; i++)
    niz[i] = r.niz[i] ? r.niz[i]->kopija () : 0;
  prvi = r.prvi;
  posl = r.posl;
  duz  = r.duz;
}

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

ostream& operator<< (ostream& d, const Red& r) {
  d << "red[";
  for (int i=0; i<r.duz; i++) {
    if (i) d << ',';
    d << *r.niz[(r.prvi+i)%r.kap];
  }
  return d << ']';
}

int main () {
  while (true) {
    cout << "kap? "; int k; cin >> k;
  if (k <= 0) break;
    Red red (k);
    while (! red.pun ()) {
      cout << "Vrsta (S,V)? "; char vr; cin >> vr;
      double r, h;
      switch (vr) {
        case 's': case 'S':
          cout << "r? "; cin >> r;
          red += Sfera (r);
          break;
        case 'v': case 'V':
          cout << "r,h? "; cin >> r >> h;
          red += Valjak (r, h);
          break;
      }
    }
    cout << red << endl;
    double V = 0; int n = 0;
    while (! red.prazan ()) {
      Telo* t = red.uzmi ();
      V += t->V (); n++;
      delete t;
    }
    if (n) V /= n;
    cout << "Vsr= " << V << endl;
  }
  return 0;
}

         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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