|  Ласло Краус | ИР2ОО1 Први колоквијум 11. 12. 2004. | 
|---|
Пројектовати на језику C++ следећи систем класа (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни):
k1<k2), да се димензије купе прочитају из датотеке (dat>>k) и да се купа уписује у датотеку (dat<<k) у облику K(r1,r2,h).
      niz+=k), док се низ не напуни (ако се низ препуни, програм се прекида). Може да се дохвата капацитет низа, број попуњених места и може да се испита да ли је низ попуњен до краја. Купе садржане у низу могу да се дохватају (niz[i]) и да се проналази индекс купе најмање запремине (!niz).
    (20 поена) Саставити на језику C++ главни програм који са главног улаза прочита низ зарубљених купа, проналази купу најмање запремине у низу, испише пронађену купу и њену запремину на главном излазу и понавља претходне кораке док за дужину низа не прочита недозвољену вредност.
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Шта представља показивач this, којег је типа и да ли се може користити у статичкој функцији чланици неке класе?
б) Навести редослед активности при конструкцији и деструкцији објеката (основних класа).
в) Којег типа треба да буде аргумент копирајућег конструктора класе X?
г) Шта су специфичности преклапања оператора new и delete? Образложити.
#include <iostream>
#include <cstdlib>
using namespace std;
class Kupa {
  double r1, r2, h;
public:
  explicit Kupa (double rr1=2, double rr2=1, double hh=1)
    { r1 = rr1; r2 = rr2; h = hh; }
  double R1 () const { return r1; }
  double R2 () const { return r2; }
  double H  () const { return h;  }
  double V  () const { return 3.14159 * h * (r1*r1 + r2*r2 + r1*r2); }
  bool operator< (const Kupa& k2) const { return V () < k2.V (); }
  friend istream& operator>> (istream& d, Kupa& k)
    { return d >> k.r1 >> k.r2 >> k.h; }
  friend ostream& operator<< (ostream& d, const Kupa& k)
    { return d << "K(" << k.r1 << ',' << k.r2 << ',' << k.h << ')'; }
};
class Niz {
  int kap, duz; Kupa* kupe;
  void kopiraj (const Niz&);
  void brisi() { delete [] kupe; }
public:
  explicit Niz (int k=5) {
    kupe = new Kupa [kap = k];
    duz = 0;
  }
  Niz (const Niz& niz) { kopiraj (niz); }
  ~Niz () { brisi (); }
  Niz& operator= (const Niz& niz) {
    if (this != &niz) { brisi (); kopiraj (niz); }
    return *this;
  }
  Niz& operator+= (const Kupa& k) {
    if (duz == kap) exit (1);
    kupe[duz++] = k;
    return *this;
  }
  int uzmiKap () const { return kap; }
  int uzmiDuz () const { return duz; }
  bool pun    () const { return duz == kap; }
  Kupa& operator[] (int i) {
    if (i<0 || i>=duz) exit (2);
    return kupe[i];
  }
  const Kupa& operator[] (int i) const {
    if (i<0 || i>=duz) exit (2);
    return kupe[i];
  }
  int operator! () const;
};
void Niz::kopiraj (const Niz& niz) {
  kupe = new Kupa [kap = niz.kap];
  duz = niz.duz;
  for (int i=0; i<duz; i++) kupe[i] = niz.kupe[i];
}
int Niz::operator! () const {
  if (! duz) return -1;
  Kupa min = kupe[0];
  int imin = 0;
  for (int i=0; i<duz; i++)
    if (kupe[i] < min) { min = kupe[i]; imin = i; }
  return imin;
}
int main () {
  while (true) {
    cout << "n? "; int n; cin >> n;
  if (n <= 0) break;
    Niz niz (n);
    for (int i=0; i<n; i++) {
      cout << "kupa[" << i << "]? ";
      Kupa k; cin >> k; niz += k;
    }
    int imin = !niz;
    cout << "min= " << niz[imin] << " (" << niz[imin].V() << ")\n\n";
  }
}
  (⇒ почетак)
  
  
    Copyright © 2010, Laslo Kraus
    Последња ревизија: 30.8.2010.