diff options
author | Santo Cariotti <dcariotti24@gmail.com> | 2020-01-16 12:41:21 +0100 |
---|---|---|
committer | Santo Cariotti <dcariotti24@gmail.com> | 2020-01-16 12:41:21 +0100 |
commit | a22aab814f0cd9d0a59d2e9534036be5aef71fcd (patch) | |
tree | 079d3ad5692c05db4e10eb936f47e8c734c7fa40 | |
parent | dbf139e0ac0c7ff385aa3611b17a0b81ba9e316f (diff) |
Lab exam 26/7/19
-rw-r--r-- | I_anno/Programmazione_1/lab_26_07_19.cc | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/I_anno/Programmazione_1/lab_26_07_19.cc b/I_anno/Programmazione_1/lab_26_07_19.cc new file mode 100644 index 0000000..91822d9 --- /dev/null +++ b/I_anno/Programmazione_1/lab_26_07_19.cc @@ -0,0 +1,164 @@ +#include<iostream> +#include<cmath> +#include<typeinfo> + +#define DIM 30 + +using namespace std; + +class A { +public: + A(short m, int a, int b) : len(m) { + srand(time(NULL)); + vec = new int[m]; + + for(int i = 0; i < m; ++i) { + vec[i] = rand()%b + a; + } + } + + ~A() { + delete vec; + } + + virtual double foo(short a) = 0; + short getLen() { + return len; + } + + virtual void print(ostream& o) = 0; + + int operator()(int i1, int i2) { + if(i1 < 0) i1 = 0; + if(i2 > len) i2 = len; + + int sum = 0; + + for(int i = i1; i < i2; ++i) { + sum+=vec[i]; + } + + return sum; + } + +protected: + int get(short i) { + return vec[i]; + } +private: + int* vec; + short len; +}; + +class B : public A { +public: + B(short m, int x, int y) : A(m, x, y) { + srand(time(NULL)); + short rand_num = rand()%m; + p = get(rand_num); + } + + double foo(short a) { + return static_cast<double>(prod(a)) / static_cast<double>(p); + } + + void print(ostream& os) { + os << "vec=["; + for(int i = 0; i < getLen(); ++i) { + os << get(i) << ' '; + } + os << "], p=" << p; + } +protected: + int prod(short s) { + int index = s%getLen(); + int _prod = 1; + for(int i = index; i < getLen(); ++i) { + _prod *= get(i); + } + + return _prod; + } +private: + int p; +}; + + +template<class T> class C : public A { +public: + C(short n, int a, int b) : A(n, a, b) { + if(typeid(T) == typeid(short)) { + x = n; + } else { + x = log(1+pow(sin(n), 2)); + } + + } + + double foo(short r) { + return g(r); + } + + T g(T k) { + return 2*x*(k+1); + } + + void print(ostream& os) { + os << "vec=["; + for(int i = 0; i < getLen(); ++i) { + os << get(i) << ' '; + } + os << "], x=" << x; + } +private: + T x; +}; + +ostream& operator<<(ostream& os, A& a) { + os << typeid(a).name() << ", "; + a.print(os); + return os; +} + +int main() { + srand (time(0)); + A* vett[DIM]; + double sum_cd = 0; + short num_cd = 0; + for(int i=0; i < DIM; ++i) { + short n = 1+rand()%10; + switch ( rand ()%3) { + case 0: + vett[i]= new B(n, rand()%5 + 1, rand()%10 + 5); + break ; + case 1: { + vett[i]= new C<double>(n, rand()%5 + 1, rand()%10 + 5); + ++num_cd; + C<double>& cc = dynamic_cast<C<double>& >(*(vett[i])); + sum_cd += cc.g(5); + + break ; + } + case 2: + vett[i]= new C<short>(n, rand()%5 + 1, rand()%10 + 5); + } + } + + double max_foo = -100000; + + for(int i = 0; i < DIM; ++i) { + auto foo3 = vett[i]->foo(3); + + if(foo3 > max_foo) { + max_foo = foo3; + } + cout << (*(vett[i])) << ", foo(3)=" << foo3 <<endl; + } + + // max_foo => Valore maggiore calcolato per foo(3) + // sum_cd / num_cd => media valori g(5) per C<Double> + + cout << (*vett[0])(0, 2) << endl; + + return 0; +} |