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

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

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

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

  1. стварање динамичке копије предмета,
  2. уништавање предмета,
  3. исписивање предмета.

II - Пројектовати на језику C++ класу Niz за низове предмета. Предвидети:

  1. иницијализацију празног низа задатог капацитета (подразумевано 3),
  2. иницијализацију низа другим низом,
  3. уништавање низа,
  4. додељивање вредности једног низа другом низу (niz1=niz2),
  5. дохватање броја елемената у низу (+niz),
  6. уметање једног предмета на крај низа (niz+=br) - ако се низ препуни, повећати капацитет за 10%, али најмање за 5 места,
  7. дохватање задатог елемента низа (niz[ind]) - приступ непостојећем елементу је грешка,
  8. исписивање низа (d<<niz).

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

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

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

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


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


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

// predmet.h - Klasa apstraktnih predmeta

#ifndef _predmet_h_
#define _predmet_h_
#include <iostream>
using namespace std;

class Predmet {
  virtual void pisi (ostream& d) const=0;
public:
  virtual Predmet* kopija () const =0;
  virtual ~Predmet () {}
  friend ostream& operator<< (ostream& d, const Predmet& p)
    { p.pisi (d); return d; }
};
#endif

// niz.h - Klasa nizova apstraktnih predmeta. #ifndef _niz_h_ #define _niz_h_ #include "predmet.h" #include <iostream> using namespace std; class GIndeks {}; class Niz { Predmet **a; int n, k; void kopiraj (const Niz &niz); void brisi (); public: explicit Niz (int kk=3) { a = new Predmet* [k = kk]; n = 0; } Niz (const Niz& niz) { kopiraj (niz); } virtual ~Niz () { brisi (); } Niz& operator= (const Niz& niz) { if (this != &niz) { brisi (); kopiraj (niz); } return *this; } int operator+ () const { return n; } virtual Niz& operator+= (const Predmet& p); Predmet*& operator[] (int i) { if (i<0 || i>=n) throw GIndeks (); return a[i]; } const Predmet* operator[] (int i)const{ if (i<0 || i>=n) throw GIndeks (); return a[i]; } friend ostream& operator<< (ostream& d, const Niz& niz); }; #endif
// niz.cpp - Klasa nizova apstraktnih predmeta. #include "niz.h" void Niz::kopiraj (const Niz &niz) { a = new Predmet* [n = niz.n]; for (int i=0; i<n; i++) a[i]=niz.a[i]->kopija(); } void Niz::brisi () { for (int i=0; i<n; delete niz[i++]); delete [] niz; } Niz& Niz::operator+= (const Predmet& p) { if (n == k) { k += k<50 ? 5 : k/10; Predmet** p = new Predmet* [k]; for (int i=0; i<n; i++) p[i] = a[i]; delete [] a; a = p; } a[n++] = p.kopija (); return *this; } ostream& operator<< (ostream& d, const Niz& niz) { for (int i=0; i<niz.n; i++) d << *niz.a[i] << ' '; return d; }
// kvadrat.h - Klasa kvadrata. #ifndef _kvadrat_h_ #define _kvadrat_h_ #include "predmet.h" class GStranica {}; class Kvadrat: public Predmet { double a; void pisi (ostream& d) const { d << "K(" << a <<')'; } public: Kvadrat (double aa = 1) { if (aa<=0) throw GStranica (); a = aa; } Kvadrat* kopija () const { return new Kvadrat (*this); } double S () const { return a * a; } }; #endif
// predmett.cpp - Ispitivanje klasa predmeta. #include "niz.h" #include "kvadrat.h" #include <iostream> using namespace std; int main () { Niz niz; try { while (true) { cout << "Kvadrat (a)? "; double a; cin >> a; niz += Kvadrat (a); } } catch (GStranica) {} try { Kvadrat* maxt = static_cast<Kvadrat*>(niz[0]); double maxs = maxt->S (); for (int i=1; i<+niz; i++) { Kvadrat* p = static_cast<Kvadrat*>(niz[i]); if (p->S() > maxs) { maxt = p; maxs = p->S (); } } cout << "Najveci kvadrat: " << *maxt << endl; } catch (GIndeks) { cout << "Niz je prazan!\n"; } }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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