"Информатика", Семакин И.Г., Залогова Л.А., Русаков С.В., Шестакова Л.В.
Вспомогательный алгоритм выделяет часть решения, которую удобно выполнять отдельно или повторять. В программе такой алгоритм оформляют как именованную подпрограмму: сначала описывают её команды, затем вызывают по имени в нужном месте. Процедура выполняет действия, а параметры позволяют применять её к разным данным. Благодаря этому программа становится понятнее: повторяющиеся команды не приходится копировать, а отдельные части решения проще проверять и исправлять.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Вспомогательный алгоритм — отдельный алгоритм для повторяющейся или логически самостоятельной части задачи. Его выделяют, чтобы не дублировать одинаковые команды и не перегружать описание основного решения. Так легче увидеть, за что отвечает каждый фрагмент.
Подпрограмма — именованная часть программы, которую можно вызвать из других её частей. Она служит способом записать вспомогательный алгоритм в программе: вместо повторения команд используют одно имя. Подпрограмму можно применять в нескольких местах.
Процедура — подпрограмма, которая выполняет действия и вызывается по имени. В описании процедуры задают её имя и команды; при необходимости указывают параметры. Вызов процедуры записывают в нужном месте программы, чтобы запустить эти команды.
Параметр — обозначение данных, которые подпрограмма получает при вызове. В описании указывают формальные параметры, а при вызове передают фактические аргументы — конкретные значения или величины. Такое разделение позволяет одним алгоритмом обрабатывать разные данные.
Большую задачу удобнее разделить на основную часть и вспомогательные алгоритмы. Основная часть задаёт общий порядок действий, а каждый вспомогательный алгоритм решает свою подзадачу. Такое разбиение помогает понять ход решения, потому что вместо длинного списка мелких команд видны отдельные этапы. Кроме того, самостоятельную часть проще проверить, не теряя из виду всю задачу.
Подпрограмму сначала описывают, а затем вызывают по имени в том месте, где нужны её действия. Это разделение нужно потому, что описание задаёт правила работы подпрограммы, но само по себе не запускает её. Вызов, наоборот, передаёт выполнение подпрограмме, после чего программа продолжает работу с места вызова. Одно описание можно использовать многократно, поэтому одинаковые команды не приходится переписывать.
Представим процедуру, которая выводит заголовок отчёта. Её команды достаточно записать один раз, а затем вызвать перед выводом каждого раздела. Если вид заголовка нужно изменить, правят описание процедуры, а не ищут все его копии. Так сокращается риск, что в разных местах программы окажутся разные варианты одного действия.
Параметры делают подпрограмму пригодной для разных исходных данных. Например, процедура вычисления площади квадрата может получить длину стороны a и вычислить S = a². Для квадрата со стороной 3 при вызове передают 3, а для квадрата со стороной 5 — 5. Алгоритм остаётся тем же, меняются только данные, с которыми он работает.
При вызове фактические аргументы сопоставляются формальным параметрам из описания. Поэтому количество аргументов и их порядок должны соответствовать параметрам: иначе подпрограмма может получить не те данные или вызов окажется некорректным. Проверять соответствие нужно по описанию, а не по догадке о том, какое значение «подходит».
Подпрограммы помогают находить ошибки, потому что отдельную часть решения можно проверять независимо. Если неверно вычислена площадь, проверяют соответствующую процедуру и передаваемые ей данные, не переписывая основную программу. Исправленную подпрограмму затем снова используют во всех местах вызова. При этом важно проверить и связь частей: правильная процедура не даст правильного результата, если ей передали неверные аргументы.
| Признак | Основной алгоритм | Вспомогательная подпрограмма |
|---|---|---|
| Назначение | Организует решение задачи целиком | Выполняет отдельную подзадачу |
| Как начинается выполнение | Запускается как основная часть программы | Начинает выполняться при вызове |
| Как связывается с другими частями решения | Может вызывать подпрограммы | Связана с основной частью через вызов |
| Использование входных данных | Получает данные задачи и организует их обработку | Использует переданные аргументы, если предусмотрены параметры |
| Повторное использование | Обычно задаёт ход одной задачи | Её можно вызывать в разных местах |
Сравнивайте части по их роли, а не по длине: основной алгоритм управляет решением, подпрограмма выполняет порученную работу. Если действие повторяется, проверьте, можно ли оформить его отдельно и вызывать с нужными данными.
Условие. В нескольких местах программы нужно вывести одну и ту же строку-заголовок. Вместо копирования одинаковых команд выделим их в процедуру. Это удобно, если текст заголовка придётся менять: достаточно будет исправить одно описание.
Ответ. Одинаковый фрагмент записан в одной процедуре, а программа вызывает её в нужных местах. Копирования команд нет, поэтому при изменении строки достаточно поправить описание процедуры.
Условие. Нужно вычислить площади нескольких квадратов с разными длинами сторон. Одинаково для каждого квадрата выполняется формула S = a², значит, отдельный алгоритм вычисления можно использовать многократно. Длина стороны будет меняться, поэтому её следует передавать как параметр.
Ответ. Подпрограмма вычисляет площади 9 и 25, получая при вызовах стороны 3 и 5. Её алгоритм не приходится переписывать для каждого квадрата.
Условие. Для каждого из нескольких наборов данных нужно выполнить одинаковое вычисление и вывести результат. Конкретная формула зависит от задачи, поэтому обозначим набор входных значений x и вычисляемый результат y. Повторяющееся вычисление оформим отдельно, а ввод, перебор наборов и вывод оставим в основном алгоритме.
Ответ. Основной алгоритм управляет обработкой наборов и выводом, а подпрограмма выполняет повторяющееся вычисление. Для каждого вызова передаются данные именно того набора, который обрабатывается в этот момент.
Копировать команды вместо создания подпрограммы. Так поступают, когда повторяющийся фрагмент кажется коротким. При изменении алгоритма придётся исправлять все копии, и одну легко пропустить. Проверьте, встречаются ли одинаковые действия несколько раз; если да, рассмотрите общий вызов процедуры.
Вызвать подпрограмму до её описания или забыть вызов. Иногда описание принимают за команду запуска, хотя оно лишь задаёт команды подпрограммы. Если вызвать её не удалось или действия не выполнились, проверьте порядок описания и наличие вызова в основном алгоритме. Сверьте также имя подпрограммы в описании и вызове.
Перепутать формальный параметр с фактическим аргументом. Ошибка возникает, когда обозначение из описания принимают за конкретные данные. Чтобы проверить себя, найдите параметры в описании, а значения при конкретном вызове отметьте отдельно. Параметр задаёт, какие данные ожидаются, аргумент сообщает, что именно передано сейчас.
Передать неверное количество или порядок аргументов. При пропуске аргумента или перестановке значений подпрограмма может получить неподходящие данные. Обычно это происходит, когда вызов составляют, не сверяясь с описанием. Проверьте пары «параметр — аргумент» по порядку и убедитесь, что каждому параметру соответствует ровно один нужный аргумент.
Для работы с подпрограммами нужно уметь составлять алгоритмы и программы, использовать величины и понимать последовательность выполнения команд. Без этого трудно определить, какую часть задачи выделить и какие данные передавать. При разбиении важно знать, откуда берутся входные величины и куда направляется результат.
Подпрограммы особенно полезны в больших задачах и программах с повторяющимися действиями. Разделение на самостоятельные части помогает распределить работу между участниками и проверять отдельные фрагменты. Позже тот же приём пригодится при разработке и сопровождении более сложных программ.
Зачем выделять команды в подпрограмму, если их можно написать прямо в программе?
Если команды повторяются, подпрограмма избавляет от копирования и упрощает изменения: достаточно поправить её описание. Ещё её используют, чтобы отделить самостоятельную часть большой задачи и сделать основную программу понятнее.
Чем описание подпрограммы отличается от её вызова?
Описание задаёт имя подпрограммы, её параметры и команды. Вызов по имени запускает эти команды; одно только описание не означает, что подпрограмма выполнится.
Можно ли вызвать одну подпрограмму несколько раз?
Да, её можно вызывать в разных местах программы или несколько раз подряд. При каждом вызове она выполняет свои команды, а с параметрами может получать новые данные.
Зачем подпрограмме нужны параметры?
Параметры позволяют одной и той же подпрограмме работать с разными исходными данными. Например, вычисление площади квадрата можно описать один раз и передавать разные длины сторон.
Чем формальный параметр отличается от фактического аргумента?
Формальный параметр указан в описании подпрограммы и обозначает ожидаемые данные. Фактический аргумент — конкретное значение или величина, передаваемые при вызове.
§ 5. Вспомогательные алгоритмы и подпрограммы