diff options
author | Santo Cariotti <dcariotti24@gmail.com> | 2020-02-09 02:49:17 +0100 |
---|---|---|
committer | Santo Cariotti <dcariotti24@gmail.com> | 2020-02-09 02:49:17 +0100 |
commit | e4a0daf03d1baa47ecc860326bd302f1fc1a4294 (patch) | |
tree | 7e94aa34446083c8a1667e75d3e6e5e0dab2a201 /I_anno | |
parent | 0e26332bfb379a946c4774aa96d81e110071abb5 (diff) |
chore: ex C lab 28/2/19
Diffstat (limited to 'I_anno')
-rw-r--r-- | I_anno/Programmazione_1/lab_28_02_19_C.cc | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/I_anno/Programmazione_1/lab_28_02_19_C.cc b/I_anno/Programmazione_1/lab_28_02_19_C.cc new file mode 100644 index 0000000..ac53815 --- /dev/null +++ b/I_anno/Programmazione_1/lab_28_02_19_C.cc @@ -0,0 +1,185 @@ +#include<iostream> +#include<cmath> +#include<set> +#define DIM 10 + +using namespace std; + +class A { +public: + A(short m) : len{m} { + srand(time(NULL)); + base = new char[len]; + for(int i = 0; i < len; ++i) { + base[i] = rand()%('z'-'a'+1)+'a'; + } + } + + ~A() { + delete base; + } + + short getLen() { + return len; + } + + virtual string extract(short x) = 0; + virtual void print(ostream& os) = 0; + +protected: + char get(short i) { + return base[i]; + } + +private: + char* base; + short len; +}; + +class B : public A { +public: + B(short m, double p) : A{m} { + for(int i = 0; i < m; ++i) { + switch(get(i)) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': + str+=get(i); + } + } + } + + double foo(short s) { + return sin(k+s)/log(s+1); + } + + string extract(short x) override { + string x2{""}; + short inserted{}; + set<char> chars_a; + for(int i = 0; i < getLen(); ++i) + chars_a.insert(get(i)); + + while(inserted < x) { + char r_char = rand()%('z'-'a'+1)+'a'; + if(chars_a.find(r_char) != chars_a.end()) { + x2+=r_char; + ++inserted; + } + } + + return x2; + } + + void print(ostream& os) override { + os << "B: base=["; + for(int i = 0; i < getLen(); ++i) { + os << get(i) << ' '; + } + os << "], str=" << str << ", k=" << k; + } + +private: + string str; + double k; +}; + +class C : public A { +public: + C(short n, int k) : A{n}, y{k} {} + + double g(short w) { + return sin(w+y); + } + + string extract(short x) override { + string x2{""}; + char* narr = new char[x]; + short counter_narr{}; + + for(int i = 0; i < getLen(); ++i) { + switch(get(i)) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': + break; + default: + narr[counter_narr++] = get(i); + } + } + for(int i = 0; i < x; ++i) + x2+=narr[i]; + + delete[] narr; + + return x2; + } + + void print(ostream& os) override { + os << "C: base=["; + for(int i = 0; i < getLen(); ++i) { + os << get(i) << ' '; + } + os << "], y=" << y; + } + + C operator++(int) { + C temp{*this}; + + y++; + + return temp; + } +private: + int y; +}; + +ostream& operator<<(ostream& os, A& a) { + a.print(os); + + return os; +} + +int main() { + A *vett[DIM]; + + double sum{}; + short i_c{-1}; + for(int i=0; i<DIM; i++) { + short n=10+rand()%10; + switch(rand()%2){ + case 0: { + vett[i]= new C(n, rand()%20 + 1); + auto cref = dynamic_cast<C*>(vett[i]); + sum+=cref->g(5); + i_c = i; + break; + } + case 1: { + vett[i]= new B(n, rand()/(double) RAND_MAX); + auto bref = dynamic_cast<B*>(vett[i]); + sum+=bref->foo(5); + break; + } + } + } + + for(int i=0; i<DIM; i++) + cout << *(vett[i]) << ", extract(3)=" << vett[i]->extract(3) << endl; + + cout << sum/DIM << endl; + + if(i_c >= 0) { + cout << *vett[i_c] << endl; + auto cref = dynamic_cast<C*>(vett[i_c]); + (*cref)++; + cout << *vett[i_c] << endl; + + + } + return 0; +} |