![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Друга група 10. 6. 2006. |
---|
I – Написати на језику C++ класу тачака у равни. Предвидети:
dat>>tacka
),
dat<<tacka
).
II – Написати на језику C++ апстракну класу геометријских фигура у равни. Предвидети:
dat>>fig
),
dat<<fig
).
III – Написати на језику C++ класу кругова у равни као изведену класу из класе фигура. Поред могућности основне класе предвидети:
IV – Написати на језику C++ класу цртежа који садрже низове фигура. Предвидети:
crt+=fig
– ако се низ препуни, повећати капацитет за 3 места – сматра се да у случају потпуног или делимичног преклапања садржаних фигура касније додата фигура је изнад раније додате),
crt[tacka]
– грешка је ако тачка не припада ниједној од садржаних фигура).
V – Написати на језику C++ програм који (евентуалне грешке не треба да прекидају програм):
Грешке пријављивати изузецима типа једноставних класа које могу да уписују у датотеку поруке о грешкама.
studentx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.N:
(Nastava
on
\\Xs200-2
) у каталогу ObjektnoProg\RSx
(x
је број радне станице за којим се ради).// tacka.h #ifndef _tacka_h_ #define _tacka_h_ #include <iostream> #include <cmath> using namespace std; class Tacka { double x, y; public: Tacka (double a=0, double b=0) { x = a; y = b; } double rast (const Tacka& t) const { return sqrt (pow(x-t.x,2) + pow(y-t.y,2)); } friend istream& operator>> (istream& d, Tacka& t) { return d >> t.x >> t.y; } friend ostream& operator<< (ostream& d, const Tacka& t) { return d << '(' << t.x << ',' << t.y << ')'; } }; #endif(садржај)
// figura.h #ifndef _figura_h_ #define _figura_h_ #include "tacka.h" #include <iostream> using namespace std; class Figura { public: virtual ~Figura () {} virtual Figura* kopija () const =0; virtual bool pripada (const Tacka& t) const =0; private: virtual void citaj (istream& d) =0; virtual void pisi (ostream& d) const =0; friend istream& operator>> (istream& d, Figura& f) { f.citaj (d); return d; } friend ostream& operator<< (ostream& d, const Figura& f) { f.pisi (d); return d; } }; #endif
// krug.h #ifndef _krug_h_ #define _krug_h_ #include "figura.h" class GPolupr {}; inline ostream& operator<< (ostream& d, const GPolupr&) { return d << "*** Neispravan poluprecnik!"; } class Krug: public Figura { Tacka c; double r; public: Krug (const Tacka& C=Tacka(), double R=1) { if (R <= 0) throw GPolupr (); c = C; r = R; } Krug* kopija () const { return new Krug (*this); } bool pripada (const Tacka& t) const { return c.rast (t) <= r; } private: void citaj (istream& d) { Tacka C; double R; d >> C >> R; if (R <= 0) throw GPolupr (); c = C; r = R; } void pisi (ostream& d) const { d << '[' << c << ',' << r << ']'; } }; #endif
// crtez.h #ifndef _crtez_h_ #define _crtez_h_ #include "figura.h" class GNePripada {}; inline ostream& operator<< (ostream& d, const GNePripada&) { return d << "*** Tacka ne pripada crtezu!"; } class Crtez { Figura** niz; int kap, duz; void kopiraj (const Crtez&); void brisi (); public: Crtez () { niz = new Figura* [kap = 3]; duz = 0; } Crtez (const Crtez& crt) { kopiraj (crt); } ~Crtez () { brisi (); } Crtez& operator= (const Crtez& crt) { if (this != &crt) { brisi (); kopiraj (crt); } return *this; } Crtez& operator+= (const Figura& f); Figura& operator[] (const Tacka&); const Figura& operator[] (const Tacka& t) const { return const_cast<Crtez&>(*this)[t]; } }; #endif
// crtez.cpp #include "crtez.h" void Crtez::kopiraj (const Crtez& crt) { niz = new Figura* [kap = crt.kap]; for (int i=0; i<duz; i++) niz[i] = crt.niz[i]->kopija (); } void Crtez::brisi () { for (int i=0; i<duz; delete niz[i++]); delete [] niz; } Crtez& Crtez::operator+= (const Figura& f) { if (duz == kap) { Figura** pom = new Figura* [kap += 3]; for (int i=0; i<duz; i++) pom[i] = niz[i]; delete [] niz; niz = pom; } niz[duz++] = f.kopija (); return *this; } Figura& Crtez::operator[] (const Tacka& t) { for (int i=duz-1; i>=0; i--) if (niz[i]->pripada (t)) return *niz[i]; throw GNePripada (); }
// program.cpp #include "krug.h" #include "crtez.h" #include <iostream> using namespace std; int main () { Crtez crt; cout << "Broj krugova? "; int n; cin >> n; for (int i=1; i<=n; ) try { cout << i << ". krug (x,y,r)? "; Krug k; cin >> k; crt += k; i++; } catch (GPolupr g) { cout << g << endl; } cout << "\nBroj tacaka? "; cin >> n; for (int i=1; i<=n; i++) try { cout << i << ". tacka (x,y)? "; Tacka t; cin >> t; Figura& f = crt[t]; cout << "Najvisa figura: " << f << endl; } catch (GNePripada g) { cout << g << endl; } return 0; }
Broj krugova? 4 1. krug (x,y,r)? 1 1 2 2. krug (x,y,r)? 0 -1 2 3. krug (x,y,r)? 3 4 -5 *** Neispravan poluprecnik! 3. krug (x,y,r)? 1 -1 3 4. krug (x,y,r)? -1 1 2 Broj tacaka? 3 1. tacka (x,y)? 0 0 Najvisa figura: [(-1,1),2] 2. tacka (x,y)? 5 5 *** Tacka ne pripada crtezu! 3. tacka (x,y)? 1 0 Najvisa figura: [(1,-1),3]
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.