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

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

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

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

  1. уништавање предмета,
  2. стварање динамичке копије предмета,
  3. одређивање величине предмета (реалан број),
  4. уписивање предмета у датотеку (dat<<predmet).

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

  1. иницијализацију празног стека задатог капацитета (подразумевано 3),
  2. иницијализацију стека другим стеком,
  3. уништавање стека,
  4. додељивање вредности једног стека другом стеку (stek1=stek2),
  5. дохватање броја предмета на стеку (+stek),
  6. стављање једног предмета на врх стека – стављање на пун стек је грешка,
  7. узимање једног предмета са стека – узимање са празног стека је грешка,
  8. приступ задатом предмету на стеку (stek[ind] – индекси расту од врха ка дну стека) – приступ непостојећем предмету је грешка,
  9. уписивање стека у датотеку (dat<<stek).

III – Пројектовати на језику C++ класу Kupa као изведену класу из класе Predmet. Величина купе је једнака запремини купе (V = r2πh/3). Поред могућности основне класе предвидети:

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

IV – Саставити на језику C++ главни програм који:

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


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


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

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

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