Ласло Краус |
СИ2ОО1 Први колоквијум 7. 11. 2005. |
---|
Саставити на језику C++ следеће класе (класе опремити оним конструкторима и деструктором који су потребни за безбедно коришћење класа):
(20 поена) Написати на језику C++ главни програм који читајући датуме с главног улаза направи листу датума (читање се завршава првим неисправним датумом), испише на главном излазу добијену листу као и најкаснији датум и понавља претходне кораке све док не прочита празну листу.
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Како и где се стварају (креирају) динамички објекти? Како се уништавају?
б) Навести дефиницију типа показивача this
у телу константне методе неке класе X
.
в) Под којим условима конструктор копије може да има више формалних аргумената?
г) Да ли се статичка (заједничка) метода може позвати пре него што се направи први објекат одговарајуће класе и зашто?
д) Које особине има релација пријатељства између класа?
#include <iostream> #include <cstdlib> using namespace std; class Datum { int d, m, g; static int dani[2][12]; public: static bool moze(int d, int m, int g) { return g>0 && m>0 && m<=12 && d>0 && d<=dani[g%4==0][m-1]; } Datum (int dd=7, int mm=11, int gg=2005) { if (! moze (dd, mm, gg)) exit (1); d = dd; m = mm; g = gg; } int dan () const { return d; } int mes () const { return m; } int god () const { return g; } int uporedi (const Datum& dat) const { if (g != dat.g) return g - dat.g; if (m != dat.m) return m - dat.m; return d - dat.d; } bool citaj () { int d, m, g; cin >> d >> m >> g; if (! moze (d, m, g)) return false; *this = Datum (d, m, g); return true; } void pisi () const { cout << d << '.' << m << '.' << g << '.'; } }; int Datum::dani[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; class Lista { struct Elem { Datum dat; Elem* sled; Elem (const Datum& d) { dat = d; sled = 0; } }; Elem *prvi, *posl; int duz; public: Lista () { prvi = posl = 0; duz = 0; } Lista (const Lista& lst); ~Lista (); Lista& dodaj (const Datum& dat) { posl = (!prvi ? prvi : posl->sled) = new Elem (dat); duz++; return *this; } int duzina () const { return duz; } Datum* max () const; void pisi () const; }; Lista::Lista (const Lista& lst) { prvi = posl = 0; duz = 0; for (Elem* tek=lst.prvi; tek; tek=tek->sled) dodaj (tek->dat); } Lista::~Lista () { while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } } Datum* Lista::max () const { if (! prvi) return 0; Datum* m = &prvi->dat; for (Elem* tek=prvi->sled; tek; tek=tek->sled) if (m->uporedi(tek->dat) < 0) m = &tek->dat; return m; } void Lista::pisi () const { for (Elem* tek=prvi; tek; tek=tek->sled) { tek->dat.pisi (); cout << ' '; } } int main () { while (true) { Lista lst; while (true) { cout << "Datum (d,m,g)? "; int d, m, g; cin >> d >> m >> g; if (! Datum::moze (d, m, g)) break; lst.dodaj (Datum (d, m, g)); } if (lst.duzina() == 0) break; cout << "Lista= "; lst.pisi (); cout << endl; cout << "Najkasnije= "; lst.max ()->pisi (); cout << endl; } }
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.