Salve a tutti, questo è il mio primo post.
Ho bisogno del vostro aiuto con la programmazione ad oggetti. Tra non molto ho l'esame di laboratorio e ancora oggi ho qualche dubbio e difficoltà con l'utilizzo dello strem I/O.
Adesso vi allego un esempio dell'esame e la mia soluzione. Però vi è qualche errore in quanto non compila correttamente. Qualcuno di voi potrebbe dirmi dove sbaglio?
Testo esame:
Soluzione:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <typeinfo>
#define DIM 50
#define N 5
using namespace std;
class A {
public:
A(float a) {
x = new float[N];
x[0] = a;
for(int i=1; i<N; i++) x[i] = (float) sin(100*x[i-1]);
}
virtual float f() = 0;
float* getX() { return x; }
virtual ostream& put(ostream &out) {
out << "[";
for(int i=0; i<N; i++) {
out << x[i] << ", ";
}
out << "]" << endl;
return out;
}
private:
float *x;
};
ostream& operator<<(ostream &out, A &a) {
return a.put(out);
}
class B : public A {
public:
B(float b) : A(b) {}
virtual float f() {
float *_x_ = getX();
float max = 0.0;
for(int i=0; i<N; i++) {
if(_x_[i] > max) max = _x_[i];
}
return max;
}
ostream& put(ostream &out, B &b) {
return A::put(out) << "\tClasse B." << endl;
}
};
class C : public A {
public:
C(float c) : A(c) {}
virtual float f() {
float *_x_ = getX();
float tot = 0.0, media = 0.0;
for(int i=0; i<N; i++) tot += _x_[i];
media = tot/N;
return media;
}
int gte(float thr) {
float *_x_ = getX();
int counter = 0;
for(int i=0; i<N; i++) {
if(_x_[i] > thr) ++counter;
}
return counter;
}
ostream& put(ostream &out, C &c) {
return A::put(out) << "\tClasse C." << endl;
}
};
class D {
public:
D(float seed) : c(seed/3) {
if(seed > 0.5) a = new B(seed);
else a = new C(seed);
b = new B(seed/2);
}
float m() {
float max[3] = { 0.0, 0.0, 0.0 }, MAX;
float *x_a = a->getX(), *x_b = b->getX(), *x_c = c.getX();
for(int i=0; i<N; i++) {
if(x_a[i] > max[0]) max[0] = x_a[i];
if(x_b[i] > max[1]) max[1] = x_b[i];
if(x_c[i] > max[2]) max[2] = x_c[i];
}
MAX = max[0] + max[1] + max[2];
return MAX;
}
float h(float thr) {
float rap = 0.0;
rap = c.f()/(*b).f();
if(typeid(*a) == typeid(C)) rap *= ((C*)a)->gte(thr);
return rap;
}
ostream& put(ostream &out) {
return out << *a << "\n" << *b << "\n" << c << endl;
}
private:
A *a;
B *b;
C c;
};
ostream& operator<<(ostream &out, D &d) {
return d.put(out);
}
int main()
{
srand(111222333);
D* vett[DIM];
for(int i=0; i<DIM; i++) {
cout << "Oggetto " << i+1 << "\n";
vett[i] = new D((float)rand()/RAND_MAX);
cout<< *vett[i] << "\t ";
}
cout << endl << endl;
float tot = 0.0, media;
for(int i=0; i<DIM; i++) {
tot += vett[i]->h(0.7);
}
media = tot/DIM;
cout << "\n\nMedia di h(0.7) = " << media << endl;
float val = 0.0;
val = (*vett[4]).m() + (*vett[5]).m();
cout << "\nvett[4].m() + vett[5].m() = " << val << endl << endl;
system("PAUSE");
return 0;
}
Grazie mille in anticipo