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.