Proc 56 - 60

Proc56 - находим длину отрезка на плоскости по координатам его концов.
Proc57 - находим периметр треугольника по координатам его вершин.
Proc58 - находим площадь треугольника по координатам его вершин.
Proc59 - вычисляем расстояние от точки до прямой на плоскости.
Proc60 - вычисляем высоты треугольника, используя координаты вершин.

Proc56. Описать функцию Leng(xA, yA, xB, yB) вещественного типа, находящую длину отрезка AB на плоскости по координатам его концов:

|AB| = ((xA − xB)2 + (yA − yB)2)1/2

(xA, yA, xB, yB — вещественные параметры). С помощью этой функции найти длины отрезков AB, AC, AD, если даны координаты точек A, B, C, D.

program proc56;
{ Функция возвращает длину отрезка АВ на плоскости 
по координатам его концов (xA, yA), (xB, yB): }
function Leng(xA, yA, xB, yB: real): real;
begin
  Leng := sqrt(sqr(xA - xB) + sqr(yA - yB))
end;

var { Координаты точек A, B, C и D: }
  xA, xB, xC, xD, yA, yB, yC, yD: real; 

begin
  write('Координаты точки А:  ');
  readln(xA, yA);
  write('Координаты точки B:  ');
  readln(xB, yB);
  write('Координаты точки C:  ');
  readln(xC, yC);
  write('Координаты точки D:  ');
  readln(xD, yD);
  writeln;
  writeln('Результат:');
  writeln(' |AB| = ', Leng(xA, yA, xB, yB):0:2);
  writeln(' |AC| = ', Leng(xA, yA, xC, yC):0:2);
  writeln(' |AD| = ', Leng(xA, yA, xD, yD):0:2);
  readln
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Аналогом задачи Proc56, но только без процедур, является задача Begin20 на странице Координаты на плоскости.

Proc57. Используя функцию Leng из задания Proc56, описать функцию Perim(xA, yA, xB, yB, xC, yC) вещественного типа, находящую периметр треугольника ABC по координатам его вершин (xA, yA, xB, yB, xC, yC — вещественные параметры). С помощью этой функции найти периметры треугольников ABC, ABD, ACD, если даны координаты точек A, B, C, D.

program proc57;

{ Функция возвращает периметр треугольника ABC по 
координатам его вершин (xA, yA), (xB, yB), (xC, yC): }
function Perim(xA, yA, xB, yB, xC, yC: real): real;
  
  { Функция возвращает длину отрезка АВ на плоскости
  по координатам его концов (xA, yA), (xB, yB): }
  function Leng(xA, yA, xB, yB: real): real;
  begin
    Leng := sqrt(sqr(xA - xB) + sqr(yA - yB))
  end;
 
var
  AB, AC, BC: real;
begin
  AB := Leng(xA, yA, xB, yB); //длина стороны АВ
  AC := Leng(xA, yA, xC, yC); //длина стороны АС
  BC := Leng(xB, yB, xC, yC); //длина стороны ВС
  Perim := AB + AC + BC //вычисляем периметр треугольника АВС
end;

var { Координаты точек A, B, C и D: }
  xA, xB, xC, xD, yA, yB, yC, yD: real;

begin
  write('Координаты точки А:  ');
  readln(xA, yA);
  write('Координаты точки B:  ');
  readln(xB, yB);
  write('Координаты точки C:  ');
  readln(xC, yC);
  write('Координаты точки D:  ');
  readln(xD, yD);
  writeln;
  writeln('Результат:');
  writeln(' pABC = ', Perim(xA, yA, xB, yB, xC, yC):0:2);
  writeln(' pABD = ', Perim(xA, yA, xB, yB, xD, yD):0:2);
  writeln(' pACD = ', Perim(xA, yA, xC, yC, xD, yD):0:2)
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Proc58. Используя функции Leng и Perim из заданий Proc56 и Proc57, описать функцию Area(xA, yA, xB, yB, xC, yC) вещественного типа, находящую площадь треугольника ABC по формуле

SABC = (p·(p−|AB|)·(p−|AC|)·(p−|BC|))1/2,

где p — полупериметр. С помощью этой функции найти площади треугольников ABC, ABD, ACD, если даны координаты точек A, B, C, D.

{ Функция возвращает площадь треугольника ABC по формуле Герона,
если заданы координаты его вершин (xA, yA), (xB, yB), (xC, yC): }
function Area(xA, yA, xB, yB, xC, yC: real): real;
var
  AB, AC, BC, p: real; //стороны и полупериметр треугольника

 { Функция возвращает длину отрезка АВ на плоскости
 по координатам его концов (xA, yA), (xB, yB): }
 function Leng(xA, yA, xB, yB: real): real;
 begin
   Leng := sqrt(sqr(xA - xB) + sqr(yA - yB))
 end;
 
 { Функция возвращает периметр треугольника ABC по 
 координатам его вершин (xA, yA), (xB, yB), (xC, yC): }
 function Perim(xA, yA, xB, yB, xC, yC: real): real;
 begin
   AB := Leng(xA, yA, xB, yB); //длина стороны АВ
   AC := Leng(xA, yA, xC, yC); //длина стороны АС
   BC := Leng(xB, yB, xC, yC); //длина стороны ВС
   Perim := AB + AC + BC //вычисляем периметр треугольника АВС
 end;

{ тело ОСНОВНОЙ процедуры: }
begin
  p := Perim(xA, yA, xB, yB, xC, yC) / 2; //находим полупериметр
  Area := sqrt(p * (p - AB) * (p - AC) * (p - BC))
end;

var { Координаты точек A, B, C и D: }
  xA, xB, xC, xD, yA, yB, yC, yD: real;

begin
  write('Координаты точки А:  ');
  readln(xA, yA);
  write('Координаты точки B:  ');
  readln(xB, yB);
  write('Координаты точки C:  ');
  readln(xC, yC);
  write('Координаты точки D:  ');
  readln(xD, yD);
  writeln;
  writeln('Результат:');
  writeln(' sABC = ', Area(xA, yA, xB, yB, xC, yC):0:2);
  writeln(' sABD = ', Area(xA, yA, xB, yB, xD, yD):0:2);
  writeln(' sACD = ', Area(xA, yA, xC, yC, xD, yD):0:2)
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Вычисление площади треугольника без использования процедур вы можете посмотреть в примере Begin21.

Proc59. Используя функции Leng и Area из заданий Proc56 и Proc58, описать функцию Dist(xP, yP, xA, yA, xB, yB) вещественного типа, находящую расстояние D(P, AB) от точки P до прямой AB по формуле

D(P, AB) = 2·SPAB/|AB|,

где SPAB — площадь треугольника PAB. С помощью этой функции найти расстояния от точки P до прямых AB, AC, BC, если даны координаты точек P, A, B, C.

{ Функция возвращает расстояние от точки P(xP, yP) до 
отрезка АВ с координатами концов A(xA, yA) и B(xB, yB) }
function Dist(xP, yP, xA, yA, xB, yB: real): real;

  { Функция возвращает длину отрезка АВ на плоскости
  по координатам его концов (xA, yA), (xB, yB): }
  function Leng(xA, yA, xB, yB: real): real;
  begin
    Leng := sqrt(sqr(xA - xB) + sqr(yA - yB))
  end;
 
  { Функция возвращает площадь треугольника ABC по формуле Герона,
  если заданы координаты его вершин (xA, yA), (xB, yB), (xC, yC): }
  function Area(xA, yA, xB, yB, xC, yC: real): real;
  var
    AB, AC, BC, p: real; //стороны и полупериметр треугольника
  
    { Функция возвращает периметр треугольника ABC по 
    координатам его вершин (xA, yA), (xB, yB), (xC, yC): }
    function Perim(xA, yA, xB, yB, xC, yC: real): real;
    begin
      AB := Leng(xA, yA, xB, yB); //длина стороны АВ
      AC := Leng(xA, yA, xC, yC); //длина стороны АС
      BC := Leng(xB, yB, xC, yC); //длина стороны ВС
      Perim := AB + AC + BC //вычисляем периметр треугольника АВС
    end;

  { Реализация функции Area: }
  begin
    p := Perim(xA, yA, xB, yB, xC, yC) / 2; //находим полупериметр
    Area := sqrt(p * (p - AB) * (p - AC) * (p - BC))
  end;

{ Реализация основной подпрограммы Dist: }
begin
  Dist := 2 * Area(xP, yP, xA, yA, xB, yB) / Leng(xA, yA, xB, yB)
end;

var { Координаты точек P, A, B, C: }
  xP, xA, xB, xC, yP, yA, yB, yC: real;

