![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Друга група 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.