Загрузка данных
Всё понял. Делаю полное задание.
---
# ПРАКТИЧЕСКАЯ РАБОТА: Калькулятор ИМТ (Lazarus)
---
## БЛОК-СХЕМА АЛГОРИТМА
```
┌─────────────────┐
│ НАЧАЛО │
└────────┬────────┘
│
┌────────▼────────┐
│ Ввод Рост (см) │
│ Ввод Вес (кг) │
└────────┬────────┘
│
┌────────▼──────────────┐
│ Рост и Вес — числа? │
│ Рост > 0? Вес > 0? │
└────────┬──────────────┘
│
НЕТ ◄──┴──► ДА
│ │
┌────────▼────────┐ ┌───▼────────────────────┐
│ Вывод ошибки: │ │ РостМ := Рост / 100 │
│ "Некорректный │ │ ИМТ := Вес / (РостМ²) │
│ ввод" │ └───┬────────────────────┘
└────────┬────────┘ │
│ ┌────▼──────────────────────────┐
│ │ ИМТ < 18.5? │
│ │ → "Дефицит массы тела" │
│ │ 18.5 ≤ ИМТ < 25.0? │
│ │ → "Норма" │
│ │ 25.0 ≤ ИМТ < 30.0? │
│ │ → "Избыточный вес" │
│ │ ИМТ ≥ 30.0? │
│ │ → "Ожирение" │
│ └────┬──────────────────────────┘
│ │
│ ┌───────▼──────────────┐
│ │ Вывод ИМТ и │
│ │ категории на форму │
│ └───────┬──────────────┘
│ │
└───────┬────────┘
│
┌────────▼────────┐
│ КОНЕЦ │
└─────────────────┘
```
---
## ТЕКСТ ДЛЯ ОТЧЁТА (Word)
---
### Этап 1. Алгоритм и спецификация
**Формула расчёта ИМТ:**
> *[Вставь сюда формулу из редактора формул Word]*
Формула: **ИМТ = m / h²**, где:
- m — масса тела в килограммах
- h — рост в метрах
**Классификация ВОЗ:**
| ИМТ | Категория |
|---|---|
| < 18.5 | Дефицит массы тела |
| 18.5 — 24.9 | Норма |
| 25.0 — 29.9 | Избыточный вес |
| ≥ 30.0 | Ожирение |
**Спецификация элементов формы:**
| Элемент | Тип | Назначение |
|---|---|---|
| Label1 | TLabel | Текст «Рост (см)» |
| Label2 | TLabel | Текст «Вес (кг)» |
| edtHeight | TEdit | Поле ввода роста |
| edtWeight | TEdit | Поле ввода веса |
| btnCalc | TButton | Кнопка «Рассчитать» |
| lblBMI | TLabel | Вывод значения ИМТ |
| lblCategory | TLabel | Вывод категории |
---
### Этап 2. Интерфейс
> *[Вставь сюда скриншот формы Lazarus до нажатия кнопки — пустые поля ввода]*
---
### Этап 3. Код программного продукта
Код приведён в разделе ниже.
---
### Этап 4. Отладка
> *[Вставь сюда скриншот окна отладчика Lazarus — точка останова на строке вычисления ИМТ, в окне Watches видны переменные: height, weight, heightM, bmi]*
---
### Этап 5. Тестирование
| Сценарий | Входные данные | Ожидаемый результат | Фактический результат |
|---|---|---|---|
| Норма | 175 см, 70 кг | ИМТ = 22.86, «Норма» | |
| Ошибка ввода | «Высокий», 80 кг | Сообщение об ошибке | |
| Граничное (дефицит) | 150 см, 40 кг | ИМТ = 17.78, «Дефицит» | |
| Ожирение | 170 см, 100 кг | ИМТ = 34.60, «Ожирение» | |
> *[Вставь сюда скриншот программы после нажатия кнопки с результатом для сценария «Норма»]*
> *[Вставь сюда скриншот программы с сообщением об ошибке ввода]*
---
### Этап 6. Рефакторинг
В ходе рефакторинга были внесены следующие изменения:
1. Вычисление `heightM := height / 100` вынесено в отдельную переменную для наглядности.
2. Логика классификации выделена в отдельную функцию `GetBMICategory` — это улучшает читаемость и позволяет переиспользовать её.
3. Добавлены комментарии к функции `GetBMICategory` и обработчику кнопки.
4. Убрано дублирование кода проверки ввода.
---
## КОД (Lazarus / Free Pascal)
---
### Настройка формы
**Создай следующие компоненты на форме:**
1. **Label1** (TLabel)
- `Caption` = `'Рост (см):'`
- `Left` = 16, `Top` = 16
2. **Label2** (TLabel)
- `Caption` = `'Вес (кг):'`
- `Left` = 16, `Top` = 50
3. **edtHeight** (TEdit)
- `Name` = `'edtHeight'`
- `Text` = `''`
- `Left` = 120, `Top` = 13
4. **edtWeight** (TEdit)
- `Name` = `'edtWeight'`
- `Text` = `''`
- `Left` = 120, `Top` = 47
5. **btnCalc** (TButton)
- `Name` = `'btnCalc'`
- `Caption` = `'Рассчитать'`
- `Left` = 16, `Top` = 90
6. **lblBMI** (TLabel)
- `Name` = `'lblBMI'`
- `Caption` = `''`
- `Left` = 16, `Top` = 130
- `Font.Size` = 12, `Font.Style` = `[fsBold]`
7. **lblCategory** (TLabel)
- `Name` = `'lblCategory'`
- `Caption` = `''`
- `Left` = 16, `Top` = 160
- `Font.Size` = 11
---
### Код (вставить в Unit1.pas)
```pascal
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
edtHeight: TEdit;
edtWeight: TEdit;
btnCalc: TButton;
lblBMI: TLabel;
lblCategory: TLabel;
procedure btnCalcClick(Sender: TObject);
private
// Функция классификации ИМТ — принимает значение, возвращает категорию
function GetBMICategory(bmi: Double): String;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
// -------------------------------------------------------
// GetBMICategory: классификация ИМТ по стандарту ВОЗ
// Параметр: bmi — вычисленный индекс массы тела
// Возвращает: строку с описанием категории
// -------------------------------------------------------
function TForm1.GetBMICategory(bmi: Double): String;
begin
if bmi < 18.5 then
Result := 'Дефицит массы тела'
else if bmi < 25.0 then
Result := 'Норма'
else if bmi < 30.0 then
Result := 'Избыточный вес'
else
Result := 'Ожирение';
end;
// -------------------------------------------------------
// btnCalcClick: обработчик нажатия кнопки «Рассчитать»
// -------------------------------------------------------
procedure TForm1.btnCalcClick(Sender: TObject);
var
height, weight : Double; // рост в см, вес в кг
heightM : Double; // рост в метрах
bmi : Double; // индекс массы тела
code1, code2 : Integer; // коды ошибок конвертации строк
begin
// Попытка преобразовать введённые строки в числа
Val(edtHeight.Text, height, code1);
Val(edtWeight.Text, weight, code2);
// Проверка корректности ввода
if (code1 <> 0) or (code2 <> 0) then
begin
ShowMessage('Ошибка: введите числовые значения роста и веса!');
Exit;
end;
if (height <= 0) or (weight <= 0) then
begin
ShowMessage('Ошибка: рост и вес должны быть больше нуля!');
Exit;
end;
// Конвертация роста из сантиметров в метры
heightM := height / 100;
// Вычисление ИМТ по формуле: ИМТ = вес / рост²
bmi := weight / (heightM * heightM);
// Вывод результата на форму
lblBMI.Caption := 'ИМТ: ' + FormatFloat('0.00', bmi);
lblCategory.Caption := GetBMICategory(bmi);
end;
end.
```
---
### Как подключить обработчик кнопки
Дважды кликни на `btnCalc` в дизайнере — Lazarus сам создаст `procedure btnCalcClick` и привяжет её к событию `OnClick`. Код из блока выше вставь внутрь этой процедуры (тело уже готово, копируй содержимое `begin..end`).
---
Всё готово. Для отчёта: заполни колонку «Фактический результат» в таблице тестирования после запуска, и вставь скриншоты в обозначенные места.