Вспомогательные алгоритмы: процедуры и функции
Большую задачу проще решать по частям. Учимся выделять вспомогательные алгоритмы — процедуры и функции.
Вспомогательный алгоритм — это отдельный именованный алгоритм, который вызывается из другого. Он позволяет дать имя куску логики и переиспользовать его.
Зачем разбивать на части
Если Роботу нужно «закрасить строку, потом спуститься, потом снова закрасить строку», логично выделить действие «закрасить строку» в отдельный алгоритм и вызывать его дважды. Программа становится короче и понятнее, а ошибку проще найти. Это называется декомпозицией.
Алгоритм-процедура
Процедура — вспомогательный алгоритм без возвращаемого значения. Она просто выполняет команды. Объявляется как обычный алгоритм с именем, но без типа:
использовать Робот
алг
нач
закрасить_строку
| спуститься можно отдельно
кон
алг закрасить_строку
нач
нц пока справа свободно
закрасить
вправо
кц
закрасить
кон
Главный алгоритм вызывает закрасить_строку как обычную команду — просто пишет её имя.
Аргументы: арг
Часто вспомогательному алгоритму нужны данные. Их передают через аргументы, описанные словом арг в скобках после имени:
алг линия(арг цел длина)
нач
цел i
нц для i от 1 до длина
закрасить
если справа свободно
то вправо
всё
кц
кон
Теперь можно вызвать линия(5) — закрасить 5 клеток. Аргумент длина получает значение 5 на время работы алгоритма.
Результаты: рез
Если алгоритм должен вернуть данные, используют слово рез:
алг сумма(арг цел a, арг цел b, рез цел с)
нач
с := a + b
кон
Вызов: сумма(3, 4, итог) положит 7 в переменную итог. Есть и аргрез — параметр, который и приходит со значением, и возвращается изменённым.
Алгоритм-функция
Функция возвращает одно значение и используется прямо в выражениях. Её тип пишется в заголовке, а результат кладётся в специальную переменную знач:
алг цел квадрат(арг цел x)
нач
знач := x * x
кон
Теперь функцию можно подставлять в выражения: вывод квадрат(5) напечатает 25. Переменная знач — зарезервированная: то, что в ней окажется к концу алгоритма, и станет результатом функции.
Полный пример с функцией
алг
нач
цел n
n := 6
вывод "Факториал 6 = ", факт(n), нс
кон
алг цел факт(арг цел n)
нач
цел i, p
p := 1
нц для i от 1 до n
p := p * i
кц
знач := p
кон
Запускаемый Python-эквивалент функции факториала:
def fakt(n):
p = 1
for i in range(1, n + 1):
p = p * i
return p
for n in [1, 3, 6]:
print("факт", n, "=", fakt(n))
Вывод:
факт 1 = 1 факт 3 = 6 факт 6 = 720
Памятка по словам
| Слово | Роль |
арг | входной параметр (аргумент) |
рез | выходной параметр (результат) |
аргрез | и вход, и выход |
знач | возвращаемое значение функции |
Попробуй сам
Напишите процедуру столбик для Робота, которая закрашивает клетки вниз до нижней стены, и вызовите её из главного алгоритма. Затем напишите функцию макс(арг цел a, арг цел b), возвращающую большее из двух чисел через знач.
Частые ошибки
- В функции забыть присвоить
знач— она вернёт мусор или ошибку. - Перепутать
аргирез: тогда результат «не вернётся» в вызывающий алгоритм. - Объявить вспомогательный алгоритм внутри
нач … конглавного — он должен идти отдельно, послекон. - Вызвать функцию как процедуру (отдельной строкой), забыв использовать её значение.
Итог
- Процедура выполняет команды; функция возвращает значение через
знач. - Параметры:
арг(вход),рез(выход),аргрез(оба). - Декомпозиция делает программу короче и понятнее — это ключ к сложным задачам.
- Вспомогательные алгоритмы пишутся отдельно, после главного.