# Занятие 5. Уточняющие вопросы, тестовые примеры и инварианты

ОП.04 «Основы алгоритмизации и программирования», 3 курс.
Основание: строка 5 КТП_ОП04_алгоритмизация_154ч.docx; 2 академических часа.
Формат КТП: I — interview lab. Кандидат не пишет код до согласования примеров.

Практический результат: чек-лист проверки решения (что спросить, что
протестировать, как объяснить цикл) и заполненный бланк практикума, в котором
под каждый набор ограничений выбрано одно из десяти готовых решений.

## Устройство темы

Две страницы и два дополнительных материала для самостоятельной работы.

| Страница | Минуты | Что происходит |
|---|---:|---|
| `lekciya.html` | 45 | Семь частей связного текста: корректность и контракт, уточняющие вопросы, тесты и классы входов, пять особых входов, инвариант цикла, ручной прогон, итоги. В каждой части определение, разбор примера и задание |
| `praktikum.html` | 45 | Две задачи по десять решений: вопросы к условию, карта вариантов, выбор под пять заказов, запуск проверки, обмен задачами в паре, сдача и критерии |
| `09-keysy.html` | — | Банк из 12 кейсов для самостоятельной практики |
| `10-trenazher.html` | — | Тренажёр рассуждений: какой вопрос меняет решение, ограничения, поиск контрпримера, стресс-тест |

В лекции восемь врезок с определениями и напоминаниями, в том числе разбор,
почему множество и словарь отвечают быстрее списка, и напоминание из темы 4
про запись O(n). Термины, которые в теме встречаются впервые — traceback,
ключ сортировки, посимвольное сравнение строк, разрядность типа, `enumerate`,
поток данных, — расшифрованы там, где появляются.

Примеры лекции: сжатие строки, предусловие и постусловие через assert, подсчёт слов,
пять типовых падений, сумма покупок в корзине, самая длинная серия равных соседей, двоичный поиск.

## Лекция: части и примеры

Связный текст, а не конспект: в каждой части объяснение абзацами, определение
в рамке, разбор конкретного примера с настоящим выводом и задание с разбором.
Примеры разные — поиск максимума как сквозной пример убран.

1. **Что значит «решение верное»** — корректность относительно условия; неполнота условия;
   пример `1_sjatie_stroki.py`: «aaabb → a3b2» даёт разные ответы на строке `abc`.
   Контракт функции, предусловие и постусловие, аналогия с договором проката,
   запись проверок через `assert` — `6_predusloviye.py`. Задание: разложить четыре
   утверждения на предусловие и постусловие.
2. **Уточняющие вопросы** — критерий полезного вопроса (меняет код, контракт или тесты);
   пять групп с объяснением каждой: вход, ответ, особые случаи, ограничения, данные.
   **Банк вопросов**: пять таблиц, 33 вопроса в той формулировке, в какой их произносят,
   с колонкой «что меняется от ответа»; тот же список отдельным файлом
   `materials/bank-voprosov.md` для печати. **Три кейса** с разбором «вопрос → ответ →
   что изменилось в решении»: пара с суммой target, сортировка заявок по дате
   (строковая дата, пропуски, ключ из двух полей), поиск одинаковых адресов почты
   (регистр, пробелы, True/False против списка повторов). Запись ответов в docstring.
   Задание: вопросы к задаче о поиске индекса.
3. **Тестовые примеры и классы входов** — тестовый случай; почему ожидаемый результат
   пишут до запуска; `2_schet_slov.py` с построчным разбором пяти тестов; понятие класса
   входов; пять классов, которые берут почти всегда; контрпример и асимметрия
   «одна ошибка доказывает, сто тестов не доказывают». Задание: разложить тесты по классам.
4. **Особые входы** — пять случаев, каждый абзацем с механизмом отказа: пустой вход,
   отрицательные, дубликаты, последний элемент, переполнение; `3_osobye_vhody.py`
   и сводная таблица.
5. **Инвариант цикла** — сначала разбор на сумме покупок в корзине (`7_korzina.py`):
   «в уме лежит стоимость того, что уже в корзине», три шага объяснения на этом же
   примере, связь с математической индукцией. Затем случай с двумя переменными —
   `4_seriya.py` (самая длинная серия равных соседей) с картинкой про доски забора,
   таблицей утверждений и прогоном состояний. Три типичных промаха формулировки,
   отличие инварианта от условия цикла, мера убывания для `while` на длине отрезка
   в двоичном поиске. Задание: сформулировать инвариант для счётчика положительных.
6. **Ручной прогон** — определение, разбор `5_ruchnoy_progon.py` (двоичный поиск
   с `while left < right`) с таблицей состояний, минимальный контрпример и способ его
   сужения, четыре правила про границы цикла. Задание: прогон `est_nol` на входе `[0]`.
7. **Итоги** — как связаны три части работы, чек-лист «до кода / во время / после»
   и пять вопросов без кода с разбором.

Примеры лежат в `materials/lekciya/` (семь файлов), архив — `materials/lekciya-primery.zip`.
Весь вывод на странице получен их запуском (Python 3.12).

## Практикум: две задачи по десять решений

A. «Верните k-й по величине элемент списка» — `materials/praktikum/zadacha_a_kth.py`.
B. «Есть ли число x в списке» при нескольких запросах — `materials/praktikum/zadacha_b_poisk.py`.

Ошибок в файлах нет: все варианты правильные, пока соблюдены их требования
к входу. Выбор идёт по пяти заказам на задачу — наборам ограничений.
Ответы разбора: A1 → v01, A2 → v04, A3 → v07, A4 → v02, A5 → v10;
B1 → v01/v02, B2 → v03, B3 → v09, B4 → v06, B5 → v07. Не подходят ни одному
заказу: в A — v05, v06, v08, v09; в B — v05, v08, а v04 и v10 рабочие,
но в каждом заказе проигрывают.

Участник 1 берёт задачу A, участник 2 — B, через 10 минут меняются,
3 минуты на сверку. Разборы на страницах открываются через 45–60 секунд
после появления блока на экране: это время на собственный ответ.

Проверка: `python3 -m unittest -v test_variantov.py` из папки `materials/praktikum`
(9 тестов). Замер своими числами: `python3 zamer.py`.

## Контроль — 10 баллов

По 2 балла: пять вопросов к условию на каждую задачу; заполненная карта десяти
вариантов; выбор под каждый из пяти заказов с объяснением «почему не соседний»;
названные отсеянные варианты; запущенная проверка и разобранные с парой
расхождения. Баллы даются за объяснение выбора ограничениями, а не за совпадение
с ключом. Перевод баллов в отметку определяет преподаватель.

## Материалы

- `materials/lekciya/` и `lekciya-primery.zip` — пять примеров лекции.
- `materials/praktikum/` и `lesson05-praktikum.zip` — задачи, проверка, замер, бланк, README.
- `materials/praktikum-5-7.pdf` — печатный бланк и листинг всех двадцати вариантов;
  собирается скриптом `materials/praktikum/build_pdf.py` из тех же `.py` файлов.
- `shots/` — два снимка VS Code: трассировка ValueError и отладочный print.

## Что было убрано и почему

Прежние восемь модулей, семь учебных сцен собеседования и двадцать блоков
с цитатами удалены по запросу: материал был расплывчатым, один и тот же пример
с поиском максимума повторялся во всех разделах, а блоков было больше, чем
содержания. Осталась последовательная лекция с разными примерами и практикум.
