![]() Ласло Краус |
Објектно програмирање - колоквијуми Други колоквијум Прва група 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.