Visa elektrotehnicka skola, Beograd
Ласло Краус
Објектно програмирање - испити
Практични испит
23. 6. 2000

Задатак | Напомене | Решење

Поставка задатка (садржај)

Пројектовати на језику C++ апстрактну класу за податке. Предвидети:
  1. формирање копије податка у динамичкој меморији,
  2. писање вредности податка у неки излазни ток (dat<<pod), и
  3. уништавање податка.
Скаларни подаци су подаци који садрже неку реалну вредност. Пројектовати на језику C++ класу за скаларне податке као изведену класу из класе за апстрактне податке. Поред могућности које постоје у основној класи, предвидети:
  1. иницијализацију скаларног податка обичном реалном вредношћу, и
  2. дохватање вредности скаларног податка (+skal).
Нзови су подаци који могу да садрже известан број апстрактних података. Пројектовати на језику C++ класу за низове као изведену класу из класе за апстрактне податке. Поред могућности које постоје у основној класи, предвидети:
  1. стварање празног низа задатог капацитета,
  2. иницијализацију низа сдржајем другог низа,
  3. додељивање вредности једног низа другом (niz1=niz2),
  4. дохватање капацитета низа (+niz)
  5. испитивање да ли је неко место у низу попуњено (niz%ind),
  6. дохватање податка који се налази на датом месту низа (niz[ind]),
  7. стављање податка на одређено место у низу (niz(ind,pod)),
  8. избацивање податка са задатог места у низу (niz-=ind), и
  9. пражњење низа (~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; }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.