Загрузка данных


# Задача 8: равновеликие треугольники

**Условие.** Даны три стороны одного и три стороны другого треугольника. Выяснить, равновелики ли они (равны ли их площади).

## Математическая модель

1. Полупериметры: p1 = (a1+b1+c1)/2, p2 = (a2+b2+c2)/2.
2. Площади по формуле Герона: S = √(p·(p−a)·(p−b)·(p−c)).
3. Вещественные числа нельзя сравнивать через «=» из-за погрешности округления. Поэтому условие равенства: |S1 − S2| < 0,0001.
4. Треугольник существует, если каждая сторона меньше суммы двух других. Иначе под корнем будет отрицательное число.

Функции Min и Max не используются: только `if`, `IfThen` и `abs`.

## Форма

С вкладки **Standard**:
- 6 × **Edit** (Edit1…Edit6), у всех очисти `Text`. Edit1–3 это стороны 1-го треугольника, Edit4–6 это стороны 2-го.
- 2 × **Label** с подписями «Треугольник 1» и «Треугольник 2».
- 4 × **Button**: «if без перем.», «if с перем.», «IfThen без перем.», «IfThen с перем.».
- Label7 для результата, `Caption` очисти.
- `Caption` формы: «Равновеликие треугольники».

## Модули (uses)

Допиши в конец списка `uses` модуль **StrUtils** (в новых Delphi это `System.StrUtils`). В нём лежит `IfThen` для строк, он нужен для вариантов 3 и 4. `SysUtils` (там `StrToFloat`) уже подключён, а `sqrt` и `abs` встроены.

```delphi
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils;
```

## Код

Вставь в раздел `implementation`, **перед** обработчиками кнопок. Это две вспомогательные функции:

```delphi
function Area(a, b, c: real): real;   // площадь по формуле Герона
var
  p: real;
begin
  p := (a + b + c) / 2;
  Area := sqrt(p * (p - a) * (p - b) * (p - c));
end;

function Exists(a, b, c: real): boolean;  // существует ли треугольник
begin
  Exists := false;
  if (a < b + c) and (b < a + c) and (c < a + b) then
    Exists := true;
end;
```

Обработчики кнопок (двойной щелчок по кнопке создаёт заготовку):

```delphi
// Вариант 1: if, без логической переменной
procedure TForm1.Button1Click(Sender: TObject);
var
  a1, b1, c1, a2, b2, c2, S1, S2: real;
begin
  a1 := StrToFloat(Edit1.Text);
  b1 := StrToFloat(Edit2.Text);
  c1 := StrToFloat(Edit3.Text);
  a2 := StrToFloat(Edit4.Text);
  b2 := StrToFloat(Edit5.Text);
  c2 := StrToFloat(Edit6.Text);
  if not (Exists(a1, b1, c1) and Exists(a2, b2, c2)) then
  begin
    Label7.Caption := 'Это не треугольник';
    exit;
  end;
  S1 := Area(a1, b1, c1);
  S2 := Area(a2, b2, c2);
  if abs(S1 - S2) < 0.0001 then
    Label7.Caption := 'Треугольники равновелики'
  else
    Label7.Caption := 'Треугольники не равновелики';
end;

// Вариант 2: if, с логической переменной
procedure TForm1.Button2Click(Sender: TObject);
var
  a1, b1, c1, a2, b2, c2, S1, S2: real;
  f: boolean;
begin
  a1 := StrToFloat(Edit1.Text);
  b1 := StrToFloat(Edit2.Text);
  c1 := StrToFloat(Edit3.Text);
  a2 := StrToFloat(Edit4.Text);
  b2 := StrToFloat(Edit5.Text);
  c2 := StrToFloat(Edit6.Text);
  if not (Exists(a1, b1, c1) and Exists(a2, b2, c2)) then
  begin
    Label7.Caption := 'Это не треугольник';
    exit;
  end;
  S1 := Area(a1, b1, c1);
  S2 := Area(a2, b2, c2);
  f := abs(S1 - S2) < 0.0001;
  if f then
    Label7.Caption := 'Треугольники равновелики'
  else
    Label7.Caption := 'Треугольники не равновелики';
end;

// Вариант 3: IfThen, без логической переменной
procedure TForm1.Button3Click(Sender: TObject);
var
  a1, b1, c1, a2, b2, c2, S1, S2: real;
begin
  a1 := StrToFloat(Edit1.Text);
  b1 := StrToFloat(Edit2.Text);
  c1 := StrToFloat(Edit3.Text);
  a2 := StrToFloat(Edit4.Text);
  b2 := StrToFloat(Edit5.Text);
  c2 := StrToFloat(Edit6.Text);
  if not (Exists(a1, b1, c1) and Exists(a2, b2, c2)) then
  begin
    Label7.Caption := 'Это не треугольник';
    exit;
  end;
  S1 := Area(a1, b1, c1);
  S2 := Area(a2, b2, c2);
  Label7.Caption := IfThen(abs(S1 - S2) < 0.0001,
    'Треугольники равновелики', 'Треугольники не равновелики');
end;

// Вариант 4: IfThen, с логической переменной
procedure TForm1.Button4Click(Sender: TObject);
var
  a1, b1, c1, a2, b2, c2, S1, S2: real;
  f: boolean;
begin
  a1 := StrToFloat(Edit1.Text);
  b1 := StrToFloat(Edit2.Text);
  c1 := StrToFloat(Edit3.Text);
  a2 := StrToFloat(Edit4.Text);
  b2 := StrToFloat(Edit5.Text);
  c2 := StrToFloat(Edit6.Text);
  if not (Exists(a1, b1, c1) and Exists(a2, b2, c2)) then
  begin
    Label7.Caption := 'Это не треугольник';
    exit;
  end;
  S1 := Area(a1, b1, c1);
  S2 := Area(a2, b2, c2);
  f := abs(S1 - S2) < 0.0001;
  Label7.Caption := IfThen(f,
    'Треугольники равновелики', 'Треугольники не равновелики');
end;
```

## Как это работает

- `StrToFloat` превращает текст из Edit в число.
- `Area` считает площадь, `Exists` проверяет, что треугольник возможен.
- `exit` сразу выходит из процедуры, если это не треугольник.
- Разница между вариантами:
  - **с логической переменной**: результат сравнения сначала кладётся в `f` (true/false), потом проверяется;
  - **без неё**: сравнение стоит прямо в условии;
  - **if**: обычный оператор, в ветках присваиваем текст;
  - **IfThen**: функция, она сама возвращает одну из двух строк в зависимости от условия.

## Тесты

| Стороны 1 | Стороны 2 | Результат |
|---|---|---|
| 3, 4, 5 | 4, 3, 5 | S = 6 и 6, равновелики |
| 5, 5, 6 | 5, 5, 8 | S = 12 и 12, равновелики |
| 3, 4, 5 | 6, 5, 5 | S = 6 и 12, не равновелики |
| 1, 1, 5 | 3, 4, 5 | не треугольник |

Дробные числа вводи с запятой (3,5), иначе будет ошибка.

## Блок-схема

Начало → ввод a1, b1, c1, a2, b2, c2 → ромб «Треугольники существуют?» (нет → вывод «Это не треугольник» → Конец) → p1, p2 → S1, S2 → (для вариантов 2 и 4: блок f = |S1−S2| < 0,0001) → ромб «|S1−S2| < 0,0001?» (да → «Равновелики», нет → «Не равновелики») → Конец.