Ласло Краус |
СИ2ОО1 Други колоквијум 29. 11. 2013. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли се у језику C++ може дефинисати операторска функција као метода класе X, са следећом декларацијом: X operator/();? Образложити.
б) Који је редослед извршавања деструктора при деструкцији објекта изведене класе, ако и изведена и основна класа садрже атрибуте (податке чланове)?
в) Шта је операнд, а шта резултат оператора typeid?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
~dom), да се одреди да ли су две домине једнаке (dom1==dom2) не водећи рачуна о редоследу поља и да се домина упише у излазни ток (it<<dom) у облику (a,b).
skup+=dom). Повратна вредност при додавању представља индикатор успеха. Може да се испита да ли се нека домина налази у скупу и да се скуп упише у излазни ток (it<<skup) уписивањем садржаних домина.
uzmi(dom); повратна вредност је индикатор успеха). Библиотечка функција rand() при сваком позивању даје случајан цео број у опсегу [0,RAND_MAX].
(10 поена) Написати на језику C++ програм који направи једну кутију и једну таблу, напуни кутију за фиксно одабрани параметар n, испише кутију на главном излазу, узима домине из кутије и ставља их на таблу све док може и испише завршни садржај табле на главном излазу.
#include <iostream>
#include <cstdlib>
using namespace std;
class Domina { int a, b;
public:
Domina() { a = b = 0; }
Domina(int p, int q) { a = p; b = q; }
int A() const { return a; }
int B() const { return b; }
Domina& operator~() { int c = a; a = b; b = c; return *this; }
bool operator==(const Domina& d) const
{ return a==d.a && b==d.b || b==d.a && a==d.b; }
friend ostream& operator<<(ostream& it, const Domina& d)
{ return it << '(' << d.a << ',' << d.b << ')'; }
};
class Skup {
protected:
struct Elem {
Domina dom; Elem* sled;
Elem(const Domina& d, Elem* s=0) : dom(d) { sled = s; }
};
Elem *prvi, *posl;
private:
void kopiraj(const Skup& s);
void brisi();
public:
Skup() { prvi = posl = 0; }
Skup(const Skup& s) { kopiraj(s); }
virtual ~Skup() { brisi(); }
Skup& operator=(const Skup& s) {
if (this != &s) { brisi(); kopiraj(s); }
return *this;
}
bool ima(const Domina& d) const;
virtual bool operator+= (const Domina& d) =0;
friend ostream& operator<<(ostream& it, const Skup& s);
};
void Skup::kopiraj(const Skup& s) {
prvi = posl = 0;
for (Elem* tek=s.prvi; tek; tek=tek->sled)
posl = (!prvi ? prvi : posl->sled) = new Elem(tek->dom);
}
void Skup::brisi() {
while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; }
}
bool Skup::ima(const Domina& d) const {
for (Elem *tek=prvi; tek; tek=tek->sled)
if (d == tek->dom) return true;
return false;
}
ostream& operator<<(ostream& it, const Skup& s) {
for (Skup::Elem* tek=s.prvi; tek; tek=tek->sled) it << tek->dom;
return it;
}
class Kutija: public Skup {
public:
bool operator+=(const Domina& d) {
if (ima(d)) return false;
posl = (!prvi ? prvi : posl->sled) = new Elem(d);
return true;
}
Kutija& napuni (int n);
bool uzmi(Domina& d) {
if (!prvi) false;
d = prvi->dom;
Elem* stari = prvi; prvi = prvi->sled; delete stari;
if (!prvi) posl = 0;
return true;
}
};
Kutija& Kutija::napuni (int n) {
prvi = posl = 0;
int m = n * (n+1) / 2;
for (int i=0; i<m;)
if (*this += Domina ((int)(rand()/(RAND_MAX+1.)*n),
(int)(rand()/(RAND_MAX+1.)*n)))
i++;
return *this;
}
class Tabla: public Skup {
public:
bool operator+=(const Domina& d) {
if (ima(d)) return false;
if (!prvi || d.B()==prvi->dom.A()) naPocetak(d);
else if (d.A() == posl->dom.B()) naKraj(d);
else {
Domina e(d); ~e;
if (e.B() == prvi->dom.A()) naPocetak(e);
else if (e.A() == posl->dom.B()) naKraj(e);
else return false;
}
return true;
}
private:
void naPocetak(const Domina& d) {
prvi = new Elem (d, prvi);
if (!posl) posl = prvi;
}
void naKraj(const Domina& d) {
posl = (!prvi ? prvi : posl->sled) = new Elem(d);
}
};
int main() {
int n = 4;
Kutija k; k.napuni(n);
cout << "Kutija: " << k << endl;
Tabla t; Domina d;
while (k.uzmi(d) && (t+=d));
cout << "Tabla : " << t << endl;
}
Kutija: (2,0)(3,0)(1,2)(3,1)(2,3)(2,2)(0,1)(0,0)(1,1)(3,3)
Tabla : (2,2)(2,3)(3,1)(1,2)(2,0)(0,3)
(⇒ почетак)
Copyright © 2013, Laslo Kraus
Последња ревизија: 30.11.2013.