Advertisement
SunBroMarko

mindbox

Oct 15th, 2019
525
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.12 KB | None | 0 0
  1. using System;
  2.  
  3. namespace FigureArea
  4.  
  5. {
  6.     abstract class Figure
  7.     {
  8.         public abstract double Area();
  9.  
  10.         public abstract double Perimeter();
  11.  
  12.         public abstract string Type();
  13.  
  14.     }
  15.  
  16.     class Rectangle : Figure
  17.     {
  18.         public double Width { get; }
  19.         public double Height { get; }
  20.  
  21.         public Rectangle(double width, double height)
  22.         {
  23.             this.Width = width;
  24.             this.Height = height;
  25.         }
  26.  
  27.         public override double Area()
  28.         {
  29.             return Width * Height;
  30.         }
  31.  
  32.         public override double Perimeter()
  33.         {
  34.             return 2 * Width + 2 * Height;
  35.         }
  36.  
  37.         public override string Type()
  38.         {
  39.             string type = "";
  40.  
  41.             if (Width == Height)
  42.             {
  43.                 type = "Квадрат";
  44.             }
  45.             else
  46.             {
  47.                 type = "Прямоугольник";
  48.             }
  49.  
  50.             return type;
  51.         }
  52.     }
  53.  
  54.     class Circle : Figure
  55.     {
  56.         public double Radius { get;}
  57.  
  58.         public Circle(double radius)
  59.         {
  60.             this.Radius = radius;
  61.         }
  62.  
  63.         public override double Area()
  64.         {
  65.             return Math.PI * Math.Pow(Radius, 2);
  66.         }
  67.  
  68.         public override double Perimeter()
  69.         {
  70.             return 2 * Math.PI * Radius;
  71.         }
  72.  
  73.         public override string Type()
  74.         {
  75.             string type = "Круг";
  76.  
  77.             return type;
  78.         }
  79.  
  80.     }
  81.  
  82.     class Triangle : Figure
  83.     {
  84.         public double Side1 { get; }
  85.         public double Side2 { get; }
  86.         public double Side3 { get; }
  87.  
  88.         public double AngleOutSide1 { get;}
  89.         public double AngleOutSide2 { get;}
  90.         public double AngleOutSide3 { get;}
  91.  
  92.         public bool ItIsTrianlge { get; } // Пользователь может ввести любые 3 стороны, однако из них треугольник может не получится.
  93.        
  94.         public Triangle(double side1, double side2, double side3)
  95.         {
  96.             this.Side1 = side1;
  97.             this.Side2 = side2;
  98.             this.Side3 = side3;
  99.  
  100.             ItIsTrianlge = side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1;
  101.  
  102.             if (ItIsTrianlge)
  103.             {
  104.                 double AngleOutSide1Cos = (Math.Pow(side2, 2) + Math.Pow(side3, 2) - Math.Pow(side1, 2)) / (2 * side2 * side3);
  105.                 double AngleOutSide2Cos = (Math.Pow(side1, 2) + Math.Pow(side3, 2) - Math.Pow(side2, 2)) / (2 * side1 * side3);
  106.                 double AngleOutSide3Cos = (Math.Pow(side1, 2) + Math.Pow(side2, 2) - Math.Pow(side3, 2)) / (2 * side1 * side2);
  107.                 AngleOutSide1 = Math.Acos(AngleOutSide1Cos) * 180 / Math.PI;
  108.                 AngleOutSide2 = Math.Acos(AngleOutSide2Cos) * 180 / Math.PI;
  109.                 AngleOutSide3 = Math.Acos(AngleOutSide3Cos) * 180 / Math.PI;
  110.             }
  111.             else
  112.             {
  113.                 AngleOutSide1 = 0;
  114.                 AngleOutSide2 = 0;
  115.                 AngleOutSide3 = 0;
  116.             }
  117.            
  118.         }
  119.  
  120.         public override double Area()
  121.         {
  122.             if (ItIsTrianlge)
  123.             {
  124.                 double HalfPerimeter = Perimeter() / 2;
  125.                 return Math.Sqrt(HalfPerimeter * (HalfPerimeter - Side1) * (HalfPerimeter - Side2) * (HalfPerimeter - Side3));
  126.             }
  127.             else
  128.             {
  129.                 return 0;
  130.             }
  131.            
  132.         }
  133.  
  134.         public override double Perimeter()
  135.         {
  136.             if (ItIsTrianlge)
  137.             {
  138.                 return Side1 + Side2 + Side3;
  139.             }
  140.             else
  141.             {
  142.                 return 0;
  143.             }
  144.         }
  145.  
  146.         public override string Type()
  147.         {
  148.             string type = "Треугольник";
  149.  
  150.             if (AngleOutSide1==90 || AngleOutSide2 ==90 || AngleOutSide3==90)
  151.             {
  152.                 type = "Прямоугольный треугольник";
  153.             }
  154.  
  155.             if ((Side1 == Side2 || Side2 == Side3) && (AngleOutSide1 == 90 || AngleOutSide2 == 90 || AngleOutSide3 == 90))
  156.             {
  157.                 type = "Равносторонний прямоугольный треугольник";
  158.             }
  159.  
  160.             if (Side1==Side2 || Side2 == Side3 )
  161.             {
  162.                 type = "Равносторонний треугольник";
  163.             }
  164.  
  165.             if (!ItIsTrianlge)
  166.             {
  167.                 type = "Вырожденный треугольник";
  168.             }
  169.  
  170.             return type;
  171.         }
  172.        
  173.     }
  174. }
  175.  
  176. // У меня было несколько путей решения:
  177. // Во первых можно было написать класс фигура, с множеством перегрузок, но тогда нужно было делать так-же перегрузки методов, и класс бы превратился в кашу.
  178. // Во вторых использовать абстрактный класс фигура, который только объявляет функционал, но раскрытие сущностей происходит в классах наследниках. Так я и решил поступить.
  179. //Благодаря этому походу, пользователь может обратится к Figure, и спросить 1 из 3 возможных параметров, и в не зависимости каким конструктором (наследником) фигура была создана, пользователь получит требуемые данные.
  180. //Однако некоторые фигуры имеют больший функционал полей, и для их получения требуется использовать downcast. На сколько я понял это норма, но как по мне не всегда удобно, и прозрачно для пользователя. Хотелось бы знать есть ли решение лучше.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement