Пројектовати на језику C++ апстрактну класу за збирке целих бројева. Предвидети:
1. уништавање збирке,
2. дохватање броја података у збирци (+zbirka),
3. додавање једног податка збирци (zbirka+=broj),
4. додавање садржаја збирке збирци (zbirka1+=zbirka2),
5. дохватање податка са датим редним бројем (zbirka[ind]),
6. дохватање и избацивање податка са датим редним бројем (zbirka(ind)), и
7. писање садржаја збирке у неки излазни ток (dat<<zbirka).
Пројектовати на језику C++ класу за низове целих бројеве као изведену класу из класе за збирке. Нови подаци се додају иза последњег попуњеног места у низу. Поред могућности основне калсе предвидети:
1. стварање празог низа задатог капацитета (подразумевано 10),
2. иницијализацију низа другим низом,
3. иницијализацију низа збирком (капацитет треба да је једнак величини збирке), и
4. додељивање низу вредност другог низа (niz1=niz2) и збирке (niz=zbirka).
Пројектовати на језику C++ класу за листе целих бројеве као изведену класу из класе за збирке. Нови подаци се додају иза последњег елемента листе. Поред могућности основне класе предвидети:
1. стварање празне листе,
2. иницијализацију листе другом листом,
3. иницијализацију листе збирком, и
4. додељивање листи вредност друге листе (lista1=lista2) и збирке (lista=zbirka).
За пријављивање конфликтних ситуација (нема места у низу, индекс изван опсега) изузецима, направити одговарајуће једноставне класе.
Саставити на језику C++ интерактивни главни програм са следећим операцијама:
* створи одређену врсту збирке
* додај број збирци,
* промени вредност броја на одређеном месту,
* извади број са одређеног места (број се брише из збирке),
* испиши садржај збирке,
* претвори збирку у збирку задате врсте, и
* заврши са радом.
Напомене (садржај)
* Испит траје 180 минута.
* Решење задатка предаје се у облику три датотеке: дефиницје свих класа, дефиниције метода уз све класе и главни програм. Не стављати целокупно решење у једну датотеку.
* Пожељно је да програм проради до краја испита.
Решење задатка (поставка | садржај)
// zbirka.h
#ifndef _zbirka_h_
#define _zbirka_h_
#include <iostream.h>
class Zbirka {
public:
virtual ~Zbirka () {}
virtual int operator+ () const =0;
virtual Zbirka& operator+=(int k)=0;
friend Zbirka& operator+= (Zbirka& z1, const Zbirka& z2);
virtual int& operator[](int ind)=0;
virtual const int& operator[] (int ind) const =0;
virtual int operator() (int ind)=0;
friend ostream& operator<< (ostream& d, const Zbirka& z);
};
class GZbirkaPuna {};
class GZbirkaIndeks {};
#endif
// zbirka.cpp
#include "zbirka.h"
Zbirka& operator+= (Zbirka& z1, const Zbirka& z2) {
for(int i=0; i<+z2; i++) z1 += z2[i];
return z1;
}
ostream& operator<< (ostream& d, const Zbirka& z) {
d << '[';
for (int i=0; i<+z; i++) { d << z[i]; if (i < +z-1) d << ','; }
return d << ']';
}
// niz.h
#ifndef _niz_h_
#define _niz_h_
#include "zbirka.h"
class Niz: public Zbirka {
int *niz, kap, vel;
void kopiraj (const Niz& n);
void brisi() { delete [] niz; vel = kap = 0; }
public:
Niz (int k=10) { niz = new int [kap=k]; vel = 0; }
Niz (const Niz& n) { kopiraj(n); }
Niz (const Zbirka& z) { niz = new int[kap=+z]; vel = 0; *this += z; }
~Niz () { brisi (); }
Niz& operator= (const Niz& n) {
if (this != &n) { brisi (); kopiraj (n); }
return *this;
}
Niz& operator= (const Zbirka& n) {
if (this != &n) { brisi( ); niz=new int[kap=+n]; (*this) += n;}
return *this;
}
int operator+ () const { return vel; }
Niz& operator+= (int k) {
if (vel == kap) throw GZbirkaPuna ();
niz[vel++] = k;
return *this;
}
int& operator[] (int ind) {
if (ind<0 || ind >=vel) throw GZbirkaIndeks ();
return niz[ind];
}
const int& operator[] (int ind) const {
if (ind<0 || ind >=vel) throw GZbirkaIndeks ();
return niz[ind];
}
int operator() (int ind);
};
#endif
// niz.cpp
#include "niz.h"
void Niz::kopiraj (const Niz& n) {
niz = new int [kap=n.kap]; vel = n.vel;
for (int i=0; i<vel; i++) niz[i] = n.niz[i];
}
int Niz::operator() (int ind) {
if (ind<0 || ind>=vel) throw GZbirkaIndeks ();
int k = niz[ind];
for (int i=ind; i<vel-1; i++) niz[i] = niz[i+1];
vel--;
return k;
}
// lista.h
#ifndef _lista_h_
#define _lista_h_
#include "zbirka.h"
class Lista: public Zbirka {
struct Elem {
int broj; Elem *sled;
Elem(int b, Elem*s=0){broj=b;sled=s;}
};
Elem *prvi, *posl; int vel;
void kopiraj (const Lista &lst);
void brisi () ;
public:
Lista () { prvi=posl=0; vel=0; }
Lista (const Lista& lst){kopiraj(lst);}
Lista (const Zbirka& z) { prvi = posl = 0; vel = 0; *this += z;}
~Lista () { brisi (); }
Lista& operator= (const Lista& lst) {
if (this != &lst) { brisi( ); kopiraj (lst); }
return *this;
}
Lista& operator= (const Zbirka& lst) {
if (this != &lst) { brisi (); *this += lst; }
return *this;
}
int operator+() const { return vel; }
Lista& operator+= (int k) {
posl= (!prvi ? prvi : posl->sled) = new Elem(k);
vel++;
return *this;
}
int& operator[] (int ind);
const int& operator[] (int ind) const {
return ((Lista&)(*this))[ind];
}
int operator() (int ind);
};
#endif
// lista.cpp
#include "lista.h"
void Lista::kopiraj
(const Lista& lst) {
prvi = posl = 0; vel = lst.vel;
for (Elem *tek=lst.prvi; tek; tek=tek->sled)
posl = (!prvi ? prvi : posl->sled) = new Elem (tek->broj);
}
void Lista::brisi () {
while (prvi) {Elem *stari = prvi; prvi = prvi->sled; delete stari; }
posl = 0; vel = 0;
}
int& Lista::operator[] (int ind) {
if (ind<0 || ind>=vel) throw GZbirkaIndeks ();
Elem *tek = prvi;
for(int i=0;i<ind;i++) tek=tek->sled;
return tek->broj;
}
int Lista::operator() (int ind) {
if (ind<0 || ind>=vel) throw GZbirkaIndeks ();
Elem *tek = prvi, *preth = 0;
for (int i=0; i<ind; i++) { preth=tek; tek=tek->sled; }
int broj = tek->broj; vel--;
if(((!preth ? prvi : preth->sled) = tek->sled) == 0) posl = 0;
return broj;
}
// glavni.cpp
#include "niz.h"
#include "lista.h"
#include <iostream.h>
Zbirka* nova () {
cout << "Vrsta (N, L)? ";
char vrs; cin >> vrs;
switch (vrs) {
case 'l': case 'L': return new Lista ();
case 'n': case 'N': {
int k; cout << "Kapacitet? "; cin >> k; return new Niz (k);
} default: throw "Neispravna vrsta";
}
}
int main () { Zbirka *z = new Niz;
while (true) {
cout <<
"\nMoguce operacije su:\n\n"
"1 Stvaranje nove zbirke\n"
"2 Dodavanje broja zbirci\n"
"3 Promena broja u zbirci\n"
"4 Vadjenje broja iz zbirke\n"
"5 Prikazivanje zbirke\n"
"6 Promena vrste zbirke\n"
"0 Kraj rada\n\n"
"Unesite svoj izbor: ";
int izbor; cin >> izbor;
if (izbor == 0) break;
try {
switch (izbor) {
case 1: {
Zbirka *zz=nova (); delete z; z=zz; break;
}case 2: {
cout << "Broj? "; int b; cin >> b; *z += b; break;
}case 3: {
int i, b;
cout<<"Indeks? "; cin>>i;
cout<<"Broj? "; cin>>b;
(*z)[i] = b; break;
}case 4: { int i;
cout<<"Indeks? "; cin>>i;
cout << "Broj= " << (*z)(i) << endl;
break;
}case 5: {
cout<<"Zbirka= " <<*z<<endl; break;
}case 6: {
Zbirka *zz=nova( ); *zz += *z; delete z; z=zz; break;
}default: throw "Neispravan izbor";
}
} catch (GZbirkaPuna) {
cout << "GRESKA: Zbirka je puna\n";
} catch (GZbirkaIndeks) {
cout << "GRESKA: Indeks izvan opsega\n";
} catch (const char *g) {
cout << "GRESKA: " << g << endl;
}
}
}