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


Всё понял. Делаю полное задание.

---

# ПРАКТИЧЕСКАЯ РАБОТА: Калькулятор ИМТ (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`).

---

Всё готово. Для отчёта: заполни колонку «Фактический результат» в таблице тестирования после запуска, и вставь скриншоты в обозначенные места.