![]() Ласло Краус |
Објектно програмирање 1 - колоквијуми Други колоквијум 15. 6. 2012. |
|---|
Написати на језику C++ следеће класе (класе опремити оним конструкторима, деструктором и оператором за доделу вредности који су потребни за безбедно коришћење класа; грешке пријављивати изузецима типа једноставних класа које су опремљене исписивањем поруке):
it<<pred).
(запремина,тежина).
kut+=pred; грешка је ако би се прекорачило дозвољен број предмета или запремина кутије). При уписивању у излазни ток у први ред се уписује 20 знакова '^', у други ред подаци о кутији у облику [запремина,сопственаТежина,бројПредмета], затим се уписују поједини садржани предмети ред по ред и на крају ред од 20 знакова 'v'.
kam+=kut; грешка је ако би се прекорачио дозвољен број кутија, запремина товарног простора или носивост). У излазни ток у први ред се уписују подаци о камиону у облику регОзнака(запремина,носивост), а затим садржане кутије у засебне редове. Камион не сме да се копира ни на који начин.
Написати на језику C++ програм који направи кутију која садржи један артикал и једну кутију са два артикла, стави неколико примерака те кутије у један камион и испише камион на главном излазу. Користити константне параметре (не треба ништа учитавати с главног улаза).
ispitx (x је број радне станице за којим се ради). Лозинка на свакој радној станици је student.Z.
// predmet.h
#ifndef _predmet_h_
#define _predmet_h_
#include <iostream>
using namespace std;
class Predmet {
public:
virtual ~Predmet() {}
virtual double V() const =0;
virtual double Q() const =0;
virtual Predmet* kopija() const =0;
private:
virtual void pisi(ostream& it) const =0;
friend ostream& operator<<(ostream& it, const Predmet& p)
{ p.pisi(it); return it; }
};
#endif
// artikal.h
#ifndef _artikal_h_
#define _artikal_h_
#include "predmet.h"
#include <iostream>
#include <cstring>
using namespace std;
class Artikal: public Predmet {
char* naz; double zapr, tez;
void kopiraj(const char* n, double z, double t) {
naz = new char [strlen(n)+1]; strcpy(naz, n);
zapr = z; tez = t;
}
void brisi() { delete [] naz; }
void pisi(ostream& it) const
{ it << naz << '(' << zapr << ',' << tez << ')'; }
public:
explicit Artikal(const char* n, double z, double t)
{ kopiraj(n, z, t); }
Artikal(const Artikal& a) { kopiraj(a.naz, a.zapr, a.tez); }
~Artikal() { brisi(); }
Artikal& operator=(const Artikal& a) {
if (this != &a) { brisi(); kopiraj(a.naz,a.zapr,a.tez); }
return *this;
}
double V() const { return zapr; }
double Q() const { return tez; }
Artikal* kopija() const {return new Artikal(*this);}
};
#endif
// gnemoze.h
#ifndef _gnemoze_
#define _gnemoze_
#include <iostream>
using namespace std;
class GNeMoze {};
inline ostream& operator<<(ostream& it, const GNeMoze&)
{ return it << "*** Ne moze da se stavi!"; }
#endif
// kutija.h
#ifndef _kutija_h_
#define _kutija_h_
#include "predmet.h"
#include <iostream>
using namespace std;
class Kutija: public Predmet {
double a, b, c, tez;
Predmet** niz; int kap, br;
void kopiraj(const Kutija& k);
void brisi();
void pisi(ostream& it) const;
public:
explicit Kutija(double aa=10, double bb=10,
double cc=10, double tt=1, int k=3) {
a = aa; b = bb; c = cc; tez = tt; br = 0;
niz = new Predmet* [kap = k];
}
Kutija(const Kutija& k) { kopiraj(k); }
~Kutija() { brisi(); }
Kutija& operator=(const Kutija& k) {
if (this != &k) { brisi(); kopiraj(k); }
return *this;
}
double V() const { return a * b * c; }
double Q() const;
Kutija* kopija() const { return new Kutija(*this); }
Kutija& operator+=(const Predmet& p);
};
#endif
// kutija.cpp
#include "kutija.h"
#include "gnemoze.h"
void Kutija::kopiraj(const Kutija& k) {
a = k.a; b = k.b; c = k.c; tez = k.tez; br = k.br;
niz = new Predmet* [kap = k.kap];
for (int i=0; i<br; i++) niz[i] = k.niz[i]->kopija();
}
void Kutija::brisi() {
for (int i=0; i<br; delete niz[i++]);
delete [] niz;
}
void Kutija::pisi(ostream& it) const {
it << "^^^^^^^^^^^^^^^^^^^^\n";
it << '[' << V() << ',' << tez << ',' << br << "]\n";
for (int i=0; i<br; it<<*niz[i++]<<endl);
it << "vvvvvvvvvvvvvvvvvvvv";
}
double Kutija::Q() const {
double q = tez;
for (int i=0; i<br; q+=niz[i++]->Q());
return q;
}
Kutija& Kutija::operator+=(const Predmet& p) {
double v = p.V();
for (int i=0; i<br; v+=niz[i++]->V());
if (br==kap || v>V()) throw GNeMoze();
niz[br++] = p.kopija();
return *this;
}
// kamion.h
#ifndef _kamion_h_
#define _kamion_h_
#include "kutija.h"
#include <iostream>
#include <cstring>
using namespace std;
class Kamion {
char* regOzn; double zapr, nos;
Kutija* niz; int kap, br;
Kamion(const Kamion&) {}
void operator=(const Kamion&) {}
public:
Kamion(const char* ozn, int k, double z, double n) {
regOzn = new char [strlen(ozn)+1];
strcpy(regOzn, ozn);
niz = new Kutija [kap = k];
br = 0; zapr = z, nos = n;
}
~Kamion() { delete [] regOzn; delete [] niz; }
Kamion& operator+=(const Kutija& k);
friend ostream& operator<<(ostream& it, const Kamion& k);
};
#endif
// kamion.cpp
#include "kamion.h"
#include "gnemoze.h"
Kamion& Kamion::operator+=(const Kutija& k) {
double v = k.V(), q = k.Q();
for (int i=0; i<br; i++) { v += niz[i].V(); q += niz[i].Q(); }
if (br==kap || v>zapr || q>nos) throw GNeMoze();
niz[br++] = k;
return *this;
}
ostream& operator<<(ostream& it, const Kamion& k) {
it << k.regOzn << '(' << k.zapr << ','<<k.nos<<")\n";
for (int i=0; i<k.br; it<<k.niz[i++]<<endl);
return it;
}
// program.cpp
#include "artikal.h"
#include "kutija.h"
#include "kamion.h"
#include "gnemoze.h"
#include <iostream>
using namespace std;
int main() {
Kamion kam("BG123AB", 3, 200, 300);
try {
Kutija kut(2, 3, 4, 5);
kut += Artikal("reso", 2, 1);
Kutija k(2, 3, 2, 3);
k += Artikal("serpa", 3, 2);
k += Artikal("lonac", 5, 3);
kut += k;
for (int i=0; i<5; i++)
kam += kut;
} catch (GNeMoze g) {
cout << g << endl;
}
cout << kam << endl;
return 0;
}
*** Ne moze da se stavi!
BG123AB(200,300)
^^^^^^^^^^^^^^^^^^^^
[24,5,2]
reso(2,1)
^^^^^^^^^^^^^^^^^^^^
[12,3,2]
serpa(3,2)
lonac(5,3)
vvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvv
^^^^^^^^^^^^^^^^^^^^
[24,5,2]
reso(2,1)
^^^^^^^^^^^^^^^^^^^^
[12,3,2]
serpa(3,2)
lonac(5,3)
vvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvv
^^^^^^^^^^^^^^^^^^^^
[24,5,2]
reso(2,1)
^^^^^^^^^^^^^^^^^^^^
[12,3,2]
serpa(3,2)
lonac(5,3)
vvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvv
(садржај)
Copyright © 2013, Laslo Kraus
Последња ревизија: 17.4.2013.