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

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

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

Пројектовати на језику C++ апстрактну класу за геометријске фигуре и из ње изведене класе за квадрате (задатих дужином странице) и за многоуглове (задатих бројем темена и дужинама страница). Предвидети:
  1. стварање фигуре са подразумеваним, можда празним, садржајем;
  2. иницијализацију фигуре другом фигуром;
  3. уништавање фигуре;
  4. доделу вредности једне фигуре другој (=);
  5. формирање копије у динамичкој меморији;
  6. израчунавање обима фигуре;
  7. уређивање низа фигура на основу њихових обима;
  8. читање фигуре (>>) и
  9. исписивање фигуре (<<).
Саставити на језику C++ главни програм који:
  1. прочита низ фигура,
  2. уреди их на основу њихових обима,
  3. испише резултујући низ,
  4. испразни низ и
  5. понавља претходне кораке све док за дужину низа не прочита недозвољену вредност.
За разрешавање конфликтних ситуација користити механизам изузетака.

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


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

// 1999_k2.h - Definicije klasa za geometrijske figure.

#include <iostream.h>

class Figura {
  virtual void citaj (istream &) = 0;
  virtual void pisi (ostream &) const =0;
public:
  virtual ~Figura () {}
  virtual Figura *kopija () const = 0;
  virtual double O () const = 0;
  static void sort (Figura **, int);
  friend istream & operator>> (istream &dd, Figura &ff)
    { ff.citaj (dd); return dd; }
  friend ostream & operator<< (ostream &dd, const Figura &ff)
    { ff.pisi (dd); return dd; }
};

class Kvadr: public Figura {
  double a;
  void citaj (istream &dd) { dd >> a; }
  void pisi (ostream &dd) const { dd << "Kv[" << a << ']'; }
public:
  Kvadr (double aa=1) { a = 1; }
  Figura *kopija () const { return new Kvadr (*this); }
  double O () const { return 4 * a; }
};

class MUgao: public Figura {
  double *str; int n;
  void kopiraj (const MUgao &);
  void brisi () { delete [] str; str = 0; }
  void citaj (istream &);
  void pisi (ostream &) const;
public:
  MUgao () { str = 0; }
  MUgao (const MUgao &mu) { kopiraj (mu); }
  ~MUgao () { brisi (); }
  MUgao & operator= (const MUgao &mu) {
    if (this != &mu) { brisi (); kopiraj (mu); }
    return *this;
  }
  Figura *kopija () const { return new MUgao (*this); }
  double O () const;
};


// 1999_k2.cpp - Definicije metoda uz klase za geometrijske figure. #include "1999_k2.h" void Figura::sort (Figura **niz, int n) { for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) if (niz[i]->O() > niz[j]->O()) { Figura *p = niz[i]; niz[i] = niz[j]; niz[j] = p; } } void MUgao::kopiraj (const MUgao &mu) { if ((str = new double [n=mu.n]) == 0) throw 1; for (int i=0; i<n; i++) str[i] = mu.str[i]; } void MUgao::citaj (istream &dd) { brisi (); cin >> n; if ((str = new double [n]) == 0) throw 1; for (int i=0; i<n; dd>>str[i++]); } void MUgao::pisi (ostream &dd) const { dd << "MU["; for (int i=0; i<n; i++) { dd << str[i]; if (i<n-1) cout << ','; } dd << ']'; } double MUgao::O () const { if (str == 0) throw 2; double OO = 0; for (int i=0; i<n; OO+=str[i++]); return OO; }
// 1999_k2t.cpp - Ispitivanje klasa za geometrijske figure. #include "1999_k2.h" #include <iostream.h> int main () { while (1) { cout << "\nDuzina niza? "; int n; cin >> n; if (n < 0) break; Figura **fig = 0; try { if ((fig = new Figura * [n]) == 0) throw 1; for (int i=0; i<n; i++) { cout << "Figura broj " << i << "? "; char ff; cin >> ff; switch (ff) { case 'k': case 'K': fig[i] = new Kvadr; break; case 'm': case 'M': fig[i] = new MUgao; break; default : fig[i] = 0; } if (fig[i] == 0) throw 3; cin >> *fig[i]; } Figura::sort (fig, n); cout << endl; for (i=0; i<n; cout << *fig[i++] << endl); } catch (int g) { cout << "*** Greska " << g << "***\a\n"; } if (fig) { for (int i=0; i<n; delete fig[i++]); delete [] fig; } } return 0; }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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