Создание класса "Треугольник" - C#
Формулировка задачи:
Создать класс треугольник, члены класса - координаты 3х точек. Предусмотреть в классе методы проверки существования треугольника, вычисления и вывода сведений о фигуре - длины сторон, углы, периметр, площадь. Создать производный класс - равносторонний треугольник, предусмотреть в классе проверку является ли треугольник равносторонним. Написать программу, демонстрирующую работу с классом: дано N треугольников и M равносторонних треугольников, вывести номера одинаковых треугольников и равносторонний треугольник с наименьшей медианой.
Решение задачи: «Создание класса "Треугольник"»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
public class Triangle
{
internal class Point
{
public double X;
public double Y;
public Point(double x, double y)
{
X = x;
Y = y;
}
public double GetSize()
{
return Math.Sqrt(Math.Pow(X, 2) + Math.Pow(Y, 2));
}
}
private Point[] verts = new Point[3];
private double[] _sizes = new double[3];
public Triangle(double ax, double ay, double bx, double by, double cx, double cy)
{
verts[0] = new Point(bx - ax, by - ay);
verts[1] = new Point(cx - bx, cy - by);
verts[2] = new Point(cx - ax, cy - ay);
_sizes = verts.Select(x => x.GetSize()).ToArray();
}
public double[] GetSideSizes()
{
return _sizes;
}
public double GetPerimeter()
{
return GetSideSizes().Sum();
}
public double GetArea()
{
var sizes = GetSideSizes();
var p = GetPerimeter()/2d;
return Math.Sqrt(p*sizes.Select(z=>p-z).Aggregate(1d, (x,y) => x*y));
}
public bool Exists()
{
return _sizes[0] + _sizes[1] > _sizes[2] && _sizes[0] + _sizes[2] > _sizes[1] && _sizes[1] + _sizes[2] > _sizes[0];
}
public double[] GetAngles()
{
var result = new double[3];
result[0] = Math.Acos( (Math.Pow(_sizes[1], 2) + Math.Pow(_sizes[2], 2) - Math.Pow(_sizes[0], 2))/(2*_sizes[1]*_sizes[2]) );
result[1] = Math.Acos( (Math.Pow(_sizes[0], 2) + Math.Pow(_sizes[2], 2) - Math.Pow(_sizes[1], 2)) / (2 * _sizes[0] * _sizes[2]) );
result[2] = Math.PI - result[0] - result[1];
return result;
}
}
public class EquiliteralTriangle : Triangle
{
public EquiliteralTriangle(double ax, double ay, double bx, double by, double cx, double cy) :
base(ax, ay, bx, by, cx, cy)
{
}
public bool IsEquiLiteral()
{
var sizes = GetSideSizes();
return !sizes.Any(x => Math.Abs(x - sizes[0]) > 1e3);
}
public double GetMedian()
{
return GetSideSizes()[0] * Math.Sqrt(3) / 2;
}
}
}