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

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

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

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

Пројектовати класу на језику C++ за неуређене листе тачака (NLista). Предвидети:

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

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


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


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

// 990513.h

#ifndef __990513__h__
#define __990513__h__

#include <iostream.h>
#include <math.h>

class Tacka2 {
protected:

  double x, y;

public:

  Tacka2 (double xx=0, double yy=0) { x = xx; y = yy; }

  ~Tacka2() {}

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

  virtual double operator+ () const { return sqrt (x*x + y*y); }

  virtual Tacka2 & operator+= (const Tacka2 &t2)
    { x += t2.x; y += t2.y; return *this; }

protected:

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

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

  friend istream & operator>> (istream &dd, Tacka2 &tt)
    { tt.citaj (dd); return dd; }

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


class Tacka3: public Tacka2 {

  double z;

public:

  Tacka3 (double xx=0, double yy=0, double zz=0): Tacka2 (xx,yy) { z = zz; }

  Tacka3 (const Tacka2 &t2): Tacka2 (t2) { z = 0; }

  Tacka2 *kopija () const { return new Tacka3 (*this); }

  double operator+ () const { return sqrt (x*x + y*y + z*z); }

  Tacka3 & operator+=(const Tacka2 &t3) {
    const Tacka3 &tt3 = (const Tacka3 &) t3;
    x += tt3.x; y += tt3.y; z += tt3.z; return *this;
  }

private:

  void citaj (istream &dd) { Tacka2::citaj (dd); dd >> z; }

  void pisi (ostream &dd) const
    { dd << '(' << x << ',' << y << ',' << z << ')'; }
};


class NLista {
protected:

  struct Elem { Tacka2 *obj; Elem *sled;
                Elem (const Tacka2 &t2, Elem *ss=0)
                  { obj=t2.kopija(); sled=ss; }
                ~Elem () { delete obj; }
              };

  Elem *prvi;

  void kopiraj (const NLista &nl);

  void brisi ();

 public:

  NLista () { prvi = 0; }

  NLista (const Tacka2 &t2) { prvi = new Elem (t2); }

  NLista (const NLista &nl) {kopiraj(nl);}

  ~NLista () { brisi (); }

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

  virtual NLista & operator+= (const Tacka2 &t2) {
    prvi = new Elem (t2, prvi);
    return *this;
  }

  friend ostream & operator<< (ostream &dd, const NLista &nl);
};


class ULista: public NLista {
public:

  ULista (): NLista () {}

  ULista (const ULista &ul): NLista (ul) {}

  ULista & operator+= (const Tacka2 &t2);
};

#endif


// 990513.cpp #include "990513.h" void NLista::kopiraj (const NLista &nl) { Elem* posl = prvi = 0; for (Elem *tek=nl.prvi; tek; tek=tek->sled) posl = (posl ? posl->sled : prvi) = new Elem (*(tek->obj)); } void NLista::brisi () { while (prvi) { Elem *stari = prvi; prvi = prvi->sled; delete stari; } } ostream & operator<< (ostream &dd, const NLista &nl) { dd << '['; for (NLista::Elem *tek=nl.prvi; tek; tek=tek->sled) { dd << *(tek->obj); if (tek->sled) dd << ','; } return dd << ']'; } ULista & ULista::operator+= (const Tacka2 &t2) { for (Elem *tek=prvi, *preth=0; tek && +*tek->obj<+t2; preth=tek, tek=tek->sled); (preth ? preth->sled : prvi) = new Elem (t2, tek); return *this; }
// 990513t.cpp #include "990513.h" #include <iostream.h> void main () { for (int dalje=1; dalje;) { try { cout<< "Vrsta liste (Neuredjena, Uredjena, Gotovo)? "; char izb; cin >> izb; NLista *lista=0; switch (izb) { case 'N': case 'n': lista = new NLista; break; case 'U': case 'u': lista = new ULista; break; case 'G': case 'g': dalje = 0; break; default: throw 1; } if (dalje) { for (int jos=1; jos;) { try { cout << "Vrsta tacke (2-dim, 3-dim, Gotovo)? "; char izb; cin >> izb; Tacka2 *tacka=0; switch (izb) { case '2': tacka = new Tacka2; break; case '3': tacka = new Tacka3; break; case 'G': case 'g': jos = 0; break; default: throw 1; } if (jos) { cout << "Koordinate tacke? "; cin >> *tacka; *lista += *tacka; delete tacka; } } catch (int) { cout << "*** Neispravna vrsta tacaka ***\n"; } } cout << "Procitano: " << *lista << endl; delete lista; } } catch (int) { cout << "*** Neispravan izbor ***\n"; } } }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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