Ласло Краус |
ИР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
) у облику K
id[
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.