Advertisement
196040

OOP labs 7 Numbers

May 16th, 2020
439
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.29 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3. class Number { //Да се дефинира апстрктна класа Number
  4.     public: //со следните чисто виртуелни методи:
  5.     virtual double doubleValue() = 0; //double doubleValue() -ја враќа децималната вредност на даден број
  6.     virtual int intValue() = 0; //int intValue() = 0 ја враќа целобројната вредност на даден број
  7.     virtual void print() = 0; //void print() - печати информации за бројот. (1 поен)
  8. };
  9. class Integer : public Number { //Од оваа класа да се изведат две класи:
  10. private:// Integer (во која што се чува
  11.     int celbroj; //еден број од тип int)
  12.     public: //За двете изведени класи да се имплементираaт соодветен конструктори,
  13.     Integer() { // defaulten
  14.     this->celbroj = 0;
  15.     }
  16.     Integer(int celbroj) { //TODO konstruktor so eden argument
  17.     this->celbroj = celbroj;
  18.     }
  19.     double doubleValue(){ //како и да се препокријат методите од основната класа. (1 поени)
  20.     return this->celbroj * 1.0;
  21.     }
  22.     int intValue() {
  23.     return this->celbroj;
  24.     }
  25.     void print(){
  26.     cout<<"Integer: "<<celbroj<<endl;
  27.     }
  28. };
  29. class Double : public Number { // Double (во која што се чува
  30.     private:
  31.     double decimalen; //еден број од тип double) (1 поен).
  32.     public:
  33.     Double(){
  34.     this->decimalen = 0;
  35.     }
  36.     Double(double decimalen) {
  37.     this->decimalen = decimalen;
  38.     }    
  39.     double doubleValue() {
  40.     return this->decimalen;
  41.     }
  42.     int intValue() {
  43.     return (int)decimalen;
  44.     }
  45.     void print() {
  46.     cout<<"Double: "<<decimalen<<endl;
  47.     }
  48. };
  49. bool operator==(Number &n1, Number &n2) { //Да се преоптовари операторот == којшто ќе споредува
  50. if(n1.doubleValue()==n2.doubleValue())
  51.     return true;
  52.     else return false;
  53. }//два броеви според нивната вредност (објекти од класа Number) (1 поен)
  54. class Numbers { //Дополнително да се дефинира класа Numbers
  55.     private: //во која што ќе се чуваат:
  56.     Number **niza; //динамички алоцирана низа од покажувачи кон објекти од класата Number
  57.     int broj; //број на елементи во низата од покажувачи
  58. public: //За класата да се имплементира
  59.     Numbers(){ //соодветен конструктор (default) , како и: (1 поени)
  60.     this-> niza = new Number * [0];
  61.      this->broj = 0;
  62.     }
  63.     Numbers(const Numbers &n) { //TODO copy konstruktor
  64.     this->broj = n.broj;
  65.     this->niza = new Number * [n.broj];
  66.         for(int i = 0; i<n.broj; i++)
  67.             this->niza[i] = n.niza[i];
  68.     }
  69.     Numbers &operator=(const Numbers &n) { //TODO operator =
  70.         if(this!=&n) {
  71.         this->broj = n.broj;
  72.     this->niza = new Number * [n.broj];
  73.         for(int i = 0; i<n.broj; i++)
  74.             this->niza[i] = n.niza[i];
  75.         }
  76.         return *this;
  77.     }
  78.     Numbers &operator+=(Number *novo) { //операторот += за додавање на броеви во низата од броеви (1 поен)
  79.     bool add = true; //Бројот се додава ако и само ако сите броеви
  80.       for (int i = 0; i < broj; i++) //што се веќе додадени во низата се различни од него
  81.        {
  82.        if (*niza[i] == *novo)
  83.         {
  84.                 add = false;
  85.      }
  86.      }
  87.         if (add)
  88.         {
  89.             Number** nova = new Number*[broj + 1];
  90.             for (int i = 0; i < broj; i++)
  91.             {
  92.                 nova[i] = niza[i];
  93.             }
  94.             if (add)
  95.             {
  96.                 nova[broj] = novo;
  97.                 broj++;
  98.             }
  99.        //     delete[] niza;
  100.             niza = nova;
  101.         }
  102.         return *this;
  103.     }
  104.     ~Numbers(){ //TODO destruktor
  105.   //  for(int i = 0; i<broj; i++)
  106.     //    delete [] niza;
  107.     }    
  108.     void statistics() { // функција void statistics() која што печати информации за броевите во низата:
  109.  int count = 0, countinteger = 0, suminteger = 0, countdouble = 0;
  110.         double sumdouble = 0.0, sum = 0.0;
  111.         for(int i=0; i<broj; i++) {
  112.         Integer * p1 = dynamic_cast <Integer *> (niza[i]);
  113.             if(p1!=0) {
  114.                 count++;
  115.             countinteger++;
  116.             suminteger = suminteger + niza[i]->intValue();
  117.                 sum=sum+niza[i]->intValue();
  118.             }
  119.        Double *p2 = dynamic_cast <Double *> (niza[i]);
  120.             if(p2!=0) {
  121.             count++;
  122.             countdouble++;
  123.             sumdouble = sumdouble + niza[i]->doubleValue();
  124.                 sum=sum+niza[i]->doubleValue();
  125.             }
  126.         }
  127.     cout<<"Count of numbers: "<<count<<endl;
  128.     cout<<"Sum of all numbers: "<<sum<<endl;
  129.     cout<<"Count of integer numbers: "<<countinteger<<endl;
  130.     cout<<"Sum of integer numbers: "<<suminteger<<endl;
  131.     cout<<"Count of double numbers: "<<countdouble<<endl;
  132.     cout<<"Sum of double numbers: "<<sumdouble<<endl;
  133.     }
  134.     void integersLessThan (Integer n) {  //функција void integersLessThan (Integer n)
  135.        int flag = 1;
  136.         for(int i=0; i<broj; i++) {
  137.             Integer * p1 = dynamic_cast <Integer *> (niza[i]);
  138.             if(p1!=0)
  139.                 if(niza[i]->intValue() < n.intValue()) {
  140.     niza[i]->print();
  141.                 flag = 0;
  142.             }
  143.         }
  144.        if(flag==1)
  145.                 cout<<"None"<<endl;
  146.             } //која што ги печати сите цели броеви помали од бројот n (1 поен)
  147.     void doublesBiggerThan(Double n) { //функција void doublesBiggerThan (Double n)
  148.         int flag=1;
  149.         for(int i=0; i<broj; i++) {
  150.        Double *p2 = dynamic_cast <Double *> (niza[i]);
  151.             if(p2!=0)
  152.             if(niza[i]->doubleValue() > n.doubleValue())
  153.             {
  154.                 niza[i]->print();
  155.                 flag = 0;
  156.             }
  157.         }   if(flag==1)
  158.                 cout<<"None"<<endl;
  159.     } //која што ги печати сите децимални броеви поголеми од бројот n (1 поен)
  160. }; // ja da potenciram deka mojta programa rabote na codeblocks a ne znam so mu e na code problemot :)
  161. int main() {
  162.     int n;
  163.     cin>>n;
  164.     Numbers numbers;
  165.     for (int i=0;i<n;i++) {
  166.         int type;
  167.         double number;
  168.         cin>>type>>number;
  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.     int lessThan;
  179.     double biggerThan;
  180.     cin>>lessThan;
  181.     cin>>biggerThan;       
  182.     cout<<"STATISTICS FOR THE NUMBERS\n";
  183.     numbers.statistics();
  184.     cout<<"INTEGER NUMBERS LESS THAN "<<lessThan<<endl;
  185.     numbers.integersLessThan(Integer(lessThan));
  186.     cout<<"DOUBLE NUMBERS BIGGER THAN "<<biggerThan<<endl;
  187.     numbers.doublesBiggerThan(Double(biggerThan));
  188.     return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement