![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Прва група 10. 6. 2006. |
---|
I – Написати на језику C++ апстрактну класу за одређивање статистичког показатеља скупа реалних узорака (бројева) који се достављају један по један. Предвидети:
dat<<pokaz
).
II – Написати на језику C++ изведене класе из класе показатеља за одређивање броја узорака и за одређивање средње вредности и стандардне девијације узорака.
III – написати на језику C++ класу за низове реланих бројева. Предвидети:
niz1=niz2
),
niz[ind]
– грешка је ако је индекс изван опсега)
IV – Написати на језику C++ програм који:
Грешке пријављивати изузецима типа једноставних класа које могу да уписују у датотеку поруке о грешкама.
studentx
(x
је број радне станице за којим се ради). Лозинка на свакој радној станици је student
.N:
(Nastava
on
\\Xs200-2
) у каталогу ObjektnoProg\RSx
(x
је број радне станице за којим се ради).// 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
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.