Advertisement
Guest User

Lab 15_2_19_D

a guest
Feb 26th, 2020
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <sstream>
  4. #include <typeinfo>
  5. #define DIM 50
  6. using namespace std;
  7.  
  8. class A{
  9. private:
  10.     int *ptr;
  11.     short len;
  12. public:
  13.     A(short m, short k){
  14.         ptr=new int[m];
  15.         for(short i=0; i<m; i++)
  16.             ptr[i]=rand()%k+1;
  17.         this->len=m;
  18.     }
  19.  
  20.     virtual double f()=0;
  21.  
  22.     int get(short i){return this->ptr[i%len];}
  23.  
  24.     short getLen(){return this->len;}
  25.  
  26.     virtual ostream &put(ostream &s){
  27.         stringstream ss;
  28.         ss<<", ptr=[ ";
  29.         for(short i=0; i<getLen(); i++)
  30.             ss<<get(i)<<" ";
  31.         ss<<"]";
  32.         return s<<ss.str();
  33.     }
  34.  
  35.     int &operator[](short k){return ptr[k%len];}
  36. };
  37.  
  38. class B: public A{
  39. private:
  40.     double p;
  41. public:
  42.     B(short m, short k, double y): A(m,k), p(y){}
  43.  
  44.     double f(){
  45.         int somma=0;
  46.         for(short i=0; i<getLen(); i++)
  47.             if(get(i)%2==0)
  48.                 somma+=get(i);
  49.         return somma/p;
  50.     }
  51.  
  52.     ostream &put(ostream &s){
  53.         A::put(s);
  54.         return s<<", p="<<p;
  55.     }
  56. };
  57.  
  58. class C: public A{
  59. private:
  60.     char x;
  61. public:
  62.     C(short n, short k, char c): A(n,k), x(c){}
  63.  
  64.     double f(){
  65.         double avg=0;
  66.         short counter=0;
  67.         for(short i=0; i<getLen(); i++)
  68.             if(get(i)%2!=0){
  69.                 avg+=get(i);
  70.                 counter++;
  71.             }
  72.         if(counter==0)
  73.             return 0;
  74.         else
  75.             return avg/counter;
  76.     }
  77.  
  78.     string g(char c){
  79.         stringstream ss;
  80.         ss<<x<<c;
  81.         return ss.str();
  82.     }
  83.  
  84.     ostream &put(ostream &s){
  85.         A::put(s);
  86.         return s<<", x="<<x;
  87.     }
  88. };
  89.  
  90. ostream &operator<<(ostream &s, A &a){
  91.     if(typeid(a)==typeid(B))
  92.         s<<"1B";
  93.     else if(typeid(a)==typeid(C))
  94.         s<<"1C";
  95.     return a.put(s);
  96. }
  97.  
  98. int main()
  99. {
  100.     srand(111222333);
  101.     A *vett[DIM];
  102.  
  103.     for(int i=0; i<DIM; i++){
  104.         short n=1+rand()%10;
  105.         short m = 1+rand()%8;
  106.         if(rand()%2==0)
  107.             vett[i]= new B(n, m, rand()/(double) RAND_MAX+0.05);
  108.         else
  109.             vett[i]= new C(n, m, (char) (rand()%('z' - 'a' + 1) + 'a'));
  110.     }
  111.  
  112.     cout<<"PUNTO 1:"<<endl;
  113.     for(int i=0; i<DIM; i++)
  114.         cout<<i<<")"<<*vett[i]<<", f()="<<vett[i]->f()<<endl;
  115.  
  116.     cout<<endl<<"PUNTO 2:"<<endl;
  117.     double avg=0;
  118.     stringstream conc;
  119.     C *ptr;
  120.     for(int i=0; i<DIM; i++){
  121.         avg+=vett[i]->f();
  122.         if((ptr=dynamic_cast<C*>(vett[i]))!=NULL)
  123.             conc<<ptr->g('h');
  124.     }
  125.     cout<<"AVG="<<avg/DIM<<", CONC="<<conc.str()<<endl;
  126.  
  127.     cout<<endl<<"PUNTO 3:"<<endl;
  128.     cout<<*vett[0]<<endl;
  129.     (*vett[0])[1]=100;
  130.     cout<<"(*vett[0])[1]=100"<<endl;
  131.     cout<<*vett[0]<<endl;
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement