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

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

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

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

  1. иницијализацију празнe збирке задатог капацитета (подразумевано 10),
  2. иницијализацију збирке другом збирком,
  3. уништавање збирке,
  4. додељивање вредности једне збирке другој збирци (zbirka1=zbirka2),
  5. дохватање једнословне ознаке врсте збирке,
  6. стварање динамичке копије збирке,
  7. дохватање броја попуњених места и броја празних места у збиреци (+zbirka, -zbirka),
  8. стављање броја у збирку – препуњавање збирке је грешка,
  9. уписивање збирке у датотеку (dat<<zbirka – пише се једнословна ознака збирке и елементи збирке).

II – Пројектовати на језику C++ класу Niz за уређене низове реалних бројева као изведену класу из класе Zbirka са истим могућностима као и основна класа.

III – Пројектовати на језику C++ класу Skup за скупове реалних бројева, чији су сви елементи међусобно различити, као изведену класу из класе Zbirka, код којих се бројеви додају иза последњег броја у скупу. Поред могућности основне класе, предвидети:

  1. испитивање да ли се неки број налази у скупу.

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

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


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


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

// zbirka.h

#ifndef _zbirka_h_
#define _zbirka_h_

#include <iostream>
using namespace std;

class Zbirka {
protected:
  double* niz; int kap, duz;
private:
  void kopiraj (const Zbirka& z);
  void brisi () { delete [] niz; }
public:
  explicit Zbirka (int k=10) { niz = new double [kap = k]; duz = 0; }
  Zbirka (const Zbirka& z) { kopiraj (z); }
  virtual ~Zbirka () { brisi (); }
  Zbirka& operator= (const Zbirka& z) {
    if (this != &z) { brisi (); kopiraj (z); }
    return *this;
  }
  virtual char vrsta () const =0;
  virtual Zbirka* kopija () const =0;
  int operator+ () const { return duz; }
  int operator- () const { return kap - duz; }
  virtual Zbirka& stavi (double b) =0;
protected:
  virtual void pisi (ostream& d) const;
  friend ostream& operator<< (ostream& d, const Zbirka& z) { z.pisi (d); return d; }
};

class GZbirkaPuna {
  friend ostream& operator<< (ostream& d, const GZbirkaPuna& g)
    { return d << "*** Zbirka je puna!"; }
};

#endif

// zbirka.cpp #include "zbirka.h" void Zbirka::kopiraj (const Zbirka& z) { niz = new double [kap = z.kap]; duz = z.duz; for (int i=0; i<kap; i++) niz[i] = z.niz[i]; } void Zbirka::pisi (ostream& d) const { d << vrsta () << ':'; for (int i=0; i<duz; d << ' ' << niz[i++]); }
// niz.h #ifndef _niz_h_ #define _niz_h_ #include "zbirka.h" class Niz: public Zbirka { public: explicit Niz (int k): Zbirka (k) {} char vrsta () const { return 'N'; } Niz* kopija () const { return new Niz (*this); } Niz& stavi (double b); }; #endif
// niz.cpp #include "niz.h" Niz& Niz::stavi (double b) { if (duz == kap) throw GZbirkaPuna (); int i = duz-1; while (i>=0 && niz[i]>b) { niz[i+1] = niz[i]; i--; } niz[i+1] = b; duz++; return *this; }
// skup.h #ifndef _skup_h_ #define _skup_h_ #include "zbirka.h" class Skup: public Zbirka { public: explicit Skup (int k): Zbirka (k) {} char vrsta () const { return 'S'; } Skup* kopija () const { return new Skup (*this); } Skup& stavi (double b); bool ima (double b) const; }; #endif
// skup.cpp #include "skup.h" Skup& Skup::stavi (double b){ if (!ima (b)) { if (duz == kap) throw GZbirkaPuna (); niz [duz++] = b; } return *this; } bool Skup::ima (double b) const { for (int i=0; i<duz; i++) if (niz[i] == b) return true; return false; }
// glavni.cpp #include "niz.h" #include "skup.h" #include <iostream> using namespace std; int main () { while (true) { cout << "Broj zbirki? "; int n; cin >> n; if (n <= 0) break; Zbirka** niz = new Zbirka* [n]; for (int i=0; i<n; ) { cout << "Vrsta zbirke (N, S)? "; char vrs; cin >> vrs; cout << "Kapacitet zbirke? "; int k; cin >> k; switch (vrs) { case 'N': niz[i++] = new Niz (k); break; case 'S': niz[i++] = new Skup (k); break; } } try { while (true) { cout << "Broj? "; double b; cin >> b; for (int i=0; i<n; niz[i++]->stavi(b)); } } catch (GZbirkaPuna) {} int min = +*niz[0], max=min, imin=0, imax=0; for (int i=1; i<n; i++) { int d = +*niz[i]; if (d < min) { min = d; imin = i; } if (d > max) { max = d; imax = i; } } cout << "min = " << *niz[imin] << endl; cout << "max = " << *niz[imax] << endl; for (int i=0; i<n; delete niz[i++]); delete [] niz; } return 0; }
Broj zbirki? 4 Vrsta zbirke (N, S)? N Kapacitet zbirke? 6 Vrsta zbirke (N, S)? S Kapacitet zbirke? 3 Vrsta zbirke (N, S)? N Kapacitet zbirke? 4 Vrsta zbirke (N, S)? S Kapacitet zbirke? 6 Broj? 5 Broj? 3 Broj? 4 Broj? 3 Broj? 2 min = S: 5 3 4 max = N: 2 3 3 4 5 Broj zbirki? 0
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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