Visa elektrotehnicka skola, Beograd
Ласло Краус
Објектно програмирање - колоквијуми
Други колоквијум
Друга група
10. 6. 2006.

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

I – Написати на језику C++ класу тачака у равни. Предвидети:

  1. стварање тачке са задатим координатама (подразумевано (0,0)),
  2. одређивање растојања тачке до задате друге тачке,
  3. читање тачке из датотеке (dat>>tacka),
  4. уписивање тачке у датотеку (dat<<tacka).

II – Написати на језику C++ апстракну класу геометријских фигура у равни. Предвидети:

  1. уништавање фигуре,
  2. стварање динамичке копије фигуре,
  3. испитивање да ли задата тачка припада фигури,
  4. читање фигуре из датотеке (dat>>fig),
  5. уписивање фигуре у датотеку (dat<<fig).

III – Написати на језику C++ класу кругова у равни као изведену класу из класе фигура. Поред могућности основне класе предвидети:

  1. иницијализацију круга задатом тачком као центром круга (подразумевано (0,0)) и задатим полупречником (подразумевано 1 – нула или негативна вредност је грешка).

IV – Написати на језику C++ класу цртежа који садрже низове фигура. Предвидети:

  1. иницијализацију празног цртежа почетног капацитета од 3 места,
  2. иницијализацију цртежа другим цртежом,
  3. уништавање цртежа,
  4. додељивање вредности једног цртежа другом цртежу (crt1=crt2),
  5. додавање задате фигуре на крај низа (crt+=fig – ако се низ препуни, повећати капацитет за 3 места – сматра се да у случају потпуног или делимичног преклапања садржаних фигура касније додата фигура је изнад раније додате),
  6. дохватање највише фигуре у цртежу којој припада дата тачка (crt[tacka] – грешка је ако тачка не припада ниједној од садржаних фигура).

V – Написати на језику C++ програм који (евентуалне грешке не треба да прекидају програм):

Грешке пријављивати изузецима типа једноставних класа које могу да уписују у датотеку поруке о грешкама.


Напомене (садржај)


Решење задатка (поставка | садржај)

// 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]
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.