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

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

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

I – Написати на језику C++ апстрактну класу за одређивање статистичког показатеља скупа реалних узорака (бројева) који се достављају један по један. Предвидети:

  1. постављање почетног стања показатеља,
  2. ажурирање стања показатеља достављањем новог узорка,
  3. одређивање вредности показатеља на основу раније акумулираних узорака (за неке показатеље може бити грешка ако од постављања почетног стања није било достављен ниједан узорак),
  4. писање назива врсте показатеља у датотеку (dat<<pokaz).

II – Написати на језику C++ изведене класе из класе показатеља за одређивање броја узорака и за одређивање средње вредности и стандардне девијације узорака.

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

  1. иницијализацију низа задате дужине (подразумевано 10) попуњен на подразумевани начин према ставу 7. у наставку,
  2. иницијализацију низа другим низом,
  3. уништавање низа,
  4. додељивање вредности једног низа другом низу (niz1=niz2),
  5. дохватање дужине иза,
  6. приступ задатом елементу низа (niz[ind] – грешка је ако је индекс изван опсега)
  7. попуњавање низа случајним бројевима унутар задатог опсега (подразумевано од 0 до 1),
  8. одређивање задатог статистичког показатеља елемената низа.

IV – Написати на језику C++ програм који:

Грешке пријављивати изузецима типа једноставних класа које могу да уписују у датотеку поруке о грешкама.


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


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

// pokazatelj.h

#ifndef _pokazatelj_h_
#define _pokazatelj_h_

#include <iostream>
using namespace std;

class GNemaUzoraka {};

inline ostream& operator<< (ostream& d, const GNemaUzoraka&)
  { return d << "*** Nema nijednog uzorka!"; }

class Pokazatelj {
public:
  virtual void ispocetka () =0;
  virtual void azuriraj (double broj) =0;
  virtual double rezultat () const =0;
private:
  virtual void pisi (ostream& d) const =0;
  friend ostream& operator<< (ostream& d, const Pokazatelj& p) { p.pisi (d); return d; }
};

#endif

// brojac.h #ifndef _brojac_h_ #define _brojac_h_ #include "pokazatelj.h" class Brojac: public Pokazatelj { int n; void pisi (ostream& d) const { d << "broj uzoraka"; } public: Brojac () { ispocetka (); } void ispocetka () { n = 0; } void azuriraj (double broj) { n++; } double rezultat () const { return n; } }; #endif
// srednja.h #ifndef _srednja_h_ #define _srednja_h_ #include "pokazatelj.h" class Srednja: public Pokazatelj { int n; double s; void pisi (ostream& d) const { d << "srednja vrednost"; } public: Srednja () { ispocetka (); } void ispocetka () { s = n = 0; } void azuriraj (double broj) { n++; s += broj; } double rezultat () const { if (n == 0) throw GNemaUzoraka (); return s / n; } }; #endif
// devijacija.h #ifndef _devijacija_h_ #define _devijacija_h_ #include "pokazatelj.h" #include <cmath> using namespace std; class Devijacija: public Pokazatelj { int n; double s, d; void pisi (ostream& d) const { d << "standardna devijacija"; } public: Devijacija () { ispocetka (); } void ispocetka () { d = s = n = 0; } void azuriraj (double broj) { n++; s += broj; d += broj * broj; } double rezultat () const { if (n == 0) throw GNemaUzoraka (); return sqrt (d/n - s*s/n/n); } }; #endif
// niz.h #ifndef _niz_h_ #define _niz_h_ #include <iostream> #include "pokazatelj.h" using namespace std; class GIndeks {}; inline ostream& operator<< (ostream& d, const GIndeks&) { return d << "*** Neispravan indeks!"; } class Niz { double* a; int d; void kopiraj (const Niz& niz); void brisi () { delete [] a; } public: explicit Niz (int k=10) { a = new double [d = k]; puni (); } Niz (const Niz& niz) { kopiraj (niz); } ~Niz () { brisi (); } Niz& operator= (const Niz& niz) { if (this != &niz) { brisi (); kopiraj (niz); } return *this; } int duz () const { return d; } double& operator[] (int ind) { if (ind<0 || ind>=d) throw GIndeks (); return a[ind]; } const double& operator[] (int ind) const { if (ind<0 || ind>=d) throw GIndeks (); return a[ind]; } Niz& puni (double min=0, double max=1); double pokazatelj (Pokazatelj& pok) const; }; #endif
// niz.cpp #include "niz.h" #include <cstdlib> using namespace std; void Niz::kopiraj (const Niz& niz) { a = new double [d = niz.d]; for (int i=0; i<d; i++) a[i] = niz.a[i]; } Niz& Niz::puni (double min, double max) { for (int i=0; i<d; i++) a[i] = min + (max - min) * rand () / (RAND_MAX + 1.); return *this; } double Niz::pokazatelj (Pokazatelj& pok) const { pok.ispocetka (); for (int i=0; i<d; pok.azuriraj (a[i++])); return pok.rezultat (); }
// program.cpp #include "brojac.h" #include "srednja.h" #include "devijacija.h" #include "niz.h" #include <iostream> using namespace std; Pokazatelj* pok[] = { new Brojac(), new Srednja(), new Devijacija() }; int BR_POK = 3; int main () { while (true) { cout << "n? "; int n; cin >> n; if (n < 0) break; Niz niz (n); cout << "min,max? "; double min, max; cin >> min >> max; niz.puni (min, max); for (int i=0; i<BR_POK; i++) try { cout << *pok[i] << ": " << niz.pokazatelj(*pok[i]) << endl; } catch (const GNemaUzoraka& g) { cout << g << endl; } } return 0; }
n? 1000 min,max? 0 1 broj uzoraka: 1000 srednja vrednost: 0.492576 standardna devijacija: 0.286661 n? 10000 min,max? -5 5 broj uzoraka: 10000 srednja vrednost: 0.0494465 standardna devijacija: 2.89041 n? 0 min,max? 1 2 broj uzoraka: 0 *** Nema nijednog uzorka! *** Nema nijednog uzorka! n? -1
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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