Ласло Краус |
СИ2ОО1 Први колоквијум 30. 10. 2009. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Које варијанте декларација функција су исправне и зашто?
int f(int a=0, int b=0);
int f(int a=0, int b);
int f(int a, int b=0);
int f(int a, int b);
б) Навести неки чест разлог да се пише конструктор копије и деструктор за класу.
в) Шта означава модификатор static за неки атрибут класе? Која је разлика ако не постоји?
Написати на језику C++ следеће класе (класе опремити оним конструкторима и деструктором који су потребни за безбедно коришћење класа):
Beaz, Arap, Mavijan, Tekir, Darcin. При клонирању (стварању копије) голуба, задржава се само боја оригинала и трајање најдужег лета, али не и прстен. Голуб може да се исписује на главном излазу у облику G(прстен,боја). Ако не постоји прстен, пише се "?". Боја се исписује речима.
{голуб1,голуб2,…}.
(10 поена) Написати на језику C++ програм који направи голубарник са неколико голубова од којих неки имају прстење, а затим испише на главном излазу формирани голубарник и голуба рекордера. Није потребно учитавати податке са главног улаза.
#include <iostream>
using namespace std;
class Prsten {
int id;
Prsten( const Prsten&) {}
public:
explicit Prsten( int iid) { id = iid; }
int dohvId() const { return id; }
void pisi() const { cout << id; }
};
class Golub {
public:
enum Boja {BEAZ, ARAP, MAVIJAN, TEKIR, DARCIN};
private:
static const char* boje[];
Prsten* prsten;
Boja boja; double maxLet;
public:
Golub( Boja b, double mxLet) { prsten = 0; boja = b; maxLet = mxLet; }
Golub( const Golub& g) { prsten = 0; boja = g.boja; maxLet = g.maxLet; }
~Golub() { delete prsten; }
Prsten* dohvPrsten() const { return prsten; }
Boja dohvboju() const { return boja; }
double dohvMaxLet() const { return maxLet; }
void postPrsten(Prsten* p) { delete prsten; prsten = p; }
void pisi() const {
cout << "G(";
if (prsten) prsten->pisi(); else cout << '?';
cout << ',' << boje[boja] << ')';
}
};
const char* Golub::boje[] = {"Beaz", "Arap", "Mavijan", "Tekir", "Darcin"};
class Golubarnik {
bool bojaZadata;
Golub::Boja boja;
struct Elem {
Golub* golub;
Elem* sled;
Elem( Golub* g) { golub = g; sled = 0; }
~Elem() { delete golub; }
};
Elem *prvi, *posl;
Golubarnik( const Golubarnik&) {}
public:
Golubarnik() { prvi = posl = 0; bojaZadata = false; }
explicit Golubarnik( Golub::Boja b)
{ prvi = posl = 0; boja = b; bojaZadata = true; }
~Golubarnik();
bool ubaci( Golub* g) {
if (bojaZadata && g->dohvboju()!=boja) return false;
posl = (!prvi ? prvi : posl->sled) = new Elem( g);
return true;
}
Golub* rekorder() const;
void pisi() const;
};
Golubarnik::~Golubarnik() {
while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; }
}
Golub* Golubarnik::rekorder() const {
Golub* g = 0; double max = 0;
for (Elem* tek=prvi; tek; tek=tek->sled)
if (tek->golub->dohvMaxLet() > max)
max = (g = tek->golub)->dohvMaxLet();
return g;
}
void Golubarnik::pisi() const {
cout << '{';
for (Elem* tek=prvi; tek; tek=tek->sled) {
tek->golub->pisi();
if (tek->sled) cout << ',';
}
cout << '}';
}
int main () {
Golubarnik golubarnik;
Golub* g = new Golub( Golub::BEAZ, 20);
g->postPrsten( new Prsten(55));
golubarnik.ubaci( g);
g = new Golub( Golub::TEKIR, 25);
golubarnik.ubaci( g);
g = new Golub( Golub::ARAP, 25);
g->postPrsten( new Prsten(32));
golubarnik.ubaci( g);
golubarnik.pisi(); cout << endl;
golubarnik.rekorder()->pisi(); cout << endl;
return 0;
}
{G(55,Beaz),G(?,Tekir),G(32,Arap)}
G(?,Tekir)
(⇒ почетак)
Copyright © 2011, Laslo Kraus
Последња ревизија: 4.11.2011.