Загрузка данных
# Задача 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?» (да → «Равновелики», нет → «Не равновелики») → Конец.