zadach503.PAS

{* Задача 503 *}

Unit ZADACH503;
Interface
Implementation
Begin
 writeln('На плоскости координатами своих вершин задан треугольник. Определить, к какому типу он принадлежит (остро- , тупо- или прямоугольный)');
End.

Program zadach503;
Const {* Константы *}
  eps = 10E - 5; {    Поскольку в стандартной библиотеке Паскаля функция вычисления арккосинуса    отсутствует, пишем ее самостоятельно ...  }
Function ArcCos(X : Double) : Double;
Begin
  If abs(X) < eps Then
    arccos := Pi / 2
  Else arccos := ArcTan(Sqrt(1 - Sqr(X)) / X) + Pi * Byte(X < 0);
End;
Type { Структура для хранения координат X, Y точки }
  Point = Record      X, Y : double;
  End;
Const { Переменная для хранения признака того, что один из углов треугольника - прямой ... }
  is90 : Boolean = False; {    Процедура, запрашивающая у пользователя ввод координат X и Y определенной точки,    и возвращающая эту точку через
Var {* Объявление переменных *}

  - параметр...  }
Procedure GetCoord(
Const {* Константы *}
  s : String;
Var {* Необходимые переменные *}
  P : Point);
  Begin
  WriteLn('Point ' + s);
  Write('X = ');
  ReadLn(P.X);
  Write('Y = ');
  ReadLn(P.Y);
  End{    Функция для определения расстояния между двумя точками ...    (Зачем нужен
Var {* Объявление переменных *}


Var {* В работе нам потребуются переменные: *}
  dist             : Double;
  pA               : Point);
  pB               : Point);
  Begin
  dist := Sqrt(Sqr(pA.X - pB.X) + Sqr(pA.Y - pB.Y));
  GetDist := dist;
  {    Функция, возвращающая угол (в градусах !!!) между двумя сторонами    треугольника, вычисленный из формулы теоремы косинусов  }
Function Angle(A : Double);
B                : Double);
C                : Double);
Var {* Необходимые переменные *}
  value                              : Double;
  Begin
  Value := ArcCos((Sqr(A) + Sqr(B) - Sqr(C)) / (2 * A * B)) * (180 / Pi);
If Abs(value - 90) < eps Then
  is90 := True;
Angle := value;
Var {      Переменные для хранения вершин треугольника    }
  pA    : Point;
  pB    : Point;
  pC    : Point; {      Длины сторон треугольника :      A - длина стороны AB;
  B - длина стороны BC;
  C - длина стороны AC;
  }

  A     : double;
  B     : double;
  C     : double; {      Углы треугольника:      alpha - угол между AC и BC (противолежит AB)      beta  - угол между AB и AC (противолежит BC)      gamma - угол между AB и BC (противолежит AC)    }
  alpha : double;
  beta  : double;
  gamma : double;
  Begin {      Получаем координаты вершин треугольника    }
  GetCoord('A', pA);
  GetCoord('B', pB);
  GetCoord('C', pC); {      Вычисляем все углы в заданном треугольнике    }
  alpha := Angle(               GetDist(B, pB, pC),               GetDist(C, pA, pC),               GetDist(A, pA, pB)             );
  beta := Angle(A, C, B);
  gamma := Angle(A, B, C); {      И по вычисленным углам делаем вывод о том,      является ли данный треугольник остро- , тупо- или прямоугольным    }
If is90 Then
  WriteLn('Прямоугольный')
Else If (alpha < 90) And (beta < 90) And (gamma < 90) Then
  WriteLn('Остроугольный')
Else If (alpha > 90) Or (beta > 90) Or (gamma > 90) Then
  WriteLn('Тупоугольный')
End..