Ласло Краус |
ИР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.