Advertisement
196040

OOP labs 7 Shapes

May 15th, 2020
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. class Shape { //Потребно е да конструирате абстракна класа Shape
  5. protected: //со само еден параметар:
  6.     int strana; //страна (int)
  7. public: //Конструктори:
  8.     Shape () { //Shape() // defaulten konstruktor
  9.         this->strana = 0;
  10.     }
  11.     Shape (int a) { //Shape(int a) // konstruktor so argumenti
  12.         this-> strana = a;
  13.     } //И виртуелните методи:
  14.     virtual double plostina() = 0; // double plostina()
  15.     virtual void pecati() = 0; //void pecati()
  16.     virtual int getType() = 0; //int getType()
  17.     Shape (const Shape &s) { // copy konstruktor
  18.         this-> strana = s.strana;
  19.     }
  20.     ~Shape() {} // destruktor
  21. }; //Од таа класа вие треба да конструирате 3 изведени класи:
  22. class Square : public Shape { //  Square
  23. public: //Изведените класи немаат дополнителни парамтери, туку ја наследуваат страната од Shape
  24.     Square() {} // defaulten konstruktor
  25.     Square(int strana) : Shape (strana) {} // konstruktor so argumenti ?? valjda
  26.     Square(const Square &sq) : Shape(sq) {} // valjda copy konstruktor
  27.     double plostina() { //Секоја од класите си има своја формула за plostina()
  28.         return strana*strana; //соодветна за нивната геометриска фигура
  29.     } //Формула за плоштина на квадрат а * a
  30.     void pecati() {
  31.         cout<<"Kvadrat so plostina = "<<plostina()<<endl;
  32.     }
  33.     int getType() { //getType() методот треба да враќа:
  34.         return 1;  //  1 за Square
  35.     }
  36. };
  37. class Circle : public Shape { //  Circle
  38. public: //Конструкторот на изведените класи ќе зема еден аругмент, страната на фигурата.
  39.     Circle() {} // defaulten konstruktor
  40.     Circle(int strana) : Shape (strana) {} // konstruktor so argumenti ?? valjda
  41.     Circle(const Circle &c) : Shape(c) {} // valjda copy konstruktor
  42.     double plostina() {
  43.         return 3.14 * strana * strana; //Формула за плоштина на круг 3.14 * a * a
  44.     }
  45.     void pecati() {
  46.         cout<<"Krug so plostina = "<<plostina()<<endl;
  47.     }
  48.     int getType() {
  49.         return 2;   // 2 за Circle
  50.     }
  51. };
  52. class Triangle : public Shape { //  Triangle
  53. public:
  54.     Triangle() {} // defaulten konstruktor
  55. //При пишување на конструкторот на изведените класи да се искористи констукторот на родител класата
  56.     Triangle(int strana) : Shape (strana) {} // konstruktor so argumenti ?? valjda
  57.     Triangle(const Triangle &t) : Shape(t) {} // valjda copy konstruktor
  58.     double plostina() { //Формула за плоштина на триаголник
  59.         return (sqrt(3)/4) * strana * strana;  // (sqrt(3)/4) * side * side
  60.     }
  61.     void pecati() { //За pecati() методот упатете се кон outputot за тест случајите.
  62.         cout<<"Triagolnik so plostina = "<<plostina()<<endl;
  63.     }
  64.     int getType() {
  65.         return 3;  // 3 за Triangle
  66.     }
  67. };
  68. void checkNumTypes (Shape ** niza, int n) { //Дефинирајте го методот void checkNumTypes(Shape** niza, int n)
  69.     int krugce = 0;
  70.     int kvadrat = 0;
  71.     int triagolnik = 0;
  72.     for(int i=0; i<n; i++) {
  73.       //  Square * s = dynamic_cast<Square *>(niza[i]);
  74.      //                if (s!=0) kvadrat++;
  75.       //  Circle * c = dynamic_cast<Circle *>(niza[i]);
  76.       //               if (c!=0) krugce++;
  77.       //  Triangle *t = dynamic_cast<Triangle *>(niza[i]);
  78.       //                  if(t!=0) triagolnik++;
  79.         if(niza[i]->getType()==1)
  80.             kvadrat++;
  81.         if(niza[i]->getType()==2)
  82.            krugce++;
  83.         if(niza[i]->getType()==3)
  84.             triagolnik++;
  85.     } // fakticki voa e nogu glupo od mene poso mozese so getType ama posle go vidiv ama
  86.         //ce me izede guilt ako ne go napisam i toa taka da eve neka dreme u komentar drugoto
  87.     cout<<"Broj na kvadrati vo nizata = "<<kvadrat<<endl;
  88.     cout<<"Broj na krugovi vo nizata = "<<krugce<<endl;
  89.     cout<<"Broj na triagolnici vo nizata = "<<triagolnik<<endl;
  90. } // така што ќе испечати во три реда колку квадрати, кругови и триаголници има во низата.
  91. int main() { //Покрај тоа треба да ја допишете Main класата така што ќе алоцирате динамичка низа
  92.     int n;   // од покажувачи кон класата Shape.
  93.     cin >> n; //Прво се добива n - големината на динамичката низа.
  94.     Shape **niza = new Shape * [n]; //TODO: inicijaliziraj niza od pokazuvachi kon klasata Shape
  95.     //TODO: alociraj memorija so golemina n za prethodno navedenata niza
  96.     int classType;
  97.     int side;
  98.         for(int i = 0; i < n; ++i) { //TODO: konstruiraj for ciklus so chija pomosh ke ja popolnish nizata
  99.             cin >> classType; //Потоа n пати се добиваат пар цели броеви t i a,
  100.             cin >> side; //каде што t е типот на објектот и а е страната на објектот.
  101.             if(classType == 1) //Потоа кај секој покажувач од низата зависно од дадениот input
  102.                 niza[i] = new Square(side);// да алоцирате објект
  103.             if(classType == 2)
  104.                 niza[i] = new Circle(side); //од една од трите изведени класи.
  105.             if(classType == 3)
  106.                 niza[i] = new Triangle(side);
  107.         }
  108.     for(int i = 0; i < n; ++i) {
  109.         niza[i]->pecati();
  110.     }
  111.     checkNumTypes(niza, n);
  112.     return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement