![]() Ласло Краус |
Објектно програмирање - испити Практични испит 22. 1. 2003 |
---|
Пројектовати на језику C++ апстрактну класу за збирке целих бројева. Предвидети:
+zbirka
),
zbirka+=broj
),
zbirka1+=zbirka2
),
zbirka[ind]
),
zbirka(ind)
), и
dat<<zbirka
).
Пројектовати на језику C++ класу за низове целих бројеве као изведену класу из класе за збирке. Нови подаци се додају иза последњег попуњеног места у низу. Поред могућности основне калсе предвидети:
niz1=niz2
) и збирке (niz=zbirka
).
Пројектовати на језику C++ класу за листе целих бројеве као изведену класу из класе за збирке. Нови подаци се додају иза последњег елемента листе. Поред могућности основне класе предвидети:
lista1=lista2
) и збирке (lista=zbirka
).
За пријављивање конфликтних ситуација (нема места у низу, индекс изван опсега) изузецима, направити одговарајуће једноставне класе.
Саставити на језику C++ интерактивни главни програм са следећим операцијама:
// 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; } } }
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.