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

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

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

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

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

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

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

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

а) Шта представља показивач this, којег је типа и да ли се може користити у статичкој функцији чланици неке класе?

б) Навести редослед активности при конструкцији и деструкцији објеката (основних класа).

в) Којег типа треба да буде аргумент копирајућег конструктора класе X?

г) Шта су специфичности преклапања оператора new и delete? Образложити.


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


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

#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";
  }
}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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