begin
  write('Координаты точки P:  ');
  readln(xP, yP);
  write('Координаты точки А:  ');
  readln(xA, yA);
  write('Координаты точки B:  ');
  readln(xB, yB);
  write('Координаты точки C:  ');
  readln(xC, yC);  
  writeln;
  writeln('Результат:');
  writeln(' D(P, AB) = ', Dist(xP, yP, xA, yA, xB, yB):0:2);
  writeln(' D(P, AC) = ', Dist(xP, yP, xA, yA, xC, yC):0:2);
  writeln(' D(P, BC) = ', Dist(xP, yP, xB, yB, xC, yC):0:2)
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Proc60. Используя функцию Dist из задания Proc59, описать процедуру Altitudes(xA, yA, xB, yB, xC, yC, hA, hB, hC), находящую высоты hA, hB, hC треугольника ABC (выходные параметры), проведенные соответственно из вершин A, B, C (их координаты являются входными параметрами). С помощью этой процедуры найти высоты треугольников ABC, ABD, ACD, если даны координаты точек A, B, C, D.

{ Процедура находит высоты hA, hB, hC треугольника АВС, 
проведенные из вершин A(xA, yA), B(xB, yB), C(xC, yC) }
procedure Altitudes(xA,yA,xB,yB,xC,yC: real; var hA,hB,hC: real);

  { Функция возвращает расстояние от точки P(xP, yP) до 
  отрезка АВ с координатами концов A(xA, yA) и B(xB, yB) }
  function Dist(xP, yP, xA, yA, xB, yB: real): real;
  
    { Функция возвращает длину отрезка АВ на плоскости
    по координатам его концов (xA, yA), (xB, yB): }
    function Leng(xA, yA, xB, yB: real): real;
    begin
      Leng := sqrt(sqr(xA - xB) + sqr(yA - yB))
    end;
   
    { Функция возвращает площадь треугольника ABC по формуле Герона,
    если заданы координаты его вершин (xA, yA), (xB, yB), (xC, yC): }
    function Area(xA, yA, xB, yB, xC, yC: real): real;
    var
      AB, AC, BC, p: real; //стороны и полупериметр треугольника
    
      { Функция возвращает периметр треугольника ABC по 
      координатам его вершин (xA, yA), (xB, yB), (xC, yC): }
      function Perim(xA, yA, xB, yB, xC, yC: real): real;
      begin
        AB := Leng(xA, yA, xB, yB); //длина стороны АВ
        AC := Leng(xA, yA, xC, yC); //длина стороны АС
        BC := Leng(xB, yB, xC, yC); //длина стороны ВС
        Perim := AB + AC + BC //вычисляем периметр треугольника АВС
      end;
  
    { Реализация функции Area: }
    begin
      p := Perim(xA, yA, xB, yB, xC, yC) / 2; //находим полупериметр
      Area := sqrt(p * (p - AB) * (p - AC) * (p - BC))
    end;
  
  { Реализация подпрограммы Dist: }
  begin
    Dist := 2 * Area(xP, yP, xA, yA, xB, yB) / Leng(xA, yA, xB, yB)
  end;

{ тело основной процедуры Altitudes: }
begin
  hA := Dist(xA, yA, xB, yB, xC, yC); //рассторяние от А до ВС
  hB := Dist(xB, yB, xA, yA, xC, yC); //рассторяние от В до АС
  hC := Dist(xC, yC, xA, yA, xB, yB)  //рассторяние от С до АВ
end;

var { Координаты точек A, B, C и D и высоты: }
  xA, yA, xB, yB, xC, yC, xD, yD, hA, hB, hC, hD: real;

begin
  write('Координаты точки А:  ');
  readln(xA, yA);
  write('Координаты точки B:  ');
  readln(xB, yB);
  write('Координаты точки C:  ');
  readln(xC, yC);
  write('Координаты точки D:  ');
  readln(xD, yD);
  writeln;
  writeln('Высоты треугольника АВС:');
  Altitudes(xA, yA, xB, yB, xC, yC, hA, hB, hC);
  writeln(' hA = ', hA:0:2);
  writeln(' hB = ', hB:0:2);
  writeln(' hC = ', hC:0:2);
  writeln;
  writeln('Высоты треугольника АВD:');
  Altitudes(xA, yA, xB, yB, xD, yD, hA, hB, hD);
  writeln(' hA = ', hA:0:2);
  writeln(' hB = ', hB:0:2);
  writeln(' hD = ', hD:0:2);
  writeln;
  writeln('Высоты треугольника АСD:');
  Altitudes(xA, yA, xC, yC, xD, yD, hA, hC, hD);
  writeln(' hA = ', hA:0:2);
  writeln(' hC = ', hC:0:2);
  writeln(' hD = ', hD:0:2);
  readln
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **function** Sqr(x: real): real;: Возвращает квадрат числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308