![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Друга група 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.