|  Ласло Краус | СИ2ОО1 Други колоквијум 12. 12. 2005. | 
|---|
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
dat<<t).
      S, запремина је 4r3π/3 и у датотеку се пише у облику S(r).
      V, запремина је r2πh и у датотеку се пише у облику V(r,h).
      red+=pr; покушај стављања у пун ред прекида програм), да се узме тело са почетка реда (покушај узимања из празног реда прекида програм) и да се садржај реда упише у датотеку (dat<<red) у облику red[t,t,…,t], где су t резултати писања појединих садржаних тела.
    (20 поена) Написати на језику C++ главни програм који направи ред капацитета који прочита са главног улаза, чита разноврсна тела са главног улаза и ставља их у ред све док се ред не напуни, испише садржај реда на главном излазу, узимајући тела из реда док се ред не испразни израчуна средњу запремину свих тела у реду, испише добијени резултат на главном излазу и понавља претходне кораке док за капацитет реда не прочита недозвољену вредност.
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Које особине стандардних оператора се подразумевају при њиховом преклапању?
б) Навести два начина кориснички дефинисане конверзије и основне разлике између њих?
в) У чему је разлика између јавног и приватног извођења и којој релацији је слично приватно извођење?
г) Ако основна класа садржи један низ објеката, а изведена други низ – навести презизан редослед конструкције објекта изведене класе.
д) Који проблеми се појављују при вишеструком извођењу и како се решавају?
#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;
}
  
  
    Copyright © 2010, Laslo Kraus
    Последња ревизија: 30.8.2010.