Урок 12. Подпрограммы — программы в программе

Тема: Язык программирования Logo

Подпрограммы очень часто используются в программировании. По-другому их называют процедурами или функциями. Пока мы не будем усложнять себе жизнь и ограничимся использованием слова «подпрограмма». Что же это такое?

Судя по названию, подпрограмма — это то, что входит в обычную программу (в программный код, который мы пишем). Что такое обычная программа? Это последовательность команд, в результате выполнения которой исполнителем (в нашем случае, черепахой) что-то происходит. Когда программа готова, нам достаточно нажать одну кнопку, чтобы ее запустить. А теперь представьте, что у нас в программе есть маленькие программки (подпрограммы), которые мы также запускаем нажатием всего лишь одной кнопки, после чего что-то происходит. Хотя на самом деле, никакой кнопки нет. Подпрограмма внутри программы запускается оттого, что ее вызывают по имени. Все это можно изобразить так:

Схема использования подпрограмм

Здесь пунктирными линиями обозначены строки программного кода. Подпрограмм и их вызовов может быть много. Вызывается подпрограмма по ее имени.

Давайте рассмотрим какой-нибудь практический пример, чтобы стало все более понятно. Пусть, например, код, заставляющий черепаху рисовать синюю толстую линию, будет оформлен в виде подпрограммы с названием с_линия. В языке программирования Лого ключевым словом, обозначающим начало подпрограммы, является выучи. Можно представить, что тем самым мы учим черепаху новым командам.

сброс
 
выучи с_линия {
	цвет_пера 0, 0, 220
	толщина_пера 5
	вперёд 75
}
 
иди 10, 200
с_линия
иди 100, 250
направление 45
с_линия

Итак, здесь главная программа - это команда сброс и все что идет после закрывающей фигурной скобки. От команды выучи и до закрывающей скобки включительно — это подпрограмма.

Какое преимущество дает использование подпрограмм? Ведь можно было вставить код, рисующий синюю линию, непосредственно в программу и не делать так, как показано выше. Однако тогда этот код пришлось бы вставлять два раза, и программа бы получилась длиннее. Использовать здесь цикл также не получится, т. к. между рисованием первой и второй линий есть еще команды. Вывод: использование подпрограмм позволяет сократить программный код.

Другое преимущество подпрограмм — это то, что они могут принимать различные данные и результат их работы может выглядеть по-разному. Принимаемые данные передаются в подпрограмму с помощью переменных, которые указываются после ее имени. Пример:

сброс
 
выучи надпись $x, $y, $текст {
	иди $x, $y
	напиши $текст
}
 
надпись 10, 20, "программирование"
надпись 100, 140, "другая надпись"

Здесь создается подпрограмма надпись, которая принимает два числа и одну строку через переменные $x, $y и $текст. Когда надпись вызывается в главной программе, то указываются конкретные значения (числа и строки), они и подставляются в подпрограмме вместо переменных, а затем используются внутри скобок. В результате мы можем изменять результат работы подпрограммы за счет того, какие данные в нее передаем. Конечно, это достаточно относительно. В примере выше черепаха только перемещается и пишет, но зато где угодно и что угодно.

Подпрограмма может принимать данные в любом количестве. Главное, чтобы количество переменных после ее имени и количество конкретных значений при вызове совпадало.

Рассмотрим еще один пример подпрограммы:

выучи цвета $r, $g, $b {
	цвет_холста $r, $g, $b
	если $r >= 128 {
		$r = $r - 128
	}
	иначе {
		$r = $r + 128
	}
	если $g >= 128 {
		$g = $g - 128
	}
	иначе {
		$g = $g + 128
	}
	если $b >= 128 {
		$b = $b - 128
	}
	иначе {
		$b = $b + 128
	}
	цвет_пера $r, $g, $b
}

В данном случае подпрограмма устанавливает цвет холста по переданным ей данным, меняет значения переменных $r, $g и $b, затем устанавливает цвет пера.

Задание

  1. Напишите программу, в которой бы использовался код, приведенный выше (про цвета). Пусть сначала подпрограмма вызывается со случайными значениями, а затем с тем, которые ввел пользователь. Также после каждого вызова подпрограммы черепаха должна что-нибудь рисовать на холсте.
  2. Напишите подпрограмму под названием фигура, принимающую два численных значения: количество сторон фигуры и размер стороны. Код тела подпрограммы должен содержать команды, которые заставляют черепаху рисовать правильный многоугольник по переданным данным. Несколько раз вызовите подпрограмму, передав ей разные значения.

Ответ (код на Лого)