![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Друга група 14. 6. 2005. |
---|
I – Пројектовати на језику C++ апстракну класу Predmet
за предмете. Предвидети:
dat<<predmet
).
II – Пројектовати на језику C++ класу Stek
за стекове предмета ограничених капацитета. Предвидети:
stek1=stek2
),
+stek
),
stek[ind]
– индекси расту од врха ка дну стека) – приступ непостојећем предмету је грешка,
dat<<stek
).
III – Пројектовати на језику C++ класу Kupa
као изведену класу из класе Predmet
. Величина купе је једнака запремини купе (V = r2πh/3). Поред могућности основне класе предвидети:
IV – Саставити на језику C++ главни програм који:
Грешке пријављивати изузецима типа једноставних класа. Предвидети исписивање поруке о грешци.
studentx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.N:
(Nastava
on
\\Xs200-2
) у каталогу ObjektnoProg\RSx
(x
је број радне станице за којим се ради).// predmet.h #ifndef _predmet_h_ #define _predmet_h_ #include <iostream> using namespace std; class Predmet { public: virtual ~Predmet () {} virtual Predmet* kopija () const =0; virtual double velicina () const =0; private: virtual void pisi (ostream& d) const =0; friend ostream& operator<< (ostream& d, const Predmet& p) { p.pisi (d); return d; } }; #endif(садржај)
// stek.h #ifndef _stek_h_ #define _ste_h_ #include "predmet.h" #include <iostream> using namespace std; class GStek { virtual void pisi (ostream& d) const =0; friend ostream& operator<< (ostream& d, const GStek& g) { g.pisi (d); return d; } }; class GStekPun: public GStek { void pisi (ostream& d) const { d << "*** Stek je pun!"; } }; class GStekPrazan: public GStek { void pisi (ostream& d) const { d << "*** Stek je prazan!"; } }; class GStekIndeks: public GStek { void pisi (ostream& d) const { d << "*** Nedoszoljen indeks!"; } }; class Stek { Predmet** niz; int kap, vrh; void kopiraj (const Stek& s); void brisi (); public: explicit Stek (int k=3) { niz = new Predmet* [kap = k]; vrh = 0; } Stek (const Stek& s) { kopiraj (s); } ~Stek () { brisi (); } Stek& operator= (const Stek& s) { if (this != &s) { brisi (); kopiraj (s); } return *this; } int operator+ () const {return vrh; } Stek& stavi (const Predmet& p) { if (vrh == kap) throw GStekPun (); niz[vrh++] = p.kopija (); return *this; } Predmet* uzmi () { if (vrh == 0) throw GStekPrazan (); return niz[--vrh]; } Predmet& operator[] (int ind) { if (ind<0 || ind>=vrh) throw GStekIndeks (); return *niz[vrh-1-ind]; }; const Predmet& operator[] (int ind) const { if (ind<0 || ind>=vrh) throw GStekIndeks (); return *niz[vrh-1-ind]; }; friend ostream& operator<< (ostream& d, const Stek& s); }; #endif
// stek.cpp #include "stek.h" void Stek::kopiraj (const Stek& s) { niz = new Predmet* [kap = s.kap]; vrh = s.vrh; for (int i=0; i<vrh; i++) niz[i] = s.niz[i]->kopija (); } void Stek::brisi () { for (int i=0; i<vrh; delete niz[i++]); delete [] niz; } ostream& operator<< (ostream& d, const Stek& s) { for (int i=s.vrh-1; i>=0; d<<*s.niz[i--]<<' '); return d; }
// kupa.h #ifndef _kupa_h_ #define _kupa_h_ class GKupa { friend ostream& operator<< (ostream& d, const GKupa& g) { d << "*** Neispravan parametar!"; } }; class Kupa: public Predmet { double r, h; public: explicit Kupa (double rr=1, double hh=1) { if (rr<=0 || hh<=0) throw GKupa (); r = rr; h = hh; } Kupa* kopija () const { return new Kupa (*this); } double velicina () const { return r * r * 3.14159 * h / 3; } private: void pisi (ostream& d) const { d << "K(" << r << ',' << h << ')'; } }; #endif
// glavni.cpp #include "stek.h" #include "kupa.h" #include <iostream> using namespace std; int main () { cout << "Kapacitet? "; int k; cin >> k; Stek s (k); double sr = 0; int n = 0; bool kraj = false; while (!kraj) { try { cout << "Izbor (S - stavi, U - uzmi, Z - zavrsi)? "; char izb; cin >> izb; switch (izb) { case 'S': cout << "r,h? "; double r, h; cin >> r >> h; s.stavi (Kupa (r,h)); break; case 'U': { Predmet* p = s.uzmi (); cout << "predmet: " << *p << endl; sr += p->velicina (); n++; delete p; break; } case 'Z': kraj = true; break; default: throw "*** Neispravan izbor!"; } } catch (const GStek& g) { cout << g << endl; } catch (const GKupa& g) { cout << g << endl; } catch (const char* g) { cout << g << endl; } } if (n) sr /= n; cout << "Srednje velicina: " << sr << endl; return 0; }
Kapacitet? 3 Izbor (S - stavi, U - uzmi, Z - zavrsi)? u *** Neispravan izbor! Izbor (S - stavi, U - uzmi, Z - zavrsi)? U *** Stek je prazan! Izbor (S - stavi, U - uzmi, Z - zavrsi)? S r,h? 2 4 Izbor (S - stavi, U - uzmi, Z - zavrsi)? S r,h? 2 5 Izbor (S - stavi, U - uzmi, Z - zavrsi)? S r,h? 5 6 Izbor (S - stavi, U - uzmi, Z - zavrsi)? S r,h? 2 5 *** Stek je pun! Izbor (S - stavi, U - uzmi, Z - zavrsi)? U predmet: K(5,6) Izbor (S - stavi, U - uzmi, Z - zavrsi)? U predmet: K(2,5) Izbor (S - stavi, U - uzmi, Z - zavrsi)? Z Srednje velicina: 89.0117
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.