
Информатика: создаём своего цифрового помощника Урок 22 из 26
Условия и граничные случаи
Научимся проверять условие на границе, чтобы помощник не забывал задачи ровно за два дня до срока.
Где мы на карте
Это третий блок одного проекта. Мы пользуемся данными версии 0.2, но пока описываем действия на бумаге: так можно обнаружить ошибку до написания Python.
Ситуация и вопрос
Вы договорились напоминать о невыполненной задаче, когда до срока осталось не более двух дней. Помощник молчит при двух днях и будит человека после срока. Ошибка скрыта в одном знаке сравнения. Найдём его на таблице, а не на глаз.
Новые слова без пропусков
Условие — вопрос с ответом «да» или «нет». Ветвление выбирает действия по ответу. Граница — значение, на котором ответ меняется: здесь 2 дня. Граничный случай проверяет само значение 2 и соседние 1 и 3. Булево значение — true или false; И требует выполнения обеих частей, а ИЛИ — хотя бы одной. Просрочено — срок уже прошёл; это отдельное состояние, а не «ещё ноль дней». Дату сравнивают по календарному правилу и одному часовому поясу; разные часовые пояса без согласования дают разные результаты.
Опорный сигнал
не выполнено И 0 ≤ дней_до_срока ≤ 2 → напомнить; прошло → просрочено
Разбираем шаг за шагом
Примем today = 2026-10-09 и считаем целые календарные дни в одном часовом поясе. Для срока 12 октября остаётся 3 дня — не напоминать; 11 октября — 2, напомнить; 10 октября — 1, напомнить; 9 октября — 0, напомнить сегодня; 8 октября — −1, показать «просрочено» по отдельному правилу. Если done=true, ни один из этих сроков не создаёт напоминания. Составьте таблицу из пяти строк и добавьте колонку done: одна и та же дата с разным состоянием даёт разный ответ.
Проверка руками
Поставьте на нарисованной числовой прямой точки −1, 0, 1, 2, 3. Закрасьте только отрезок от 0 до 2, включая концы. Теперь переведите рисунок в условие 0 ≤ days_to_due ≤ 2: каждая часть условия отвечает за один край. Уберите левую часть и проверьте −1; уберите правую и проверьте 3. Верните обе части. Отдельно положите карточку done=true поверх точки 1: напоминания уже нет. Так видны две независимые причины изменить ответ.
Предскажите и проверьте
Что даст условие days < 2 при 2 днях? false: граница ошибочно исключена. А days <= 2 при −1? true: просроченная задача смешана с будущей. Добавьте нижнюю границу 0 и отдельную ветку для прошедшего срока. Предскажите ответ для отсутствующего срока: сравнение не выполняется, выводится сообщение «срок не указан».
Поймайте ошибку
«Заменим ≤ на <: разница всего один день». Именно день на границе входит в требование «не более». Исправление проверяется тремя соседними значениями, а не одним удобным примером.
Перенос в новую ситуацию
Школьный кружок принимает заявки до 18:00 включительно. Проверьте 17:59, 18:00 и 18:01. Уточните часовой пояс и что означает «включительно» для секунды 18:00:30 — без этого требование неоднозначно.
Изменение проекта
Запишите в ALGORITHM-ru.md порядок проверок: запись найдена, срок есть, задача не выполнена, срок не прошёл, осталось 0–2 дня. Добавьте таблицу тестов для −1, 0, 1, 2, 3 и done=true. Укажите календарную дату и часовой пояс, чтобы опыт можно было повторить.
Задание и доказательство
Исправьте неверное условие days < 2 и составьте не менее семи тестов, включая отсутствующий срок и выполненную задачу. Доказательство — таблица входов, ожидаемых сообщений и объяснение каждой границы.
Возврат через 1, 7 и 30 дней
Завтра объясните, почему 2 включено, а −1 нет. Через семь дней проверьте границу другого правила. Через месяц сравните тесты с реальной обработкой даты в программе.
Следующий урок: Повторение без копирования и условие остановки
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.