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

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

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

I – Написати на језику C++ апстрактну класу за производе. Предвидети:

  1. уништавање производа,
  2. дохватање једнословне ознаке врсте производа,
  3. испитивање да ли су два производа истоветна (производи су истоветни ако су исте врсте),
  4. одређивање запремине производа,
  5. стварање динамичке копије производа,
  6. уписивање производа у излазни ток (it<<proizvod – пише се ознака врсте производа).

II – Написати на језику C++ класу за квадре као изведену класу из класе производа. Ознака врсте је K. Два квадра су истоветна ако имају исте димензије. Квадар се у излазни ток пише у облику "K(a,b,c)". Поред могућности основне класе предвидети:

  1. иницијализацију квадра задатим дужинама ивица.

III – Написати на језику C++ класу за склопове као изведену класу из класе производа. Склоп може да садржи произвољан број производа. Ознака врсте је S. Два склопа су истоветна ако садрже исте производе по истом редоследу. Склоп се у излазни ток пише у облику "S[производ,,производ]". Поред могућности основне класе предвидети:

  1. иницијализацију празног склопа,
  2. иницијализацију склопа другим склопом,
  3. доделу вредности једног склопа другом склопу (sklop1=sklop2),
  4. додавање производа склопу.

IV – Написати на језику C++ класу за складишта која могу да садрже производе. Предвидети:

  1. иницијализацију празног складишта задатом дозвољеном укупном запремином садржаних производа и бројем места за производе (подразумевано 10),
  2. спречавање да се направи копија складишта на било који начин,
  3. уништавање складишта,
  4. стављање производа на прво слободно место у складишту (не прави се копија производа – складиште постаје власник производа – грешка је ако у складишту нема слободног места или ако би се прекорачила дозвољена укупна запремина производа),
  5. узимање из складишта првог производа који је истоветан датом производу (грешка је ако нема таквог производа).

V – Написати на језику C++ програм који направи једно складиште, стави неколико производа у складиште, узима неколико производа из складишта и испише их на главном излазу. Користити константне параметре складишта и производа (не треба ништа читати с главног улаза).

Грешке пријављивати изузецима типа једноставних класа које могу да уписују поруке о грешкама у излазни ток.


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


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

// proizvod.h

#ifndef _proizvod_h_
#define _proizvod_h_
#include <iostream>
using namespace std;

class Proizvod {
public:
  virtual ~Proizvod () {}
  virtual char vrsta () const =0;
  virtual bool isti (const Proizvod& p) const { return vrsta() == p.vrsta (); }
  virtual double zapr () const =0;
  virtual Proizvod* kopija () const =0;
protected:
  virtual void pisi (ostream& it) const {it<<vrsta();}
  friend ostream& operator<< (ostream& it, const
    Proizvod& p) { p.pisi (it); return it; }
};

#endif

