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

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

Поставка задатка (решење | садржај)

Пројектовати на језику C++ апстрактну класу за грешке и из ње изведене класе за грешке недозвољени опсег индекса и за грешке недозвољени индекс. Предвидети писање поруке о грешци у неки излазни ток (dat<<g). Порука треба да садржи и вредности границе опсега, односно индекса које су недозвољене. Ове класе треба користити за пријављивање одговарајућих изузетака у настаку.

Пројектовати на језику C++ класу за низове реалних бројева са задатим опсезима индекса. Предвидети:

  1. стварање низа са задатим опсезима индекса и са свим елементима једнаким нули (подразумевани почетни индекс је 1, подразумевана оба гранична индекса су од 1 до 10),
  2. иницијализацију низа садржајем другог низа,
  3. уништавање низа,
  4. доделу вредности једног низа другом низу (niz1=niz2),
  5. приступање задатом елементу низа (niz[ind]), и
  6. дохватање доње и горње границе опсега индекса (две методе).
Пројектовати на језику C++ класу за верижне разломке као изведене класе низова са задатим опсезима индекса. Поред могућности основне класе редвидети израчунавање вредности верижног разломка према приложеној формули (v(x)).

Саставити на језику C++ главни програм који:


Напомене (садржај)


Решење задатка (поставка | садржај)

// 200101.h

#include <iostream.h>

class Greska {
protected:
  virtual ~Greska () {}
  virtual void pisi (ostream &d) const =0;
  friend ostream & operator<< (ostream &d, const Greska &g)
    { g.pisi (d); return d; }
};

class GOpseg: public Greska {
  int min, max;
  void pisi (ostream &d) const {
    d << "\n*** Nedozvoljen opseg indeksa ["
      << min << ',' << max << "] ***\n\n";
  }
public:
  GOpseg (int poc, int kra) { min = poc, max = kra; }
};

class GIndeks: public Greska {
  int ind;
  void pisi (ostream &d) const {
    d << "\n*** Nedozvoljen indeks [" << ind << "] ***\n\n";
  }
public:
  GIndeks (int i) { ind = i; }
};

class Niz {
  double *niz; int min, max;
  void pravi (int poc, int kra);
  void kopiraj (const Niz &n);
  void brisi () { delete [] niz; }
public:
  Niz (int kra=10) { pravi (1, 10); }
  Niz (int poc, int kra) { pravi (poc, kra); }
  Niz (const Niz &n) { kopiraj (n); }
  virtual ~Niz () { brisi (); }
  Niz & operator= (const Niz &n) {
    if (this != &n) { brisi (); kopiraj (n); }
    return *this;
  }
  double & operator[] (int ind) const {
    if (ind < min || ind > max) throw GIndeks (ind);
    return niz[ind-min];
  }
  int minInd() const { return min; }
  int maxInd() const { return max; }
};

class VerizniRazlomak: public Niz {
public:
  VerizniRazlomak (int m, int n): Niz(m,n) {}
  double operator() (double x) const;
};


// 200101.cpp #include "200101.h" void Niz::pravi (int poc, int kra) { if (poc > kra) throw GOpseg (poc, kra); int d = (max = kra) - (min = poc) + 1; niz = new double [d]; for (int i=0; i<d; niz[i++]=0); } void Niz::kopiraj (const Niz &n) { int d = n.min - n.max + 1; niz = new double [d]; for (int i=0; i<d; i++) niz[i] = n.niz[i]; } double VerizniRazlomak::operator() (double x) const { double v = 0; for (int i=maxInd(); i>=minInd(); i--) v = (*this)[i] / (x + v); return v; }
// 200101t.cpp #include "200101.h" #include <iostream.h> int main () { try { cout << "Pocetni i krajnji indeks? "; int min, max; cin >> min >> max; VerizniRazlomak v (min, max); char odg = 'd'; do { try { cout << "Indeks i vrednost koeficijenta? "; int i; double a; cin >> i >> a; v[i] = a; cout << "Jos (D/N)? "; cin >> odg; } catch (GIndeks g) { cout << g; } } while (odg != 'n' && odg != 'N'); cout << "minX, maxX, dX? "; double minX, maxX, dX; cin >> minX >> maxX >> dX; for (double x=minX; x<=maxX; x+=dX) cout << x << ' ' << v(x) << endl; } catch (GOpseg g) { cout << g; } return 0; }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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