![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Друга група 15. 6. 2007. |
---|
I – Написати на језику C++ апстрактну класу за производе. Предвидети:
it<<proizvod
– пише се ознака врсте производа).
II – Написати на језику C++ класу за квадре као изведену класу из класе производа. Ознака врсте је K
. Два квадра су истоветна ако имају исте димензије. Квадар се у излазни ток пише у облику "K(
a,
b,
c)
". Поред могућности основне класе предвидети:
III – Написати на језику C++ класу за склопове као изведену класу из класе производа. Склоп може да садржи произвољан број производа. Ознака врсте је S
. Два склопа су истоветна ако садрже исте производе по истом редоследу. Склоп се у излазни ток пише у облику "S[
производ,…,
производ]
". Поред могућности основне класе предвидети:
sklop1=sklop2
),
IV – Написати на језику C++ класу за складишта која могу да садрже производе. Предвидети:
V – Написати на језику C++ програм који направи једно складиште, стави неколико производа у складиште, узима неколико производа из складишта и испише их на главном излазу. Користити константне параметре складишта и производа (не треба ништа читати с главног улаза).
Грешке пријављивати изузецима типа једноставних класа које могу да уписују поруке о грешкама у излазни ток.
ispitx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.N:
(Nastava
on
\\Xs200-2
) у каталогу ObjektnoProg\RSx
(x
је број радне станице за којим се ради).// 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!
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.