// kvadar.h #ifndef _kvadar_h_ #define _kvadar_h_ #include "proizvod.h" class Kvadar: public Proizvod {double a, b, c; void pisi (ostream& it) const { Proizvod::pisi (it); it << '(' << a << ',' << b << ',' << c << ')'; } public: Kvadar (double p, double q, double r) { a = p; b = q; c = r; } char vrsta () const { return 'K'; } bool isti (const Proizvod& p) const { if (! Proizvod::isti(p)) return false; const Kvadar& k = static_cast<const Kvadar&>(p); return a==k.a && b==k.b && c==k.c; } double zapr () const { return a * b * c; } Kvadar* kopija () const { return new Kvadar(*this); } }; #endif
// sklop.h #ifndef _sklop_h_ #define _sklop_h_ #include "proizvod.h" class Sklop: public Proizvod { struct Elem { Proizvod* p; Elem* sled; Elem (Proizvod* pp) { p = pp; sled = 0; } ~Elem () { delete p; } }; Elem *prvi, *posl; void kopiraj (const Sklop& s); void brisi (); void pisi (ostream& it) const; public: Sklop () { prvi = posl = 0; } Sklop (const Sklop& s) { kopiraj (s); } ~Sklop () { brisi (); } Sklop& operator= (const Sklop& s) { if (this != &s) { brisi (); kopiraj (s); } return *this; } char vrsta () const { return 'S'; } bool isti (const Proizvod& p) const; double zapr () const; Sklop* kopija () const { return new Sklop (*this); } Sklop& dodaj (const Proizvod& p) { Elem *novi = new Elem (p.kopija ()); posl = (!prvi ? prvi : posl->sled) = novi; return *this; } }; #endif
// sklop.cpp #include "sklop.h" void Sklop::kopiraj (const Sklop& s) { prvi = posl = 0; for (Elem* tek=s.prvi; tek; tek=tek->sled) dodaj (*tek->p); } void Sklop::brisi () { while (prvi) { Elem* stari = prvi; prvi = prvi->sled; delete stari; } posl = 0; } void Sklop::pisi (ostream& it) const { Proizvod::pisi (it); it << '['; for (Elem* tek=prvi; tek; tek=tek->sled) { it << *tek->p; if (tek->sled) it << ','; } it << ']'; } bool Sklop::isti (const Proizvod& p) const { if (! Proizvod::isti(p)) return false; const Sklop& s = static_cast<const Sklop&>(p); Elem *tek1 = prvi, *tek2 = s.prvi; while (tek1 && tek2) { if (! tek1->p->isti(*tek2->p)) return false; tek1 = tek1->sled; tek2 = tek2->sled; } return !tek1 && !tek2; } double Sklop::zapr () const { double z = 0; for (Elem* tek=prvi; tek; tek=tek->sled) z += tek->p->zapr (); return z; }
// skladiste.h #ifndef _skladiste_h_ #define _skladiste_h_ #include "proizvod.h" #include <iostream> using namespace std; class GNemaMesta{}; inline ostream& operator<< (ostream& it, const GNemaMesta&) { return it << "*** Nema mesta!"; } class GZapr{}; inline ostream& operator<< (ostream& it, const GZapr&) { return it << "*** Prekoracenje zapremine!"; } class GNemaProizv{}; inline ostream& operator<< (ostream& it, const GNemaProizv&) { return it << "*** Nema proizvoda!"; } class Skladiste { Proizvod** niz; int kap; double maxZapr, trenZapr; Skladiste (const Skladiste&) {} void operator= (const Skladiste&) {} public: explicit Skladiste (double maxV, int k=10); ~Skladiste (); Skladiste& stavi (Proizvod* p); Proizvod* uzmi (const Proizvod& uzorak); }; #endif
// skladiste.cpp #include "skladiste.h" Skladiste::Skladiste (double maxV, int k) { niz = new Proizvod* [kap = k]; for (int i=0; i<kap; niz[i++]=0); maxZapr = maxV; trenZapr = 0;; } Skladiste::~Skladiste () { for (int i=0; i<kap; delete niz[i++]); Skladiste& Skladiste::stavi (Proizvod* p) { if (trenZapr + p->zapr() > maxZapr) throw GZapr (); int i = 0; while (i<kap && niz[i]) i++; if (i == kap) throw GNemaMesta (); niz[i] = p; trenZapr += p->zapr (); return *this; } Proizvod* Skladiste::uzmi (const Proizvod& uzorak) { int i = 0; while (i<kap && (!niz[i] || !niz[i]->isti(uzorak))) i++; if (i == kap) throw GNemaProizv (); Proizvod* p=niz[i]; niz[i]=0; trenZapr-=p->zapr(); return p; }
// program.cpp #include "kvadar.h" #include "sklop.h" #include "skladiste.h" #include <iostream> using namespace std; int main () { Skladiste sklad (200, 10); Kvadar k (1,2,3); Sklop s; s.dodaj (Kvadar (2,2,2)).dodaj (Kvadar (3,2,1)); try { sklad.stavi (k.kopija()) .stavi (s.kopija()) .stavi (s.kopija()) .stavi (k.kopija()); cout << *sklad.uzmi(k) << endl; cout << *sklad.uzmi(s) << endl; cout << *sklad.uzmi(k) << endl; cout << *sklad.uzmi(k) << endl; } catch (GNemaMesta g) { cout << g << endl; } catch (GZapr g) { cout << g << endl; } catch (GNemaProizv g) { cout << g << endl; } return 0; }
K(1,2,3) S[K(2,2,2),K(3,2,1)] K(1,2,3) *** Nema proizvoda!
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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