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

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

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

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

Пројектовати на језику C++ класу за уређене листе (ULista) геометријских објеката (правоугаоника и квадара) на основу њихових површина. Предвидети:

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

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


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


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

// 990618.h

#ifndef __990618__h__
#define __990618__h__

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

class Pravoug {
protected:

  double a, b;

public:

  Pravoug (double aa=1, double bb=1) { a = aa; b = bb; }

  ~Pravoug() {}

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

  virtual double operator+ () const { return a*b; }

  virtual Pravoug & operator*= (double k)
    { a *= k; b *= k; return *this; }

protected:

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

  virtual void pisi (ostream &dd) const
    { dd << '(' << a << ',' << b << ')'; }

  friend istream & operator>> (istream &dd, Pravoug &pp)
    { pp.citaj (dd); return dd; }

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


class Kvadar: public Pravoug {

  double c;

public:

  Kvadar (double aa=1, double bb=1, double cc=1): Pravoug (aa,bb) { c = cc; }

  Kvadar (const Pravoug &pp): Pravoug (pp) { c = 1; }

  Pravoug *kopija () const { return new Kvadar (*this); }

  double operator+ () const { return 2 * (a*b + b*c + c*a); }

  Kvadar & operator+=(const Pravoug &t3) {
    *this += t3; c *= ((const Kvadar &)t3).c; return *this;
  }

private:

  void citaj (istream &dd) { Pravoug::citaj (dd); dd >> c; }

  void pisi (ostream &dd) const
    { dd << '(' << a << ',' << b << ',' << c << ')'; }
};


class ULista {
protected:

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

  Elem *prvi, *posl;

  void kopiraj (const ULista &ul);

  void brisi ();

public:

  ULista () { prvi = posl = 0; }

  ULista (const Pravoug &pp) { prvi = new Elem (pp); }

  ULista (const ULista &ul) {kopiraj(ul);}

  ~ULista () { brisi (); }

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

  virtual ULista & operator+= (const Pravoug &pp);

  friend ostream & operator<< (ostream &dd, const ULista &ul);
};


class NLista: public ULista {
public:

  NLista (): ULista () {}

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

  virtual NLista & operator+= (const Pravoug &pp) {
    posl = (posl ? posl->sled : prvi) = new Elem (pp);
    return *this;
  }
};

#endif


// 990618.cpp #include "990618.h" void ULista::kopiraj (const ULista &ul) { Elem* posl = prvi = 0; for (Elem *tek=ul.prvi; tek; tek=tek->sled) posl = (posl ? posl->sled : prvi) = new Elem (*(tek->obj)); } void ULista::brisi () { while (prvi) { Elem *stari = prvi; prvi = prvi->sled; delete stari; } } ostream & operator<< (ostream &dd, const ULista &ul) { dd << '['; for (ULista::Elem *tek=ul.prvi; tek; tek=tek->sled) { dd << *(tek->obj); if (tek->sled) dd << ','; } return dd << ']'; } ULista & ULista::operator+= (const Pravoug &pp) { for (Elem *tek=prvi, *preth=0; tek && +*tek->obj<+pp; preth=tek, tek=tek->sled); (preth ? preth->sled : prvi) = new Elem (pp, tek); return *this; }
// 990618t.cpp #include "990618.h" #include <iostream.h> void main () { for (int dalje=1; dalje;) { try { cout<< "Vrsta liste (Neuredjena, Uredjena, Gotovo)? "; char izb; cin >> izb; ULista *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 objekta (Pravougaonik, Kvadar, Gotovo)? "; char izb; cin >> izb; Pravoug *obj=0; switch (izb) { case 'p': case 'P': obj = new Pravoug; break; case 'k': case 'K': obj = new Kvadar; break; case 'G': case 'g': jos = 0; break; default: throw 1; } if (jos) { cout << "Duzine stranica? "; cin >> *obj; *lista += *obj; delete obj; } } 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.