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

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

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

Пројектовати на језику C++ апстрактну класу за предмете (Predmet) у којој је предвиђено да све изведене класе имају следеће могућности:
  1. формирање копије предмета у динамичкој меморији,
  2. израчунавање тежине предмета (унарни +),
  3. уништавање предемета, и
  4. писање садржаја предмета у неки излазни ток (<<).
Пројектовати на језику C++ класу за просте предмете (Prost) као изведену класу из класе за предмете. Прости предмети су описани специфичном тежином и запремином. Поред могућности наслеђених из основне класе, предвидети:
  1. формирање празног простог предмета,
  2. иницијализацију простог предмета задатом запремином и специфичном тежином са јединичним подразумеваним вредностима,
  3. иницијализацију простог предмета другим простим предметом, и
  4. доделу вредности једног простог предмета другом (=).
Пројектовати на језику C++ класу за сложене предмете (Slozen) као изведену класу из класе предмета. Сложен предмет се састоји од произвољног броја предмета (простих и сложених). Поред могућности наслеђених из основне класе, предвидети:
  1. формирање празног сложеног предмета,
  2. иницијализацију сложеног предмета другим простим предметом или сложеним предметом,
  3. доделу вредности једног сложеног предмета другом (=), и
  4. додавање простог или сложеног предмета сложеном предмету уз чување редоследа додавања (+=).
Пројектовати на језику C++ класу за уређене сложене предмете (USlozen) као изведену класу из класе сложених предмета са истим могућностима као и оснвна класа. Подаци о компонентним предметима треба да су уређени по тежинама тих предмета.

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


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


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

// 990701.h

#ifndef __990701__h__
#define __990701__h__

#include <iostream.h>

class Predmet {
public:
  virtual Predmet *kopija () const =0;

  virtual double operator+ () const =0;

  virtual ~Predmet () {}

private:

  virtual void pisi  (ostream &dd) const =0;

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


class Prost: public Predmet {

  double v, ro;

public:

  Prost (double vv=1, double rro=1) { v = vv; ro = rro; }

  Predmet *kopija () const { return new Prost (*this); }

  double operator+ () const { return v * ro; }

protected:

  void pisi (ostream &dd) const { dd << '(' << v << ',' << ro << ')'; }
};


class Slozen: public Predmet {
protected:

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

  Elem *prvi, *posl;

  void kopiraj (const Slozen &ss);

  void brisi ();

public:

  Slozen () { prvi = posl = 0; }

  Slozen (const Prost &pp) { prvi = posl = new Elem (pp); }

  Slozen (const Slozen &ss) { kopiraj (ss); }

  ~Slozen () { brisi (); }

  Slozen & operator= (const Slozen &ss) {
    if (this != &ss) { brisi (); kopiraj (ss); }
    return *this;
  }

  Predmet *kopija () const { return new Slozen (*this); }

  double operator+ () const;

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

protected:

  void pisi (ostream &dd) const;
};

class USlozen: public Slozen {
public:

  USlozen (): Slozen() {}

  USlozen (const Prost &pp): Slozen(pp) {}

  USlozen (const Slozen &ss): Slozen(ss) {}

  USlozen & operator= (const Slozen &ss) {
    if (this != &ss) { brisi (); kopiraj ((const Slozen &)ss); }
    return *this;
  }

  USlozen & operator+=(const Predmet &pp);
};

#endif


// 990701.cpp #include "990701.h" void Slozen::kopiraj (const Slozen &ss) { Elem* posl = prvi = 0; for (Elem *tek=ss.prvi; tek; tek=tek->sled) posl = (posl ? posl->sled : prvi) = new Elem (*(tek->predm)); } void Slozen::brisi () { while (prvi) { Elem *stari = prvi; prvi = prvi->sled; delete stari; } } double Slozen::operator+ () const { double q=0; for (Elem *tek=prvi; tek; tek=tek->sled) q += +*tek->predm; return q; } void Slozen::pisi (ostream &dd) const { dd << '['; for (Elem *tek=prvi; tek; tek=tek->sled) { dd << *(tek->predm); if (tek->sled) dd << ','; } dd << ']'; } USlozen & USlozen::operator+= (const Predmet &pp) { for (Elem *tek=prvi, *preth=0; tek && +*tek->predm<+pp; preth=tek, tek=tek->sled); (preth ? preth->sled : prvi) = new Elem (pp, tek); return *this; }
// 990701t.cpp #include "990701.h" #include <iostream.h> void main () { for (int dalje=1; dalje;) { try { cout<< "Vrsta sklopa (Neuredjena, Uredjena, Gotovo)? "; char izb1; cin >> izb1; Slozen *sklop=0; switch (izb1) { case 'N': case 'n': sklop = new Slozen; break; case 'U': case 'u': sklop = new USlozen; break; case 'G': case 'g': dalje = 0; break; default: throw 1; } if (dalje) { for (int jos=1; jos;) { try { cout << "Vrsta predmeta (Prost, Slozen, Gotovo)? "; char izb2; cin >> izb2; switch (izb2) { case 'p': case 'P': { double v, ro; cout << "V, Ro? "; cin >> v >> ro; *sklop += Prost (v, ro); break; } case 's': case 'S': { Slozen *slozen = (izb1 == 'N' || izb1 == 'n') ? new Slozen : new USlozen; while (1) { double v, ro; cout << "V, Ro? "; cin >> v >> ro; if (v<0 || ro < 0) break; *slozen += Prost (v, ro); } *sklop += *slozen; break; } case 'G': case 'g': jos = 0; break; default: throw 1; } } catch (int) { cout << "*** Neispravna vrsta predmeta ***\n"; } } cout << "Sklop= " << *sklop << endl << "Tezina= " << +*sklop << endl; } } catch (int) { cout << "*** Neispravan izbor ***\n"; } } }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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