![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Прва група 14. 6. 2005. |
|---|
I – Пројектовати на језику C++ апстрактну класу Zbirka за низове реланих бројева. Предвидети:
zbirka1=zbirka2),
+zbirka, -zbirka),
dat<<zbirka – пише се једнословна ознака збирке и елементи збирке).
II – Пројектовати на језику C++ класу Niz за уређене низове реалних бројева као изведену класу из класе Zbirka са истим могућностима као и основна класа.
III – Пројектовати на језику C++ класу Skup за скупове реалних бројева, чији су сви елементи међусобно различити, као изведену класу из класе Zbirka, код којих се бројеви додају иза последњег броја у скупу. Поред могућности основне класе, предвидети:
IV – Саставити на језику C++ главни програм који:
Грешке пријављивати изузецима типа једноставних класа. Предвидети исписивање поруке о грешци.
studentx (x је број радне станице за којим се ради). Лозинка на свакој радној станици је student.N: (Nastava on \\Xs200-2) у каталогу ObjektnoProg\RSx (x је број радне станице за којим се ради).
// zbirka.h
#ifndef _zbirka_h_
#define _zbirka_h_
#include <iostream>
using namespace std;
class Zbirka {
protected:
double* niz; int kap, duz;
private:
void kopiraj (const Zbirka& z);
void brisi () { delete [] niz; }
public:
explicit Zbirka (int k=10) { niz = new double [kap = k]; duz = 0; }
Zbirka (const Zbirka& z) { kopiraj (z); }
virtual ~Zbirka () { brisi (); }
Zbirka& operator= (const Zbirka& z) {
if (this != &z) { brisi (); kopiraj (z); }
return *this;
}
virtual char vrsta () const =0;
virtual Zbirka* kopija () const =0;
int operator+ () const { return duz; }
int operator- () const { return kap - duz; }
virtual Zbirka& stavi (double b) =0;
protected:
virtual void pisi (ostream& d) const;
friend ostream& operator<< (ostream& d, const Zbirka& z) { z.pisi (d); return d; }
};
class GZbirkaPuna {
friend ostream& operator<< (ostream& d, const GZbirkaPuna& g)
{ return d << "*** Zbirka je puna!"; }
};
#endif
// zbirka.cpp
#include "zbirka.h"
void Zbirka::kopiraj (const Zbirka& z) {
niz = new double [kap = z.kap]; duz = z.duz;
for (int i=0; i<kap; i++) niz[i] = z.niz[i];
}
void Zbirka::pisi (ostream& d) const {
d << vrsta () << ':';
for (int i=0; i<duz; d << ' ' << niz[i++]);
}
// niz.h
#ifndef _niz_h_
#define _niz_h_
#include "zbirka.h"
class Niz: public Zbirka {
public:
explicit Niz (int k): Zbirka (k) {}
char vrsta () const { return 'N'; }
Niz* kopija () const { return new Niz (*this); }
Niz& stavi (double b);
};
#endif
// niz.cpp
#include "niz.h"
Niz& Niz::stavi (double b) {
if (duz == kap) throw GZbirkaPuna ();
int i = duz-1;
while (i>=0 && niz[i]>b) { niz[i+1] = niz[i]; i--; }
niz[i+1] = b; duz++;
return *this;
}
// skup.h
#ifndef _skup_h_
#define _skup_h_
#include "zbirka.h"
class Skup: public Zbirka {
public:
explicit Skup (int k): Zbirka (k) {}
char vrsta () const { return 'S'; }
Skup* kopija () const { return new Skup (*this); }
Skup& stavi (double b);
bool ima (double b) const;
};
#endif
// skup.cpp
#include "skup.h"
Skup& Skup::stavi (double b){
if (!ima (b)) {
if (duz == kap) throw GZbirkaPuna ();
niz [duz++] = b;
}
return *this;
}
bool Skup::ima (double b) const {
for (int i=0; i<duz; i++) if (niz[i] == b) return true;
return false;
}
// glavni.cpp
#include "niz.h"
#include "skup.h"
#include <iostream>
using namespace std;
int main () {
while (true) {
cout << "Broj zbirki? "; int n; cin >> n;
if (n <= 0) break;
Zbirka** niz = new Zbirka* [n];
for (int i=0; i<n; ) {
cout << "Vrsta zbirke (N, S)? "; char vrs; cin >> vrs;
cout << "Kapacitet zbirke? "; int k; cin >> k;
switch (vrs) {
case 'N': niz[i++] = new Niz (k); break;
case 'S': niz[i++] = new Skup (k); break;
}
}
try {
while (true) {
cout << "Broj? "; double b; cin >> b;
for (int i=0; i<n; niz[i++]->stavi(b));
}
} catch (GZbirkaPuna) {}
int min = +*niz[0], max=min, imin=0, imax=0;
for (int i=1; i<n; i++) {
int d = +*niz[i];
if (d < min) { min = d; imin = i; }
if (d > max) { max = d; imax = i; }
}
cout << "min = " << *niz[imin] << endl;
cout << "max = " << *niz[imax] << endl;
for (int i=0; i<n; delete niz[i++]);
delete [] niz;
}
return 0;
}
Broj zbirki? 4
Vrsta zbirke (N, S)? N
Kapacitet zbirke? 6
Vrsta zbirke (N, S)? S
Kapacitet zbirke? 3
Vrsta zbirke (N, S)? N
Kapacitet zbirke? 4
Vrsta zbirke (N, S)? S
Kapacitet zbirke? 6
Broj? 5
Broj? 3
Broj? 4
Broj? 3
Broj? 2
min = S: 5 3 4
max = N: 2 3 3 4 5
Broj zbirki? 0
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.