Visa elektrotehnicka skola, Beograd
Ласло Краус
Објектно програмирање - испити
Практични испит
9. 2. 1999

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

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

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

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

За разрешавање конфликтних ситуација (на пример: покушај узимања податка из празне колекције) користити изузетке.

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


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

// 990209.h

#ifndef __990209__h__
#define __990209__h__

#include <iostream.h>

class Real {
protected:

  double x;

public:

  Real (double xx=0) { x = xx; }

  ~Real() {}

  virtual Real *kopija () const { return new Real (*this); }

  double operator+ () const { return x; }

  virtual Real & operator+= (const Real &rr)
    { x += rr.x; return *this; }

protected:

  virtual void citaj (istream &dd) { dd >> x; }

  virtual void pisi (ostream &dd) const { dd << x; }

  friend istream & operator>> (istream &dd, Real &rr)
    { rr.citaj (dd); return dd; }

  friend ostream & operator<< (ostream &dd, const Real &rr)
    { rr.pisi  (dd); return dd; }
};


class Cmplx: public Real {

  double y;

public:

  Cmplx (double xx=0, double yy=0): Real (xx) { y = yy; }

  Cmplx (const Real &rr): Real (rr) { y = 0; }

  Real *kopija () const { return new Cmplx (*this); }

  Cmplx & operator+=(const Real &cc)
    { x += +cc; y += ((Cmplx &)cc).y; return *this; }

private:

  void citaj (istream &dd) { Real::citaj (dd); dd >> y; }

  void pisi (ostream &dd) const
    { dd << '('; Real::pisi (dd); dd << ',' << y << ')'; }
};


class Red {
protected:

  struct Elem { Real *broj; Elem *sled;
                Elem (const Real &rr, Elem *ss=0)
                  { broj=rr.kopija(); sled=ss; }
                ~Elem () { delete broj; }
              };

  Elem *prvi, *posl;

  void kopiraj (const Red &rr);

  void brisi ();

public:

  enum Greska {PRAZAN = 1};

  Red () { prvi = posl = 0; }

  Red (const Real &rr) { prvi = posl = new Elem (rr); }

  Red (const Red &rr) {kopiraj(rr);}

  ~Red () { brisi (); }

  virtual Red & operator= (const Red &rr) {
    if (this != &rr) { brisi (); kopiraj (rr); }
    return *this;
  }

  virtual Red & operator+= (const Real &rr) {
    posl = (posl ? posl->sled : prvi) = new Elem (rr);
    return *this;
  }

  Real * operator-- () {
    if (! prvi) throw PRAZAN;
    Real *rr = prvi->broj;
    Elem *stari = prvi; prvi = prvi->sled; stari->sled = 0;
    delete stari;
    return rr;
  }

  friend ostream & operator<< (ostream &dd, const Red &rr);
};


class Stek: public Red {
public:

  Stek (): Red () {}

  Stek (const Stek &ss): Red (ss) {}

  Stek & operator+= (const Real &rr)
    { prvi = new Elem (rr, prvi); if (! posl) posl = prvi; return *this;}
};

#endif


// 990209.cpp #include "990209.h" void Red::kopiraj (const Red &rr) { prvi = posl = 0; for (Elem *tek=rr.prvi; tek; tek=tek->sled) posl = (posl ? posl->sled : prvi) = new Elem (*(tek->broj)); } void Red::brisi () { while (prvi) { Elem *stari = prvi; prvi = prvi->sled; delete stari; } posl = 0; } ostream & operator<< (ostream &dd, const Red &rr) { dd << '['; for (Red::Elem *tek=rr.prvi; tek; tek=tek->sled) { dd << *(tek->broj); if (tek->sled) dd << ','; } return dd << ']'; }
// 990209t.cpp #include "990209.h" #include <iostream.h> void main () { for (int dalje=1; dalje;) { try { cout<< "Vrsta kolekcije (Red, Stek, Gotovo)? "; char izb; cin >> izb; Red *rs=0; switch (izb) { case 'R': case 'r': rs = new Red; break; case 'S': case 's': rs = new Stek; break; case 'G': case 'g': dalje = 0; break; default: throw 1; } if (dalje) { for (int jos=1; jos;) { try { cout << "Vrsta podatka (Realan, Kompleksan, Gotovo)? "; char izb; cin >> izb; Real *rk=0; switch (izb) { case 'R': case 'r': rk = new Real; break; case 'K': case 'k': rk = new Cmplx; break; case 'G': case 'g': jos = 0; break; default: throw 1; } if (jos) { cout << "Vrednost podatka? "; cin >> *rk; *rs += *rk; delete rk; } } catch (int) { cout << "*** Neispravna vrsta podataka ***\n"; } } cout << "Procitano: " << *rs << endl; Cmplx zbir; try { while (1) {Real *rk = --*rs; zbir += *rk; delete rk; } } catch (Red::Greska) { cout << "Zbir podataka = " << zbir << "\n\n"; } delete rs; } } catch (int) { cout << "*** Neispravan izbor ***\n"; } } }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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