Ласло Краус |
ИР2ОО1 Први колоквијум 1. 12. 2007. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) У којим ситуацијама има смисла да функција буде непосредно уграђена у код и на које начине се то може постићи код метода класе?
б) Да ли се у методи класе X, која је пријатељска метода класe Y, може директним именовањем приступати заштићеним и приватним члановима класе Y? Зашто?
в) Како се преклапају операторске функције аутоинкрементирања и аутодекрементирања? Навести декларације одговарајућих функција.
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке прекидају програм):
~dom
), да се одреди да ли су две домине једнаке (dom1==dom2
; при чему су домине (p1,p2) и (p2,p1) једнаке), да се домина прочита из улазног тока (ut>>dom
) и да се упише у излазни ток (it<<dom
) у облику (
p1,
p2)
где су p1 и p2 поља домине.
tab+=dom
) на одговарајућем крају уз окретање домина по потреби. Може да се дохвати број домина на табли, да се испита да ли нека домина сме да се стави на таблу, да се табла испразни и да се табла упише у излазни ток (it<<tab
). Грешка је покушај стављања недозвољене домине.
(15 поена) Написати на језику C++ програм који, читајући податке с главног улаза постави опсег вредности поља домина (n), направи одговарајућу таблу, ставља домине на таблу док може, испише садржај табле на главном излазу и понавља претходне кораке све док за n не прочита недозвољену вредност.
#include <iostream> #include <cstdlib> using namespace std; enum {G_OPSEG=1, G_NE_MOZE}; class Domina { static int n; int _p1, _p2; public: static void postaviN (int nn) { n=nn; } static int uzmiN () { return n; } explicit Domina (int a=0, int b=0) { if (a<0 || a>=n || b<0 || b>=n) exit (G_OPSEG); _p1 = a; _p2 = b; } int p1 () const { return _p1; } int p2 () const { return _p2; } void operator~ () { int p = _p1; _p1 = _p2; _p2 = p; } friend operator== (const Domina& d1, const Domina& d2){ return d1._p1==d2._p1 && d1._p2==d2._p2 || d1._p1==d2._p2 && d1._p2==d2._p1 ; } friend istream& operator>> (istream& ut, Domina& d) { int a, b; ut >> a >> b; d = Domina (a,b); return ut; } friend ostream& operator<< (ostream& it, const Domina& d) { return it << '(' << d._p1 << ',' << d._p2 << ')'; } }; int Domina::n = 6; class Tabla { Domina* niz; int kap, duz; void kopiraj (const Tabla& t); void brisi () { delete [] niz; } void dodaj (const Domina& d, bool naKraju); public: Tabla () { int n = Domina::uzmiN(); niz = new Domina [kap = n*(n+1)/2]; duz = 0; } Tabla (const Tabla& t) { kopiraj (t); } ~Tabla () { brisi (); } Tabla& operator= (const Tabla& t) { if (this!=&t) { brisi(); kopiraj(t); } return *this; } int vel () const { return duz; } bool moze (const Domina& d) const; Tabla& operator+= (const Domina& d); Tabla& isprazni () { duz = 0; return *this; } friend ostream& operator<< (ostream& it, const Tabla& s); }; void Tabla::kopiraj (const Tabla& t) { niz = new Domina [kap = t.kap]; duz = t.duz; for (int i=0; i<duz; i++) niz[i] = t.niz[i]; } bool Tabla::moze (const Domina& d) const { if (duz == kap) return false; if (duz == 0) return true; for (int i=0; i<duz; i++) if (d == niz[i]) return false; return d.p1()==niz[ 0 ].p1() || d.p2()==niz[ 0 ].p1() || d.p1()==niz[duz-1].p2() || d.p2()==niz[duz-1].p2() ; } ostream& operator<< (ostream& it, const Tabla& s) { for (int i=0; i<s.duz; it<<s.niz[i++]); return it; } Tabla& Tabla::operator+=(const Domina& d){ if (! moze(d)) exit (G_NE_MOZE); Domina dd(d); ~dd; if ( duz == 0 ) dodaj (d , true ); else if (d.p2() == niz[ 0 ].p1()) dodaj (d , false); else if (d.p1() == niz[ 0 ].p1()) dodaj (dd, false); else if (d.p1() == niz[duz-1].p2()) dodaj (d , true ); else if (d.p2() == niz[duz-1].p2()) dodaj (dd, true ); return *this; } void Tabla::dodaj (const Domina& d, bool naKraju) { if (naKraju) niz[duz++] = d; else { for (int i=duz; i>0; i--) niz[i] = niz[i-1]; niz[0] = d; duz++; } } int main () { while (true) { cout << "n? "; int n; cin >> n; if (n <= 0) break; Domina::postaviN (n); Tabla t; while (true) { cout << "dom? "; Domina d; cin >> d; if (! t.moze(d)) break; t += d; } cout << "tab= " << t << endl; } return 0; }(⇒ почетак)
n? 6 dom? 4 4 dom? 1 4 dom? 2 4 dom? 3 1 dom? 0 2 dom? 3 3 dom? 5 4 tab= (3,3)(3,1)(1,4)(4,4)(4,2)(2,0) n? 0
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.