Процедуры с параметрами в NXT-G

В подпрограммы, реализуемые на NXT-G, можно передавать параметры, что значительно увеличивает гибкость кода. Параметры могут быть как входными, так и выходными. Входные параметры подпрограмма получает, чтобы использовать их в своей работе. Выходные параметры являются результатом выполнения подпрограммы; они могут быть использованы при дальнейшей работе.

Пример 6.2. Написать процедуру движения робота по квадрату. Входной параметр - длина стороны квадрата - задаётся случайным числом в диапазоне от 1 до 5 оборотов мотора.
Вначале самостоятельно напишите простую программу движения робота по квадрату со стороной в 1 оборот мотора (без использования процедуры).
Добавьте в программу новый блок Random (случайное) из меню Data (данные) полной палитры.
Блок генерации случайного числа из меню Data

Разместите этот блок до основного цикла программы:

Создание процедуры с входным параметром: шаг 1

В настройках блока Random задайте диапазон генерируемого случайного числа от 1 до 5.

Настройки блока Random

Для того, чтобы заставить робота проезжать столько оборотов, сколько выпадет в блоке Random, нужно передать это число на разъёмDuration (длительность) блока Move (при наведении указателя мыши на разъём появляется всплывающая подсказка).

Обратите внимание на следующее:

  • При передаче данных на разъём Duration в настройках блока Move можно указывать только DegreesRotations или Seconds, но не Unlimited. При этом варианты Degrees и Rotations обрабатываются одинаково - как Degrees. Поэтому выберитеDegrees.
  • Число оборотов, которое должен произвести мотор, следует перевести в градусы из расчёта: один оборот мотора 360°.
  • Поместите в цикл блок Math (Математика) из меню Data, и настройте его на умножение (Multiplication) на 360°.
Настройки блока Math

В блоке Math доступны шесть операций:

  • Addition - сложение;
  • Substraction - вычитание;
  • Multiplication - умножение;
  • Division - деление;
  • Absolute Value - абсолютная величина;
  • Square Root - квадратный корень.

Соедините шиной данных выходной разъём блока Random и входной разъём A блока Math.

Затем соедините шиной выходной разъём Result блока Math (числовые выходные разъёмы помечаются символом "#") и входной разъём Duration блока Move, который "соответствует" длине стороны квадрата.

Создание процедуры с входным параметром: шаг 2

Проверьте работу программы.

Оформим часть программы в виде процедуры (подпрограммы) с параметром. Для этого следует выделить всё, что по смыслу должно попадать в процедуру, кроме параметра (в данном случае - кроме блока Random),

Создание процедуры с входным параметром: шаг 3

и нажать кнопку Create My Block (создать блок) на панели инструментов или воспользоваться меню Edit \ Make A New My Block.

В появившемся окне введите в соответствующие поля имя подпрограммы (например, sq_param) и описание подпрограммы по-русски, а затем создайте иконку блока. В конце нажмите на кнопку Finish.

Обратите внимание на то, что у нового блока появились входной и выходной разъёмы для передачи данных:
Входной и выходной разъёмы подпрограммы

Выполните двойной щелчок на блоке sq_param - в новой вкладке открылось содержимое процедуры. Измените название входного параметра на более подходящее - "Длина стороны квадрата":

Изменение названия входного параметра подпрограммы

Сохраните файл процедуры и закройте его.

Удалите блок sq_param из программы, а затем снова добавьте его из палитры My Blocks. Обратите внимание на изменение всплывающей подсказки при наведении указателя мыши на разъём блока sq_param:
Всплывающая подсказка входного параметра подпрограммы

Выведем на экран блока NXT текущую длину стороны квадрата, измеряемую в оборотах двигателя. После блока Random "вытяните" мышкой ещё одну направляющую для блоков (начать создание новой направляющей - щелчок левой кнопкой мыши; завершить - двойной щелчок мыши):

Создание новой направляющей для блоков

Вывод числовой информации на экран NXT был подробно рассмотрен в примере 4.3.

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

Задание 6.9. Написать процедуру движения робота по сторонам правильного N-угольника. В качестве параметров передаются (1) число сторон правильного N-угольника и (2) длина его стороны. Параметры должны генерироваться случайно и выводиться на экран блока NXT в разных строчках.

Рассмотрим процесс создания собственного блока с входным и выходным параметрами.
Пример 6.3. Разработать блок для перевода градусов в радианы.
Для решения этой задачи мы должны не только составить программу вычисления радиан, но и предусмотреть два момента: (1) в наш код данные должны откуда-то поступать и (2) результат должен куда-то выводиться. Это необходимо сделать с той целью, чтобы в программе явно присутствовали входная и выходная шины данных. Договоримся, что данные (градусы) будут поступать из генератора случайных чисел, а результат (радианы) будет выводиться на экран. Получим следующую программу, из которой для нас наиболее интересны математические блоки умножения и деления; их настройки показаны на Рис. 6.17:
Программа для перевода градусов в радианы

Построим из блоков умножения и деления собственный блок. Для этого выделим два названных блока и нажмём на панели инструментов кнопку Create My Block.

Введём имя блока и его описание. Обратите внимание на то, что в теле блока появился выходной параметр (Result).
Первый шаг создания блока для перевода градусов в радианы

Окончательно после изменения имён входных и выходных переменных блок примет вид:

Блок для перевода градусов в радианы