Россия, г. Воронеж |
Переменные и константы
Для хранения данных в программе используются переменные и константы. Переменная представляет собой область памяти, которой назначено некоторое имя. Определяющей характеристикой переменной является её тип: в переменную можно записывать данные только её собственного типа. Например, в NXT-G имеется три основных типа: числовой (Number), текстовый (Text) и логический (Logic). Соответственно каждая переменная будет иметь один из названных типов. Тип однозначно определяет (1) размер области памяти, отводимой для хранения переменной и (2) множество операций, которые можно выполнять с этой переменной.
Переменные можно использовать и для передачи данных из собственных блоков в главную программу и наоборот. Для этого и в программе, и в созданном блоке нужно определить переменные с одним именем и типом.
Константа, как и переменная, есть поименованная область памяти определённого типа. Однако значение переменных можно менять в процессе выполнения программы, в то время как константы определяются перед запуском программы и при её выполнении изменяться не могут. В языке NXT-G это различие визуально проявляется в том, что у переменных есть как входные, так и выходные разъёмы, в то время как у констант - только выходные.
Благодаря наличию сквозных разъёмов у большинства стандартных блоков во многих случаях можно составить код без переменных (как мы это и делали до сих пор). Но существуют задачи, при решении которых нельзя обойтись без использования переменных. Рассмотрим один из примеров. Вначале подробно опишем работу с переменными.
Пример 7.1. На белом поле нарисовано несколько параллельных чёрных полос. Написать программу для подсчёта количества этих полос.
Будем решать задачу по шагам. Вначале создадим программу, по которой робот будет двигаться до чёрной линии (см. задание 3.3). Теперь, прежде, чем двинуться дальше, нужно сохранить информацию о найденной линии, "посчитать" её. Для хранения этих данных воспользуемся переменной "Линии". Для её создания используем блок Variable (Переменная) в пункте меню Data полной палитры:
Посмотрите на настройки блока (Рис. 7.2). По умолчанию среда создаёт три переменные: логического, числового и текстового типа. Имена переменных задаются в соответствии с их типом, что неудобно: имена должны объяснять назначение и смысл данных, хранящихся в переменной.
По этому поводу существует известный анекдот о том, как у программиста было трое детей, которых звали А1, А2 и А3.
Поэтому принято вначале определять собственные переменные, задавать им понятные имена и тип, а затем уже использовать. Создадим переменную "Линии" числового типа.
Для этого:
- зайдите в главном меню в пункт Edit и далее в Define variables (Определить переменную);
- в открывшемся окне редактора переменных Edit Variables (Рис. 7.3) нажмите кнопку Create (Создать);
- имя переменной можно задать произвольное (в том числе и по-русски), но принято именовать переменные в соответствии с тем, для каких целей они используются в задаче. В полях Name (Имя) и Data type (Тип данных) введите, соответственно, "Линии" и "Number";
- нажмите кнопку Close.
Снова щёлкните по блоку Variable в программе и посмотрите, как изменились настройки. Рассмотрим их подробнее.
Настройки переменной состоят из следующих полей:
- Поле List (Список) содержит список имеющихся переменных с описанием их имени Name и типа Type. Обратите внимание, что созданная нами переменная с именем "Линии" уже есть в списке и имеет числовой тип.
- Action (Действие). Оно может быть или Read (Считывать) или Write (Записывать). В первом случае из переменной можно только читать ранее записанные данные. Во втором и считывать и записывать в неё. В программе может быть несколько блоков для одной и той же переменной, причём в одном данные считываются, а в другом записываются. Если выбран режим Write, то данные можно и читать, и писать в переменную.
- Value (Значение). Можно задать начальное значение переменной. В зависимости от выбранного типа значения будут меняться. В нашем случае значение должно быть равно нулю; это означает, что пока ни одной линии не найдено.
Продолжим создание программы подсчёта количества чёрных полос.
Добавьте в программу блок Math, настроенный на прибавление единицы к переменной "Линии", при этом результат снова должен быть сохранён в той же переменной. Выведите это значение на экран, как мы уже делали в примере 4.3. Чтобы программа продолжала подсчёт, требуется заключить её в цикл. Получим следующий код:
Задание 7.1. Запустите программу на выполнение. Правильно ли ведётся подсчёт линий?
Если на поле были достаточно широкие полосы, то оказывается, что робот успевает посчитать одну линию несколько раз, пока проезжает над ней датчиком цвета. Надо каким-то образом приостановить подсчёт. Самый простой вариант, который первым приходит на ум - это использование задержки времени. Но насколько она должна быть длинной? Очевидно, что чем шире полоса, тем дольше требуется ждать. Этот способ не очень хорош.
Другой вариант основан на том, что мы знаем ждать надо до тех пор, пока чёрная полоса не закончится, то есть до более светлого участка. В итоге программа примет вид:
Задание 7.2. Когда остановится робот? Придумайте способ программной остановки робота и попробуйте реализовать его.
Задание 7.3. Напишите программу для робота, чтобы он останавливался на пятой полосе.
Задание 7.4. Напишите программу для робота, которая подсчитывает количество нажатий на кнопку (кнопку присоединить к свободному порту). Текущее число нажатий должно выводиться на экран. Придумайте способ останова программы по условию.
Для использования констант в NXT-G имеется блок Constant из меню Date.
Обратите внимание на изображение блока: это чемоданчик с замком, что означает невозможность изменения его содержимого.
Рассмотрим настройки блока:
- Action - Choose from list (Выбрать из списка) или Custom (Создать пользовательскую). По умолчанию выбран второй вариант. Это означает, что константу можно определить в самом блоке, заполнив остальные поля. Чтобы стал доступен вариант Choose from list, нужно заранее определить константу в редакторе констант (Editn \ Define Constants) так же, как мы это делали для переменной. Этот вариант делает возможным неоднократное использование одной и той же константы в разных частях программы.
- Data Type - как и для переменной можно выбрать логический, числовой или текстовый тип данных.
- Value - значение константы.
- Name - имя константы; после ввода имени оно автоматически отображается на блоке.
В целом работа с блоком Constant аналогична блоку Variables.