diff options
author | Santo Cariotti <dcariotti24@gmail.com> | 2020-02-01 11:51:56 +0100 |
---|---|---|
committer | Santo Cariotti <dcariotti24@gmail.com> | 2020-02-01 11:51:56 +0100 |
commit | d7e54927ac774b0fdb7d5b87f05738c600b2c0fe (patch) | |
tree | 4495491d71dadef984f1a15bd4069891fde0b73a | |
parent | 8523d33e65b539aec8140dc25477f3d12c95fed1 (diff) |
chore: lab exam A 28/2/19
-rw-r--r-- | I_anno/Programmazione_1/lab_28_02_19_A.cc | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/I_anno/Programmazione_1/lab_28_02_19_A.cc b/I_anno/Programmazione_1/lab_28_02_19_A.cc new file mode 100644 index 0000000..ff2eaae --- /dev/null +++ b/I_anno/Programmazione_1/lab_28_02_19_A.cc @@ -0,0 +1,166 @@ +#include<iostream> +#include<stdexcept> +#include<cstdlib> +#include<cmath> +#define DIM 50 + +using namespace std; + +class A { +public: + A(short m) : len{m} { + arr = new short[m]; + srand(time(NULL)); + for(int i = 0; i < m; ++i) { + arr[i] = rand()%10+1; + } + } + + ~A() { + delete[] arr; + } + + virtual double f(short a) = 0; + virtual void print(ostream& os) = 0; + + short getLen() { + return len; + } + +protected: + short get(short i) { + if(i < 0 || i >= getLen()) + throw out_of_range{"out of arr' range"}; + + return arr[i]; + } + +private: + short* arr; + short len; +}; + +template<typename T> +class B : public A { +public: + B(short m, char c) : A{m} { + if(typeid(T) == typeid(char)) { + x = c; + } else if(typeid(T) == typeid(string)) { + for(int i = 0; i < m; ++i) + x+=c; + + } else { + // tipo non gestito + throw bad_typeid{}; + } + } + + double f(short a) override { + double n = static_cast<double>(getLen() - a); + double sum{}; + for(int i = a; i < getLen(); ++i) + sum+=get(i); + + return sum/n; + } + + void print(ostream& os) override { + os << "B<" << (typeid(T) == typeid(char) ? "char" : "string") << "> arr=["; + for(int i = 0; i < getLen(); ++i) + os << get(i) << ' '; + os << "], x=" << x; + } + + double foo(short s) { + return log(s) + sin(f(s)); + } +private: + T x; +}; + +class C : public A { +public: + C(short n, int k) : A{n}, y{k} {} + + double f(short a) override { + srand(time(NULL)); + short rand_elem = get(rand()%getLen()); + + return static_cast<double>(a+y)/static_cast<double>(rand_elem); + } + + double g(short w) { + // sicuri che non debba convertire a double? qui sarĂ sempre 0, forse 1 + return static_cast<double>(sin(w+y)); + } + + void print(ostream& os) override { + os << "C arr=["; + for(int i = 0; i < getLen(); ++i) + os << get(i) << ' '; + os << "], y=" << y; + } + + C& operator++() { + ++y; + return *this; + } +private: + int y; +}; + +ostream& operator<<(ostream& os, A& a) { + a.print(os); + + return os; +} + +int main() { + srand(111222333); + + A *vett[DIM]; + + double max_f3{-100000000.0}; + short c_count{}; + double gsum{}; + short i_to_p{-1}; + + for(int i=0; i<DIM; i++) { + short n=1+rand()%10; + switch(rand()%3) { + case 0: + { + vett[i]= new C(n, rand()%10 + 1); + i_to_p = i; + auto cref = dynamic_cast<C&>(*(vett[i])); + gsum+=cref.g(5); + ++c_count; + break; + } + case 1: + vett[i]= new B<string>(n, rand()%('z' - 'a' + 1) + 'a'); + break; + case 2: + vett[i]= new B<char>(n, rand()%('z' - 'a' + 1) + 'a'); + } + + auto f3 = vett[i]->f(3); + if(f3 > max_f3) + max_f3 = f3; + } + + for(int i = 0; i < DIM; ++i) + cout << i+1 << ')' << *(vett[i]) << ", f(3)=" << vett[i]->f(3) << endl; + + cout << "max f(3)=" << max_f3; + cout << " avg g(5)=" << (static_cast<double>(gsum/c_count)) << endl; + if(i_to_p >= 0) { + cout << *(vett[i_to_p]) << endl; + auto cref = dynamic_cast<C*>(vett[i_to_p]); + ++(*cref); + cout << *(vett[i_to_p]) << endl; + } + + return 0; +} |