Вспомогательные алгоритмы: процедуры и функции

Большую задачу проще решать по частям. Учимся выделять вспомогательные алгоритмы — процедуры и функции.

Вспомогательный алгоритм — это отдельный именованный алгоритм, который вызывается из другого. Он позволяет дать имя куску логики и переиспользовать его.

Зачем разбивать на части

Если Роботу нужно «закрасить строку, потом спуститься, потом снова закрасить строку», логично выделить действие «закрасить строку» в отдельный алгоритм и вызывать его дважды. Программа становится короче и понятнее, а ошибку проще найти. Это называется декомпозицией.

Алгоритм-процедура

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

использовать Робот
алг
нач
  закрасить_строку
  | спуститься можно отдельно
кон

алг закрасить_строку
нач
  нц пока справа свободно
    закрасить
    вправо
  кц
  закрасить
кон

Главный алгоритм вызывает закрасить_строку как обычную команду — просто пишет её имя.

Аргументы: арг

Часто вспомогательному алгоритму нужны данные. Их передают через аргументы, описанные словом арг в скобках после имени:

алг линия(арг цел длина)
нач
  цел 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), возвращающую большее из двух чисел через знач.

Частые ошибки

  • В функции забыть присвоить знач — она вернёт мусор или ошибку.
  • Перепутать арг и рез: тогда результат «не вернётся» в вызывающий алгоритм.
  • Объявить вспомогательный алгоритм внутри нач … кон главного — он должен идти отдельно, после кон.
  • Вызвать функцию как процедуру (отдельной строкой), забыв использовать её значение.

Итог

  • Процедура выполняет команды; функция возвращает значение через знач.
  • Параметры: арг (вход), рез (выход), аргрез (оба).
  • Декомпозиция делает программу короче и понятнее — это ключ к сложным задачам.
  • Вспомогательные алгоритмы пишутся отдельно, после главного.
Проверьте себя
1. В какую переменную алгоритм-функция КуМира помещает возвращаемое значение?
Aрез
Bзнач
Cрезультат
Dreturn
2. Каким словом описывается входной параметр вспомогательного алгоритма?
Aарг
Bрез
Cвход
Dпар
3. Зачем выделять вспомогательные алгоритмы?
AЧтобы программа работала быстрее в браузере
BЧтобы разбить задачу на части, переиспользовать логику и упростить отладку
CЭто обязательное требование синтаксиса
DЧтобы скрыть код от проверяющего
Поддержать проект