Ласло Краус |
СИ2ОО1 Други колоквијум 8. 12. 2007. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Који оператори се не могу преклапати, а који се могу преклопити само као методе класе?
б) Да ли се заштићеном члану основне класе O
може приступити из методе приватно изведене класе I
и да ли му се може приступити из методе класе II
која је јавно изведена из I
? Образложити.
в) При вишеструком извођењу, којим редоследом се позивају конструктори основних класа?
Саставити на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; у случају грешке прекидати програм):
it<<jed
) у облику naziv:
vrsta:
brojSt:
.
N
'.
obl+=jed
; прекорачење капацитета је грешка) уз проверу да ли се јединица сме додати. Проверу одређују конкретне области. Додата јединица не постане власништво области већ се само памти њена адреса (показивач). Број становника области је једнак збиру броја становника садржаних јединица. Може да јој се одреди површина. У излазни ток се пише у облику naziv:
vrsta:
brojSt:
povrs[
jed,…,
jed]
, где jed шредставља резултат писања једне јединице.
O
'. Округ је област која садржи само општине. Површина области је једнака збиру површина садржаних општина. Ознака врсте је 'K
'. Покушај додавања неодговарајуће јединице је грешка.
(10 поена) Написати на језику C++ програм који формира пример једног округа са две општине, од којих свака општина има по два насеља, а затим испише округ на главном излазу. Користити константне податке (не треба ништа читати с главног улаза).
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Jedinica { char* naziv; void kpoiraj (const char* naz) { naziv = new char [strlen(naz)+1]; strcpy (naziv, naz); } void brisi () { delete [] naziv; } public: Jedinica (const char* naz) { kopiraj (naz); } Jedinica( const Jedinica& jed) { kopiraj( jed.naziv); } virtual ~Jedinica () { brisi (); } Jedinica& operator= (const Jedinica& jed) { if (this != &jed) { brisi (); kopiraj (jed.naziv); } return *this; } virtual char vrsta () const =0; virtual int brojStan () const =0; protected: virtual void pisi (ostream& it) const { it << naziv << ':' << vrsta() << ':' << brojStan(); } friend ostream& operator<< (ostream& it, const Jedinica& jed) { jed.pisi (it); return it; } }; class Naselje: public Jedinica { int brStan; public: Naselje (const char* naz, int brS): Jedinica (naz) { brStan = brS; } char vrsta () const { return 'N'; } int brojStan() const { return brStan; } }; class Oblast: public Jedinica { void kopiraj (const Oblast& obl); void brisi () { delete [] niz; niz=0; } protected: const Jedinica** niz; int kap, duz; public: Oblast (const char* naz, int k): Jedinica (naz) { niz = new const Jedinica* [kap = k]; duz = 0; } Oblast (const Oblast& obl): Jedinica(obl) { kopiraj (obl); } ~Oblast () { brisi (); } Oblast& operator= (const Oblast& obl) { if (this != &obl) { brisi (); Jedinica::operator= (obl); kopiraj (obl); } return *this; } virtual bool moze (const Jedinica& jed) const =0; Oblast& operator+= (const Jedinica& jed) { if (duz == kap) exit (1); if (! moze (jed)) exit (2); niz[duz++] = &jed; return *this; } int brojStan () const; virtual double povrsina () const = 0; private: void pisi (ostream& it) const; }; void Oblast::kopiraj (const Oblast& obl){ niz=new const Jedinica* [kap=obl.kap]; duz = obl.duz; for (int i=0; i<duz; i++) niz[i] = obl.niz[i]; } int Oblast::brojStan () const { int brSt = 0; for (int i=0; i<duz; brSt+=niz[i++]->brojStan()); return brSt; } void Oblast::pisi (ostream& it) const { Jedinica::pisi (it); it << ':' << povrsina() << '['; for (int i=0; i<duz; i++) { if (i) it << ','; it << *niz[i]; } it << ']'; } class Opstina: public Oblast { double povrs; public: Opstina (const char* naziv, double pov, int kap): Oblast (naziv, kap) { povrs = pov; } char vrsta () const { return 'O'; } double povrsina () const { return povrs; } bool moze (const Jedinica& jed) const { return jed.vrsta() == 'N'; } }; class Okrug: public Oblast { public: Okrug (const char* naziv, int kap): Oblast (naziv, kap) {} char vrsta () const { return 'K'; } double povrsina () const; bool moze (const Jedinica& jed) const { return jed.vrsta() == 'O'; } }; double Okrug::povrsina () const { double p = 0; for (int i=0; i<duz; p+=((Opstina*)niz[i++])->povrsina()); return p; } int main () { Okrug okr("Okr", 4); Opstina o1("O1",7,2), o2("O2",4,2); Naselje n1("N1",6), n2("N2",4), n3("N3",3), n4("N4",5); okr += o1; okr += o2; o1 += n1; o1 += n2; o2 += n3; o2 += n4; cout << okr << endl; return 0; }(⇒ почетак)
Okr:K:18:11[O1:O:10:7[N1:N:6,N2:N:4],O2:O:8:4[N3:N:3,N4:N:5]]
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.