![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Друга група 14. 6. 2005. |
|---|
I – Пројектовати на језику C++ апстракну класу Predmet за предмете. Предвидети:
dat<<predmet).
II – Пројектовати на језику C++ класу Stek за стекове предмета ограничених капацитета. Предвидети:
stek1=stek2),
+stek),
stek[ind] – индекси расту од врха ка дну стека) – приступ непостојећем предмету је грешка,
dat<<stek).
III – Пројектовати на језику C++ класу Kupa као изведену класу из класе Predmet. Величина купе је једнака запремини купе (V = r2πh/3). Поред могућности основне класе предвидети:
IV – Саставити на језику C++ главни програм који:
Грешке пријављивати изузецима типа једноставних класа. Предвидети исписивање поруке о грешци.
studentx (x је број радне станице за којим се ради). Лозинка на свакој радној станици је student.N: (Nastava on \\Xs200-2) у каталогу ObjektnoProg\RSx (x је број радне станице за којим се ради).
// predmet.h
#ifndef _predmet_h_
#define _predmet_h_
#include <iostream>
using namespace std;
class Predmet {
public:
virtual ~Predmet () {}
virtual Predmet* kopija () const =0;
virtual double velicina () const =0;
private:
virtual void pisi (ostream& d) const =0;
friend ostream& operator<< (ostream& d, const Predmet& p) { p.pisi (d); return d; }
};
#endif
// stek.h
#ifndef _stek_h_
#define _ste_h_
#include "predmet.h"
#include <iostream>
using namespace std;
class GStek {
virtual void pisi (ostream& d) const =0;
friend ostream& operator<< (ostream& d, const GStek& g) { g.pisi (d); return d; }
};
class GStekPun: public GStek {
void pisi (ostream& d) const { d << "*** Stek je pun!"; }
};
class GStekPrazan: public GStek {
void pisi (ostream& d) const { d << "*** Stek je prazan!"; }
};
class GStekIndeks: public GStek {
void pisi (ostream& d) const { d << "*** Nedoszoljen indeks!"; }
};
class Stek {
Predmet** niz; int kap, vrh;
void kopiraj (const Stek& s);
void brisi ();
public:
explicit Stek (int k=3) { niz = new Predmet* [kap = k]; vrh = 0; }
Stek (const Stek& s) { kopiraj (s); }
~Stek () { brisi (); }
Stek& operator= (const Stek& s) {
if (this != &s) { brisi (); kopiraj (s); }
return *this;
}
int operator+ () const {return vrh; }
Stek& stavi (const Predmet& p) {
if (vrh == kap) throw GStekPun ();
niz[vrh++] = p.kopija ();
return *this;
}
Predmet* uzmi () {
if (vrh == 0) throw GStekPrazan ();
return niz[--vrh];
}
Predmet& operator[] (int ind) {
if (ind<0 || ind>=vrh) throw GStekIndeks ();
return *niz[vrh-1-ind];
};
const Predmet& operator[] (int ind) const {
if (ind<0 || ind>=vrh) throw GStekIndeks ();
return *niz[vrh-1-ind];
};
friend ostream& operator<< (ostream& d, const Stek& s);
};
#endif
// stek.cpp
#include "stek.h"
void Stek::kopiraj (const Stek& s) {
niz = new Predmet* [kap = s.kap]; vrh = s.vrh;
for (int i=0; i<vrh; i++) niz[i] = s.niz[i]->kopija ();
}
void Stek::brisi () {
for (int i=0; i<vrh; delete niz[i++]);
delete [] niz;
}
ostream& operator<< (ostream& d, const Stek& s) {
for (int i=s.vrh-1; i>=0; d<<*s.niz[i--]<<' ');
return d;
}
// kupa.h
#ifndef _kupa_h_
#define _kupa_h_
class GKupa {
friend ostream& operator<< (ostream& d, const GKupa& g)
{ d << "*** Neispravan parametar!"; }
};
class Kupa: public Predmet {
double r, h;
public:
explicit Kupa (double rr=1, double hh=1) {
if (rr<=0 || hh<=0) throw GKupa ();
r = rr; h = hh;
}
Kupa* kopija () const { return new Kupa (*this); }
double velicina () const { return r * r * 3.14159 * h / 3; }
private:
void pisi (ostream& d) const { d << "K(" << r << ',' << h << ')'; }
};
#endif
// glavni.cpp
#include "stek.h"
#include "kupa.h"
#include <iostream>
using namespace std;
int main () {
cout << "Kapacitet? "; int k; cin >> k;
Stek s (k);
double sr = 0; int n = 0; bool kraj = false;
while (!kraj) {
try {
cout << "Izbor (S - stavi, U - uzmi, Z - zavrsi)? ";
char izb; cin >> izb;
switch (izb) {
case 'S': cout << "r,h? ";
double r, h; cin >> r >> h;
s.stavi (Kupa (r,h)); break;
case 'U': { Predmet* p = s.uzmi ();
cout << "predmet: " << *p << endl;
sr += p->velicina (); n++;
delete p; break;
}
case 'Z': kraj = true; break;
default: throw "*** Neispravan izbor!";
}
} catch (const GStek& g) { cout << g << endl;
} catch (const GKupa& g) { cout << g << endl;
} catch (const char* g) { cout << g << endl;
}
}
if (n) sr /= n;
cout << "Srednje velicina: " << sr << endl;
return 0;
}
Kapacitet? 3
Izbor (S - stavi, U - uzmi, Z - zavrsi)? u
*** Neispravan izbor!
Izbor (S - stavi, U - uzmi, Z - zavrsi)? U
*** Stek je prazan!
Izbor (S - stavi, U - uzmi, Z - zavrsi)? S
r,h? 2 4
Izbor (S - stavi, U - uzmi, Z - zavrsi)? S
r,h? 2 5
Izbor (S - stavi, U - uzmi, Z - zavrsi)? S
r,h? 5 6
Izbor (S - stavi, U - uzmi, Z - zavrsi)? S
r,h? 2 5
*** Stek je pun!
Izbor (S - stavi, U - uzmi, Z - zavrsi)? U
predmet: K(5,6)
Izbor (S - stavi, U - uzmi, Z - zavrsi)? U
predmet: K(2,5)
Izbor (S - stavi, U - uzmi, Z - zavrsi)? Z
Srednje velicina: 89.0117
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.