Advertisement
daniil_mironoff

lab3

Mar 7th, 2020
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. ////////////////////////////////////////////////////////////////
  8.  
  9. // ФИГУРА
  10. // Базовый (Абстрактный) класс
  11. class figure {
  12.     protected:
  13.         // ...
  14.  
  15. //--------------------------------------------------------------
  16.  
  17.     public:
  18.         // Конструктор без аргументов
  19.         figure(void) { /* ... */ }
  20.  
  21. //--------------------------------------------------------------
  22.  
  23.         virtual float area() const =0;       // Возвращает площадь
  24.         virtual float perimeter() const =0;  // Возвращает периметр
  25.  
  26.         virtual void print() const =0;       // Выводит значения
  27.         // p.s. Если добавить в абстрактный класс поле,
  28.         //      то print() стоит сделать НЕчистой виртуальной функцией,
  29.         //      т.е. добавить в нее вывод нового поля/полей
  30.         //      и вызывать ( как figure::print() ) в перегрузках
  31.  
  32.  
  33.        
  34.  
  35. };
  36.  
  37. ////////////////////////////////////////////////////////////////
  38.  
  39. // КРУГ
  40. // Дочерний класс (класса ФИГУРА)
  41. class circle : public figure {
  42.     private:
  43.         float radius;
  44.  
  45. //--------------------------------------------------------------
  46.  
  47.     public:
  48.         // Конструктор с 1-arg: радиусом
  49.         circle( const float& rad ) : figure() , radius(rad) { /* ... */ }
  50.  
  51. //--------------------------------------------------------------
  52.  
  53.         float area() const
  54.             { return ( 3.14159 * radius * radius ); }
  55.  
  56.         float perimeter() const
  57.             { return ( 2 * 3.14159 * radius ); }
  58.  
  59. //--------------------------------------------------------------
  60.  
  61.         void print() const {
  62.             cout << "| Information - Circle |"   << endl
  63.                  << "Area: "      << area()      << endl
  64.                  << "Perimeter: " << perimeter() << endl
  65.                  << "Radius: "    << radius      << endl
  66.                  << endl;
  67.         }
  68.        
  69.  
  70. };
  71.  
  72. ////////////////////////////////////////////////////////////////
  73.  
  74. // ТРАПЕЦИЯ
  75. // Дочерний класс (класса ФИГУРА)
  76. class trapeze : public figure {
  77.     private:
  78.         float horizontal_top,
  79.               horizontal_lower,
  80.               vertical_left,
  81.               vertical_right,
  82.               height;
  83.  
  84. //--------------------------------------------------------------
  85.  
  86.     public:
  87.         // Конструктор с 2-arg: горизонталью и вертикалью
  88.         trapeze
  89.         ( const float& horiz_top, const float& horiz_low,
  90.           const float& vert_left, const float& vert_right,
  91.           const float& _height ) :
  92.        
  93.         figure() , horizontal_top(horiz_top) , horizontal_lower(horiz_low) ,
  94.         height(_height), vertical_left(vert_left) , vertical_right(vert_right) { /* ... */ }
  95.  
  96. //--------------------------------------------------------------
  97.  
  98.         float area() const
  99.             { return height * ( ( horizontal_top + horizontal_lower ) / 2 ); }
  100.  
  101.         float perimeter() const
  102.             { return horizontal_top + horizontal_lower + vertical_left + vertical_right; }
  103.  
  104. //--------------------------------------------------------------
  105.  
  106.         void print() const {
  107.             cout << "| Information - Trapeze |" << endl
  108.                  << "Area: "                    << area()           << endl
  109.                  << "Perimeter: "               << perimeter()      << endl
  110.                  << "Horizontal - Top: "        << horizontal_top   << endl
  111.                  << "Horizontal - Lower: "      << horizontal_lower << endl
  112.                  << "Vertical - Left: "         << vertical_left    << endl
  113.                  << "Vertical - Right: "        << vertical_right   << endl
  114.                  << "Height: "                  << height           << endl
  115.                  << endl;
  116.         }
  117.        
  118.  
  119. };
  120.  
  121. ////////////////////////////////////////////////////////////////
  122.  
  123. // ПРЯМОУГОЛЬНИК
  124. // Дочерний класс (класса ФИГУРА)
  125. class rectangle : public figure {
  126.     private:
  127.         float horiz, vert;
  128.  
  129. //--------------------------------------------------------------
  130.  
  131.     public:
  132.         // Конструктор с 2-arg: горизонталью и вертикалью
  133.         rectangle( const float& horizontal, const float& vertical ) :
  134.             figure() , horiz(horizontal) , vert(vertical) { /* ... */ }
  135.  
  136. //--------------------------------------------------------------
  137.  
  138.         float area() const
  139.             { return ( horiz * vert ); }
  140.  
  141.         float perimeter() const
  142.             { return ( 2 * horiz + 2 * vert ); }
  143.  
  144. //--------------------------------------------------------------
  145.  
  146.         void print() const {
  147.             cout << "| Information - Rectangle |" << endl
  148.                  << "Area: "       << area()      << endl
  149.                  << "Perimeter: "  << perimeter() << endl
  150.                  << "Horizontal: " << horiz       << endl
  151.                  << "Vertical: "   << vert        << endl
  152.                  << endl;
  153.         }
  154.        
  155.  
  156. };
  157.  
  158. ////////////////////////////////////////////////////////////////
  159.  
  160. template<class ... T>
  161. auto sum_area(T ... obj) {
  162.     return (obj.area() + ...);
  163. }
  164.  
  165. ////////////////////////////////////////////////////////////////
  166.  
  167.  
  168. int main() {
  169.     vector<figure*> vecFigure;
  170.     vecFigure.push_back(new circle(5));
  171.     vecFigure.push_back(new rectangle(5, 3));
  172.     vecFigure.push_back(new trapeze(3, 5, 10, 10, 7));
  173.  
  174.     for (auto iter : vecFigure) {
  175.         iter -> print();
  176.     }
  177.     auto result = sum_area
  178.                  (rectangle(1, 1), rectangle(1, 2), rectangle(1, 3),
  179.                   rectangle(2, 1), rectangle(2, 2), rectangle(2, 3),
  180.                   rectangle(3, 1), rectangle(3, 2), rectangle(3, 3),
  181.                   rectangle(4, 1));
  182.  
  183.     cout << "Sum area: " << result << endl;
  184.  
  185.  
  186.     return 0;
  187. }
  188.  
  189. ////////////////////////////////////////////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement