Программирование LEGO NXT роботов на языке NXC - Использование переменных

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск

Автор: Daniele Benedettelli

Перевод: © Ботов Антон aka =DeaD=, 2009

Эксклюзивно для www.roboforum.ru
копирование на другие ресурсы и публикация перевода
без разрешения его автора запрещены

Использование переменных

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

Движение по спирали

Предположим, что мы хотим адаптировать приведенную выше программу таким образом, чтобы робот двигался по спирали. Это можно сделать путём увеличения времени которое робот движется прямо после каждого такого движения. То есть мы хотим после каждого такого движения увеличивать значение константы MOVE_TIME. Но как же мы сделаем это? Ведь MOVE_TIME это константа и поэтому не может быть изменена при выполнении программы. Поэтому нам потребуется заменить в нашей программе константу MOVE_TIME на переменную move_time. Как видно из программы, представленной ниже и реализующей движение по спирали, в языке NXC работа с переменными организована очень просто.

#define TURN_TIME 360
int move_time; // define a variable
task main()
{
  move_time = 200; // set the initial value
  repeat(50)
  {
    OnFwd(OUT_AC, 75);
    Wait(move_time); // use the variable for sleeping
    OnRev(OUT_C, 75);
    Wait(TURN_TIME);
    move_time += 200; // increase the variable
  }
  Off(OUT_AC);
}

Наиболее важные строки программы снабжены комментариями. Сначала мы объявляем переменную указывая ключевое слово "int" и следом имя переменной, которое мы выбрали. (Обычно принято использовать нижний регистр для имён переменных и верхний регистр для констант, но это не принципиально для компилятора.) Имя переменной должно начинаться с буквы, но может содержать в себе цифры и символ подчеркивания. Другие символы в именах переменных запрещены. (То же самое касается названий констант, задач и т.д.) Ключевое слово "int" означает "integer", то есть целое число. Только целые числа могут храниться в такой переменной.

Во второй строке мы присваиваем значение 200 нашей только что объявленной переменной. С этого момента при использовании переменной её значение будет 200. Теперь последуем внутрь цикла, в котором мы используем переменную для определения того, сколько времени двигаться вперед, и в конце цикла увеличим значение переменной на 200. Таким образом первый раз робот будет ехать прямо 200/1000=0.2 секунды, второй раз 0.4 секунды, третий раз 0.6 секунды и так далее.

Кроме добавления числа к переменной мы можем умножать её на число используя *=, вычитать из неё число используя -= и делить на число используя /=. (Обратите внимание, что для деления результат будет округлён до ближайшего целого.) Вы можете также добавлять одни переменные к другим и вообще записывать более сложные выражения. Следующий пример программы не будет никаким образом проявлять себя через исполнительные устройства робота, так как мы до сих пор не научились использовать дисплей NXT!

int aaa;
int bbb,ccc;
int values[];
task main()
{
  aaa = 10;
  bbb = 20 * 5;
  ccc = bbb;
  ccc /= aaa;
  ccc -= 5;
  aaa = 10 * (ccc + 3); // aaa is now equal to 80
  ArrayInit(values, 0, 10); // allocate 10 elements = 0
  values[0] = aaa;
  values[1] = bbb;
  values[2] = aaa*bbb;
  values[3] = ccc;
}

Заметим, что во второй строке мы объявили сразу несколько переменных за один раз. Мы можем таким образом объявить все переменные из первой и второй строки в одну строку. Переменная названная "values" является массивом, то есть, эта переменная может содержать больше чем просто число: элементы массива, к которым можно обращаться указывая число в квадратных скобках за переменной-массивом. В языке NXC массивы целых чисел объявляются так:

int name[];

Еще один интересный для нас оператор в приведённой программе - инициализация массива, который определяет, что в массиве values будет 10 элементов и инициализирует их все значением 0:

ArrayInit(values, 0, 10);

Случайные числа

Во всех приведенных ранее программах мы строго определяли что должен делать. Но может быть интересно создать ситуацию, в которой мы не будем знать что именно будет делать робот. Пусть мы хотим внести некую непредсказуемость в его движения. Для таких ситуаций в языке NXC существует возможность получения случайных чисел. Следующая программа показывает как сделать, чтобы робот перемещался случайным образом. Она без конца движется вперед случайное количество времени и потом поворачивается на случайный угол.

int move_time, turn_time;
task main()
{
  while(true)
  {
    move_time = Random(600);
    turn_time = Random(400);
    OnFwd(OUT_AC, 75);
    Wait(move_time);
    OnRev(OUT_A, 75);
    Wait(turn_time);
  }
}

Программа объявляет две переменные, а затем присваивает им случайные значения. Random(600) означает случайное число между 0 и 600 (при этом верхняя граница диапазона не включена во множество возможных ответов, т.е. вернётся число из диапазона 0..599). При каждом вызове функции Random получаемые числа будут отличаться.

Обратите внимание, что мы могли избежать использования переменных и напрямую использовать полученное случайное число, написав оператор Wait(Random(600)).

Вы так же можете увидеть в этой программе новый тип цикла. Вместо использования цикла repeat мы использовали цикл while(true). Оператор цикла while повторяет включенные в него операторы до тех пор, пока условие заключенное в круглые скобки остаётся истинным. Специальное ключевое слово "true" всегда истинно, так что операторы этого цикла будут повторяться бесконечно (ну или по крайней мере до того момента, когда вы нажмёте тёмно-серую кнопку на вашем NXT). Больше информации об операторе while вы узнаете в главе 4.

Подводим итоги

В этой главе вы научились использованию переменных и массивов. Вы можете объявлять переменные других типов данных, отличных от "int": это могут быть "short", "long", "byte", "bool" и "string".

Вы так же научились получать случайные числа, а значит вы можете добавить непредсказуемости в поведение робота. В конце главы мы увидели как может быть использован оператор цикла while для создания бесконечного цикла.