![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Друга група 9. 6. 2004. |
|---|
I - Пројектовати на језику C++ апстракну класу Predmet за предмете. Предвидети:
II - Пројектовати на језику C++ класу Niz за низове предмета. Предвидети:
niz1=niz2),
+niz),
niz+=br) - ако се низ препуни, повећати капацитет за 10%, али најмање за 5 места,
niz[ind]) - приступ непостојећем елементу је грешка,
d<<niz).
Грешке пријављивати изузецима помоћу објектака типа једноставних класа.
III - Пројектовати на језику C++ класу Kvadrat као изведену класу из класе Predmet. Поред могућности основне класе предвидети:
IV - Саставити на језику C++ главни програм који:
studentx (x је број радне станице за којим се ради). Лозинка на свакој радној станици је student.N: (Nastava on \\Xs200-2) у каталогу ObjektnoProg\RSx (x је број радне станице за којим се ради).
// predmet.h - Klasa apstraktnih predmeta
#ifndef _predmet_h_
#define _predmet_h_
#include <iostream>
using namespace std;
class Predmet {
virtual void pisi (ostream& d) const=0;
public:
virtual Predmet* kopija () const =0;
virtual ~Predmet () {}
friend ostream& operator<< (ostream& d, const Predmet& p)
{ p.pisi (d); return d; }
};
#endif
// niz.h - Klasa nizova apstraktnih predmeta.
#ifndef _niz_h_
#define _niz_h_
#include "predmet.h"
#include <iostream>
using namespace std;
class GIndeks {};
class Niz {
Predmet **a; int n, k;
void kopiraj (const Niz &niz);
void brisi ();
public:
explicit Niz (int kk=3) { a = new Predmet* [k = kk]; n = 0; }
Niz (const Niz& niz) { kopiraj (niz); }
virtual ~Niz () { brisi (); }
Niz& operator= (const Niz& niz) {
if (this != &niz) { brisi (); kopiraj (niz); }
return *this;
}
int operator+ () const { return n; }
virtual Niz& operator+= (const Predmet& p);
Predmet*& operator[] (int i) {
if (i<0 || i>=n) throw GIndeks ();
return a[i];
}
const Predmet* operator[] (int i)const{
if (i<0 || i>=n) throw GIndeks ();
return a[i];
}
friend ostream& operator<< (ostream& d, const Niz& niz);
};
#endif
// niz.cpp - Klasa nizova apstraktnih predmeta.
#include "niz.h"
void Niz::kopiraj (const Niz &niz) {
a = new Predmet* [n = niz.n];
for (int i=0; i<n; i++) a[i]=niz.a[i]->kopija();
}
void Niz::brisi () {
for (int i=0; i<n; delete niz[i++]);
delete [] niz;
}
Niz& Niz::operator+= (const Predmet& p) {
if (n == k) {
k += k<50 ? 5 : k/10;
Predmet** p = new Predmet* [k];
for (int i=0; i<n; i++) p[i] = a[i];
delete [] a; a = p;
}
a[n++] = p.kopija ();
return *this;
}
ostream& operator<< (ostream& d, const Niz& niz) {
for (int i=0; i<niz.n; i++) d << *niz.a[i] << ' ';
return d;
}
// kvadrat.h - Klasa kvadrata.
#ifndef _kvadrat_h_
#define _kvadrat_h_
#include "predmet.h"
class GStranica {};
class Kvadrat: public Predmet {
double a;
void pisi (ostream& d) const { d << "K(" << a <<')'; }
public:
Kvadrat (double aa = 1) {
if (aa<=0) throw GStranica ();
a = aa;
}
Kvadrat* kopija () const { return new Kvadrat (*this); }
double S () const { return a * a; }
};
#endif
// predmett.cpp - Ispitivanje klasa predmeta.
#include "niz.h"
#include "kvadrat.h"
#include <iostream>
using namespace std;
int main () {
Niz niz;
try {
while (true) {
cout << "Kvadrat (a)? "; double a; cin >> a;
niz += Kvadrat (a);
}
} catch (GStranica) {}
try {
Kvadrat* maxt = static_cast<Kvadrat*>(niz[0]);
double maxs = maxt->S ();
for (int i=1; i<+niz; i++) {
Kvadrat* p = static_cast<Kvadrat*>(niz[i]);
if (p->S() > maxs) { maxt = p; maxs = p->S (); }
}
cout << "Najveci kvadrat: " << *maxt << endl;
} catch (GIndeks) { cout << "Niz je prazan!\n"; }
}
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.