Как выбирать между следованием, ветвлением и циклом?
Структурная программа собирается из последовательности действий, выбора ветви и повторения. Эти конструкции выражают разные свойства задачи: следование фиксирует зависимость…
Структурная программа собирается из последовательности действий, выбора ветви и повторения. Эти конструкции выражают разные свойства задачи: следование фиксирует зависимость шагов, ветвление разделяет случаи, цикл описывает повторяющийся переход между состояниями. Правильный выбор делает доказательство заметным прямо в коде.
Следование
Команды выполняются в заданном порядке, и каждая получает состояние, оставленное предыдущей. Перестановка допустима только при отсутствии зависимости по данным и побочных эффектов. Например, сначала нужно прочитать коэффициенты, затем вычислить дискриминант и только после этого выбирать форму ответа.
Ветвление
Условие должно разбивать пространство входов на понятные случаи. В цепочке if–else порядок проверок важен: более общий предикат может поглотить частный. Для диапазонов полезно заранее проверить, что ветви не пересекаются и вместе покрывают все допустимые значения.
Цикл с предусловием
Такой цикл проверяет условие до тела и может не выполниться ни разу. Он подходит, когда повторение разрешено только при текущем состоянии, например пока индекс меньше длины массива. Инициализация должна сделать первую проверку осмысленной, а тело — приближать завершение.
Цикл с постусловием
Здесь тело выполняется хотя бы один раз, а продолжение решается после шага. Конструкция естественна для чтения первой команды пользователя или итерационного уточнения, которое обязано сделать начальное приближение. Подмена предусловия постусловием меняет поведение на пустом входе.
Выбор конструкции
Сначала сформулируйте состояние до фрагмента и желаемое состояние после него. Если число шагов заранее известно, подходит счётный цикл; если определяется данными — условный. Нарисуйте трассу для нуля, одного и двух повторений: эти случаи обнаруживают большинство ошибок границы и забытых ветвей.
Управляющая конструкция следует из состояния
Последовательность описывает обязательные шаги, ветвление — взаимоисключающие режимы, цикл — повторение с меняющимся состоянием. Сложное условие полезно превращать в именованный предикат: тогда видно, какую бизнес- или математическую границу оно выражает. В цепочке if/elif порядок важен, если диапазоны пересекаются.
def classify_temperature(value: float) -> str:
if value < -273.15:
raise ValueError("below absolute zero")
if value < 0:
return "solid-water range"
if value < 100:
return "liquid-water range"
return "steam range at normal pressure"
for sample in (-10, 0, 99.9, 100):
print(sample, classify_temperature(sample))Пример специально фиксирует допущение о нормальном давлении: программа не превращает упрощённую модель в универсальный физический закон. Границы 0 и 100 попадают ровно в одну ветвь, что проверяется тестами рядом с порогами.
Практика: автомат выдачи билета
Опишите алгоритм, который принимает возраст, наличие документа и категорию льготы, затем выдаёт отказ, полный или льготный тариф. До кода составьте таблицу решений и добейтесь, чтобы строки не пересекались. Реализуйте функцию и проверьте значения непосредственно по обе стороны каждого порога. После этого перепишите решение через вложенные условия и сравните: где стало легче доказать полноту, а где появилась возможность пропустить состояние?
Источники
- МФТИ: Программа вступительного испытания по информатике и информационно-коммуникационным технологиям.
- МФТИ: Пример вступительного испытания по информатике.
- Семакин И.Г., Хеннер Е.К., Шеина Т.Ю. Информатика. 11 класс. Базовый уровень.