Ласло Краус |
СИ2ОО1 Испит 3. 2. 2008. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Шта је лвредност? Под којим условима је резултат тернарног оператора лвредност?
б) Да ли су спољашња и угнежђена класа узајамно пријатељске? Како се изван спољашње класе приступа статичком (заједничком) члану угнежђене?
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
char
) и однос ширине и висине при исцртавању знака. Може да се дохвати садржани знак и да се одреди ширина исцртавања за дату висину.
vekt.pisi(it)
) у облику "(
x,
y)
".
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Шта је аргумент операторске функције new и како се израчунава стварни аргумент?
б) Да ли се преко објекта заштићено изведене класе може приступити јавном члану основне класе и зашто?
Коришћењем класа из првог дела, написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа):
fig+=vekt
), да се направи динамичка копија фугуре и да се фигура упише у излазни ток (it<<fig
).
-
вектор2".
[
вектор_положаја,
висина,
ширина]
".
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Шта се дешава када се у некој catch грани изврши наредба throw;
?
б) Шта се назива делимичном, а шта потпуном специјализацијом шаблона? Навести декларације као примере обе специјализације шаблона template
<class
T1,
class
T2>
class
S;
Коришћењем класа из првог и другог дела, написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности, који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа класа):
niz+=pod
– грешка је ако је низ пун), да се избаци податак са задатог места, да се дохвати податак на задатом месту (niz[k]
– грешка је ако је индекс изван опсега или ако је задато место празно) и да се низ упише у излазни ток (it<<niz
) у облику "<
податак#…#
податак>
".
(10 поена) Написати на језику C++ програм који направи фонт са три симбола и цртеж који садржи једну дуж и један текст, испише цртеж на главном излазу, помери цртеж за дати помак и поново испише цртеж на главном излазу. Користити константне параметре (не треба ништа читати с главног улаза).
#include <iostream> #include <cstring> using namespace std; class Simbol { char zn; double odnos; public: Simbol (char z, double odn) { zn = z; odnos = odn; } char znak () const { return zn; } double sirina (double vis) const { return vis * odnos; } }; class Font { struct Elem { Simbol sim; Elem* sled; Elem (const Simbol& s): sim(s) { sled = 0; } }; Elem *prvi, *posl; int duz; void kopiraj (const Font& f); void brisi (); public: Font () { prvi = posl = 0; duz = 0; } Font (const Font& f) { kopiraj (f); } ~Font () { brisi (); } Font& operator= (const Font& f) { if (this != &f) { brisi(); kopiraj(f); } return *this; } int duzina () const { return duz; } Simbol* nadji (char zn); const Simbol* nadji (char zn) const { return const_cast<Font*>(this)->nadji(zn); } Font& dodaj (const Simbol& s) { if (Simbol* sim = nadji(s.znak())) *sim = s; else { duz++; posl = (!prvi ? prvi : posl->sled) = new Elem (s); } return *this; } }; void Font::kopiraj (const Font& f) { prvi = posl = 0; duz = f.duz; Elem *tek = prvi, *pret = 0; for (Elem *tek=f.prvi; tek; tek=tek->sled) posl = (!prvi ? prvi : posl->sled) = new Elem (tek->sim); } void Font::brisi () { while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } } Simbol* Font::nadji (char zn) { for (Elem* tek=prvi; tek; tek=tek->sled) if (tek->sim.znak() == zn) return &tek->sim; return 0; } class Vektor { double x, y; public: Vektor (double a=0, double b=0) { x = a; y = b; } Vektor& dodaj (const Vektor& v) { x += v.x; y += v.y; return *this; } void pisi (ostream& it) const { it << '(' << x << ',' << y << ')'; } };
class Figura { public: virtual ~Figura () {} virtual Figura& operator+= (const Vektor& v) =0; virtual Figura* kopija () const =0; private: virtual void pisi (ostream& it) const =0; friend ostream& operator<< (ostream& it, const Figura& f) { f.pisi (it); return it; } }; class Duz: public Figura { Vektor A, B; void pisi (ostream& it) const { A.pisi (it); it << '-'; B.pisi (it); } public: Duz (const Vektor& P, const Vektor& Q): A(P), B(Q) {} Duz& operator+= (const Vektor& v) { A.dodaj(v); B.dodaj(v); return *this; } Duz* kopija () const { return new Duz (*this); } }; class Tekst: public Figura { char* niz; double vis; Font fnt; Vektor poz; void pisi (ostream& it) const { it << niz << '['; poz.pisi (it); it << ',' << vis << ',' << sirina() << ']'; } public: Tekst (const char* tks, double h, const Font& f, const Vektor& p): fnt(f), poz(p) { niz = strcpy (new char [strlen(tks)+1], tks); vis = h; } Tekst (const Tekst& t): fnt(t.fnt), poz(t.poz) { niz = strcpy (new char [strlen(t.niz)+1], t.niz); vis = t.vis; } ~Tekst () { delete [] niz; } Tekst& operator= (const Tekst& t) { if (this != &t) { niz = strcpy (new char [strlen(t.niz)+1], t.niz); vis = t.vis; fnt = t.fnt; poz = t.poz; } } double visina () const { return vis; } double sirina () const; Tekst& operator+= (const Vektor& v) { poz.dodaj (v); return *this; } Tekst* kopija () const { return new Tekst (*this); } }; double Tekst::sirina () const { double s = 0; for (unsigned i=0; i<strlen(niz); s+=fnt.nadji(niz[i++])->sirina(vis)); return s; }
class GPun {}; class GIndeks {}; class GPrazno {}; template <class T> class Niz { T** niz; int kap; void kopiraj (const Niz& n); void brisi (); public: explicit Niz (int k=10); Niz (const Niz& n) { kopiraj (n); } ~Niz () { brisi (); } Niz& operator= (const Niz& n) { if (this != &n) { brisi(); kopiraj(n); } return *this; } int kapac () const { return kap; } Niz& operator+= (const T& t); Niz& izbaci (int i) { if (i>=0 && i<kap) { delete niz[i]; niz[i] = 0; } return *this; } T& operator[] (int i) { if (i<0 || i>=kap) throw GIndeks (); if (! niz[i]) throw GPrazno (); return *niz[i]; } const T& operator[] (int i) const { if (i<0 || i>=kap) throw GIndeks (); if (! niz[i]) throw GPrazno (); return *niz[i]; } template <class T> friend ostream& operator<< (ostream& it, const Niz<T>& n); }; template <class T> void Niz<T>::kopiraj (const Niz& n) { niz = new T* [kap = n.kap]; for (int i=0; i<kap; i++) niz[i] = n.niz[i] ? n.niz[i]->kopija():0; } template <class T> void Niz<T>::brisi () { for (int i=0; i<kap; delete niz[i++]); delete [] niz; } template <class T> Niz<T>::Niz (int k) { niz = new T* [kap = k]; for (int i=0; i<k; niz[i++]=0); } template <class T> Niz<T>& Niz<T>::operator+= (const T& t) { int i = 0; while (i<kap && niz[i]) i++; if (i == kap) throw GPun (); niz[i] = t.kopija (); return *this; } template <class T> ostream& operator<< (ostream& it, const Niz<T>& n) { it << '<'; for (int i=0; i<n.kap; i++) { if (i) it << " # "; if (n.niz[i]) it << *n.niz[i]; } return it << '>'; } class Crtez: public Figura { Niz<Figura> niz; void pisi (ostream& it) const{ it << niz; } public: explicit Crtez (int kap): niz(kap) {} Crtez& operator+= (const Figura& f) { niz += f; return *this;} Crtez& operator+= (const Vektor& v); Crtez* kopija () const { return new Crtez (*this); } }; Crtez& Crtez::operator+= (const Vektor& v) { for (int i=0; i<niz.kapac(); i++) try { niz[i] += v; } catch (GPrazno) {} return *this; } int main () { Font fnt; fnt.dodaj (Simbol ('m', 0.8)); fnt.dodaj (Simbol ('a', 0.5)); fnt.dodaj (Simbol ('!', 0.1)); Crtez crt (2); crt += Duz (Vektor(1,1),Vektor(2,3)); crt += Tekst ("mama!", 1, fnt, Vektor(2,1)); cout << crt << endl; crt += Vektor (2, 1); cout << crt << endl; return 0; }(⇒ почетак)
<(1,1)-(2,3) # mama![(2,1),1,2.7]> <(3,2)-(4,4) # mama![(4,2),1,2.7]>
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.