Ласло Краус |
ИР2ОО1 Колоквијум 21. 11. 2009. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Које су карактеристике аутоматски генерисаног подразумеваног конструктора? Када он постоји?
б) Да ли се у свим функцијама чланицама може користити показивач this? Образложити.
в) Да ли се у наредби X x=100; позива operator=(int) или конструктор X(int) и зашто?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
boja1==boja2) и да се боја упише у излазни ток (it<<boja) у облику (таласна_дужина,засићење,интензитет).
krug1==krug2), да се испита да ли је један круг мањи од другог (krug1<krug2) и да се круг упише у излазни ток (it<<krug) у облику Kid[r,боја].
niz+=krug; препуњавање низа прекида програм). Може да се дохвати капацитет низа и број попуњених места, да се дохвати круг са задатим редним бројем (niz[ind]; индекс изван опсега прекида програм), да се дохвати адреса првог круга задате боје (niz[boja]; резултат је 0 ако нема таквог круга) и да се садржај низа упише у излазни ток (it<<niz), један круг по реду.
(10 поена) Написати на језику C++ програм који направи и попуни један низ обојених кругова, испише низ на главном излазу, проналази најмањи круг задате боје у низу и испише пронађени круг на главном излазу. Користити фиксне параметре (не треба ништа учитавати с главног улаза).
#include <iostream>
#include <cstdlib>
using namespace std;
class Boja {
float lambda, zasicen, intenz;
public:
explicit Boja(float l=380, float z=1, float i=100) { lambda=l; zasicen=z; intenz=i; }
friend bool operator== (const Boja& b1, const Boja& b2)
{ return b1.lambda==b2.lambda && b1.zasicen==b2.zasicen && b1.intenz==b2.intenz; }
friend ostream& operator<<( ostream&it, const Boja& b)
{ return it << '(' << b.lambda << ',' << b.zasicen << ',' << b.intenz << ')'; }
};
class Krug {
double r;
Boja b;
static int ukId;
int id;
public:
explicit Krug(double rr=1, const Boja&bb=Boja(255,0,0)): b(bb)
{ r = rr; id = ++ukId;}
Krug(const Krug& k) { r = k.r; b = k.b; id = ++ukId;}
Krug& operator=(const Krug& k) { r = k.r; b = k.b; return *this; }
Boja boja() const { return b; }
double P() const { return r*r*3.14159; }
friend bool operator==(const Krug& k1, const Krug& k2) { return k1.r == k2.r; }
friend bool operator<(const Krug& k1, const Krug& k2) { return k1.r < k2.r; }
friend ostream& operator<<(ostream& it, const Krug& k)
{ return it << 'K' << k.id << '[' << k.r << ',' << k.b << ']'; }
};
int Krug::ukId = 0;
class Niz {
Krug* niz; int kap, duz;
void kopiraj(const Niz& nk);
void brisi() {delete [] niz; }
Krug* nadji(const Boja& b) const;
public:
explicit Niz(int k=10) { niz = new Krug [kap = k]; duz = 0; }
Niz(const Niz& nk) { kopiraj(nk); }
~Niz() { brisi(); }
Niz& operator=(const Niz&nk) {
if (this != &nk) { brisi(); kopiraj(nk); }
return *this;
}
int kapacitet() const { return kap; }
int duzina() const { return duz; }
Niz& operator+=(const Krug& k) {
if (duz == kap) exit( 1);
niz[duz++] = k;
return *this;
}
Krug& operator[](int ind) {
if (ind<0 || ind>=duz) exit(2);
return niz[ind];
}
const Krug& operator[](int ind) const{
if (ind<0 || ind>=duz) exit(2);
return niz[ind];
}
Krug* operator[](const Boja& b) { return nadji(b); }
const Krug* operator[](const Boja& b) const { return nadji(b); }
friend ostream& operator<<(ostream& it, const Niz& nk);
};
void Niz::kopiraj(const Niz& nk) {
niz = new Krug [kap = nk.kap];
duz = nk.duz;
for (int i=0; i<duz; i++) niz[i] = nk.niz[i];
}
Krug* Niz::nadji(const Boja& b) const {
int i = 0; while (i<duz && !(niz[i].boja()==b)) i++;
return i<duz ? niz+i : 0;
}
ostream& operator<<(ostream& it, const Niz& nk) {
for (int i=0; i<nk.duzina(); it<<nk[i++]<<endl);
return it;
}
int main() {
Niz nk(5);
nk += Krug(3, Boja());
nk += Krug(5, Boja(500,0.5f,35));
nk += Krug(2, Boja(600,0.2f,10));
nk += Krug(4, Boja(500,0.5f,35));
nk += Krug(1, Boja());
cout << nk << endl;
Krug* pk = nk[Boja(500,0.5f,35)];
cout << "prvi: ";
if (pk) cout << *pk << endl;
else cout << "nema!\n";
int imin = -1;
double min;
for (int i=0; i<nk.duzina(); i++)
if (imin==-1 || nk[i].P()< min)
{ imin = i; min = nk[i].P(); }
cout << "min: " << nk[imin] << endl;
return 0;
}
K1[3,(380,1,100)]
K2[5,(500,0.5,35)]
K3[2,(600,0.2,10)]
K4[4,(500,0.5,35)]
K5[1,(380,1,100)]
prvi: K2[5,(500,0.5,35)]
min: K5[1,(380,1,100)]
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 26.11.2010.