StefiIOE

Numbers 80% Polimorfizam

May 17th, 2020
1,222
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4.  
  5. class Number {
  6. public:
  7.     virtual double doubleValue()=0;
  8.     virtual int intValue()=0;
  9.     virtual void print()=0;
  10. };
  11.  
  12. class Integer :public Number {
  13.     int n ;
  14. public:
  15.     Integer(int n ) {
  16.         this->n=n;
  17.     }
  18.     Integer (const Integer &i) {
  19.         this->n=i.n;
  20.     }
  21.     int intValue() {
  22.         return n ;
  23.     }
  24.     double doubleValue() {
  25.         return (double) n ;
  26.     }
  27.  
  28.     void print() {
  29.         cout<<"Integer: "<<n<<endl;
  30.     }
  31. };
  32.  
  33. class Double : public Number {
  34. private:
  35.     double s;
  36. public:
  37.     Double(double s) {
  38.         this->s=s;
  39.     }
  40.     Double (const Double &d) {
  41.         this->s=d.s;
  42.     }
  43.     double doubleValue() {
  44.         return s;
  45.     }
  46.     int intValue() {
  47.         return (int) s;
  48.     }
  49.     void print() {
  50.         cout<<"Double: "<<s<<endl;
  51.     }
  52. };
  53.  
  54. class Numbers {
  55. private:
  56.     Number **number;
  57.         int n ;
  58.         void copy(const Numbers &s) {
  59.         this->n=s.n;
  60.         this->number=new Number*[s.n+1];
  61.         for (int i = 0; i < this->n ; i ++) {
  62.             number[i]=s.number[i];
  63.         }
  64.     }
  65. public:
  66.     Numbers() {
  67.         n=0;
  68.         this->number=new Number*[0];
  69.     }
  70.     Numbers(const Numbers &n) {
  71.         copy(n);
  72.     }
  73.     Numbers &operator=(const Numbers &n ) {
  74.         if(this!=&n) {
  75.             delete[] number;
  76.             copy(n);
  77.         }
  78.         return *this;
  79.     }
  80.     ~Numbers() {
  81.         delete[]number;
  82.     }
  83.  
  84.  
  85.     Numbers &operator += (Number*numb) {
  86.         Number**tmp= new Number*[this->n+1];
  87.         for(int i = 0 ; i < n ; i ++) {
  88.             tmp[i]=number[i];
  89.         }
  90.         tmp[n]=numb;
  91.         n++;
  92.         delete[] number;
  93.         number=tmp;
  94.  
  95.         return *this;
  96.  
  97.     }
  98.     void statistics() {
  99.         int  sumi= 0, counti=0  ,countd=0;
  100.         double sum=0, sumd=0.0;
  101.  
  102.  
  103.         for(int i =0 ; i < n ; i ++) {
  104.             Integer *in=dynamic_cast<Integer*>(number[i]);
  105.             {
  106.                 if(in!=0) {
  107.                     counti++;
  108.                     sumi+=number[i]->intValue();
  109.                    
  110.                 }
  111.             }
  112.             Double*d=dynamic_cast<Double*>(number[i]);
  113.             if(d!=0) {
  114.                 countd++;
  115.                 sumd+=number[i]->doubleValue();
  116.                
  117.             }
  118.  
  119.             sum+=number[i]->doubleValue();
  120.         }
  121.         cout<<"Count of numbers: "<<n<<endl;
  122.         cout<<"Sum of all numbers: "<<sum<<endl;
  123.         cout<<"Count of integer numbers: "<<counti<<endl;
  124.         cout<<"Sum of integer numbers: "<<sumi<<endl;
  125.         cout<<"Count of double numbers: "<<countd<<endl;
  126.         cout<<"Sum of double numbers: "<<sumd<<endl;
  127.  
  128.     }
  129.  
  130.     void integersLessThan (Integer N) {
  131.         bool flag= true;
  132.         for(int i = 0 ; i <n ; i++) {
  133.             Integer*in=dynamic_cast<Integer*>(number[i]);
  134.            
  135.             if (in!=0&&number[i]->intValue()<N.intValue()) {
  136.                 number[i]->print();
  137.                 flag=false;
  138.             }
  139.         }
  140.         if (flag)
  141.             cout<<"None"<<endl;
  142.     }
  143.  
  144.  
  145.     void doublesBiggerThan (Double N) {
  146.         bool flag=true;
  147.         for(int i = 0 ; i <n ; i++) {
  148.             Double*d=dynamic_cast<Double*>(number[i]);
  149.             if (d!=0&&number[i]->doubleValue()>N.doubleValue()) {
  150.                 number[i]->print();
  151.                 flag=false;
  152.             }
  153.         }
  154.         if (flag)
  155.             cout<<"None"<<endl;
  156.     }
  157. };
  158.  
  159. int main() {
  160.  
  161.     int n;
  162.     cin>>n;
  163.     Numbers numbers;
  164.     for (int i=0; i<n; i++) {
  165.         int type;
  166.         double number;
  167.         cin>>type>>number;
  168.        // cout<<type<<" "<<number<<endl;
  169.         if (type==0) { //Integer object
  170.             Integer * integer = new Integer((int)number);
  171.             numbers+=integer;
  172.          
  173.         } else {
  174.             Double * doublee = new Double(number);
  175.             numbers+=doublee;
  176.         }
  177.     }
  178.  
  179.     int lessThan;
  180.     double biggerThan;
  181.  
  182.     cin>>lessThan;
  183.     cin>>biggerThan;
  184.  
  185.     cout<<"STATISTICS FOR THE NUMBERS\n";
  186.     numbers.statistics();
  187.     cout<<"INTEGER NUMBERS LESS THAN "<<lessThan<<endl;
  188.     numbers.integersLessThan(Integer(lessThan));
  189.     cout<<"DOUBLE NUMBERS BIGGER THAN "<<biggerThan<<endl;
  190.     numbers.doublesBiggerThan(Double(biggerThan));
  191.  
  192.     return 0;
  193. }
RAW Paste Data