![]() Ласло Краус |
Објектно програмирање - испити Практични испит 23. 6. 2000 |
---|
dat<<pod
), и
+skal
).
niz1=niz2
),
+niz
)
niz%ind
),
niz[ind]
),
niz(ind,pod)
),
niz-=ind
), и
~niz
).
Саставити на језику C++ функцију којa кроз дијалог прочита један података (скаларни или низ) преко главног улаза. У случају низа, елементи могу да буду и низови који опет могу да садрже и низове до произвољне дубине. Вредност функције треба да је показивач на прочитани податак (нула означава "празан" податак).
Саставити на језику C++ главни програм који прочита један податак преко главног улаза, испише прочитани податак преко главног излаза и понавља претходне кораке све док не прочита "празан" податак. Грешке у току обраде (пријављивање изузетака) не смеју да прекидају програм.
// 200003.h
#include <iostream.h>
class Podat {
public:
virtual ~Podat () {}
virtual Podat *kopija () const = 0;
private:
virtual void pisi (ostream &dd) const = 0;
friend ostream & operator<< (ostream &dd, const Podat &pp)
{ pp.pisi (dd); return dd; }
};
class Skal: public Podat {
double vredn;
public:
Skal (double vv=0) { vredn = vv; }
Podat *kopija () const { return new Skal (*this); }
double operator+ () const { return vredn; }
private:
void pisi (ostream &dd) const { dd << vredn; }
};
class Niz: public Podat {
Podat **niz; int kap;
void kopiraj (const Niz &nn);
void brisi () { ~*this; delete [] niz; }
public:
Niz (double kk=10);
Niz (const Niz &nn) { kopiraj (nn); }
~Niz () { brisi (); }
Podat *kopija () const { return new Niz (*this); }
Niz & operator= (const Niz &nn) {
if (this != &nn) { brisi (); kopiraj (nn); }
return *this;
}
int operator+ () const { return kap; }
int operator% (int ind) {
if (ind < 0 || ind >= kap) throw 1;
return niz[ind] != 0;
}
Podat & operator[] (int ind) {
if (ind < 0 || ind >= kap) throw 1;
if (niz[ind] == 0) throw 2;
return *niz[ind];
}
Niz & operator() (int ind, const Podat &pod) {
if (ind < 0 || ind >= kap) throw 1;
delete niz[ind]; niz[ind] = pod.kopija ();
return *this;
}
Niz & operator-= (int ind) {
if (ind < 0 || ind >= kap) throw 1;
delete niz[ind]; niz[ind] = 0;
return *this;
}
void operator~ ();
private:
void pisi (ostream &dd) const ;
};
// 200003.cpp
#include "200003.h"
Niz::Niz (double kk) {
niz = new Podat* [kap = kk];
for (int i=0; i<kap; niz[i++]=0);
}
void Niz::kopiraj (const Niz &nn) {
niz = new Podat* [kap = nn.kap];
for (int i=0; i<kap; i++)
niz[i] = nn.niz[i] ? nn.niz[i]->kopija() : 0;
}
void Niz::operator~ () {
for (int i=0; i<kap; i++) { delete niz[i]; niz[i] = 0; }
}
void Niz::pisi (ostream &dd) const {
dd << '[';
for (int i=0; i<kap; i++) {
if (niz[i]) dd << *niz[i];
if (i < kap-1) dd << ',';
}
dd << ']';
}
// 200003t.cpp
#include "200003.h"
#include <iostream.h>
void uvuci (int nivo) {
for (int i=0; i<nivo; i++) cout << " ";
}
Podat *citaj (int nivo) {
Podat *rez = 0;
uvuci (nivo); cout << "Vrsta (S,N)? "; char vrsta; cin >> vrsta;
switch (vrsta) {
case 's': case 'S':
uvuci (nivo); cout << "Vrednost? ";
double vredn; cin >> vredn; rez = new Skal (vredn);
break;
case 'n': case 'N':
uvuci (nivo); cout << "Duzina? "; int duz; cin >> duz;
Niz *niz = new Niz (duz);
for (int i=0; i<duz; i++) {
Podat *pod = citaj (nivo+1);
if (pod) (*niz) (i, *pod);
}
rez = niz;
break;
}
return rez;
}
int main () {
while (1) {
try {
Podat *pod = citaj (0);
if (pod == 0) break;
cout << "\nPodatak: " << *pod << "\n\n";
} catch (int g) { cout << "\n***** " << g << " *****\n"; }
}
return 0;
}
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.