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

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Подводим итоги)
 
(не показано 5 промежуточных версий этого же участника)
Строка 23: Строка 23:
 
  }
 
  }
  
The interesting lines are indicated with the comments. First we define a variable by typing the keyword int
+
Наиболее важные строки программы снабжены комментариями. Сначала мы объявляем переменную указывая ключевое слово "int" и следом имя переменной, которое мы выбрали. (Обычно принято использовать нижний регистр для имён переменных и верхний регистр для констант, но это не принципиально для компилятора.) Имя переменной должно начинаться с буквы, но может содержать в себе цифры и символ подчеркивания. Другие символы в именах переменных запрещены. (То же самое касается названий констант, задач и т.д.) Ключевое слово "int" означает "integer", то есть целое число. Только целые числа могут храниться в такой переменной.
followed by a name we choose. (Normally we use lower-case letters for variable names and uppercase letters for
+
 
constants, but this is not necessary.) The name must start with a letter but can contain digits and the underscore
+
Во второй строке мы присваиваем значение 200 нашей только что объявленной переменной. С этого момента при использовании переменной её значение будет 200. Теперь последуем внутрь цикла, в котором мы используем переменную для определения того, сколько времени двигаться вперед, и в конце цикла увеличим значение переменной на 200. Таким образом первый раз робот будет ехать прямо 200/1000=0.2 секунды, второй раз 0.4 секунды, третий раз 0.6 секунды и так далее.
sign. No other symbols are allowed. (The same applied to constants, task names, etc.) The word int stands for
+
 
integer. Only integer numbers can be stored in it. In the second line we assign the value 200 to the variable.
+
Кроме добавления числа к переменной мы можем умножать её на число используя *=, вычитать из неё число используя -= и делить на число используя /=. (Обратите внимание, что для деления результат будет округлён до ближайшего целого.) Вы можете также добавлять одни переменные к другим и вообще записывать более сложные выражения. Следующий пример программы не будет никаким образом проявлять себя через исполнительные устройства робота, так как мы до сих пор не научились использовать дисплей NXT!
From this moment on, whenever you use the variable, its value will be 200. Now follows the repeat loop in
 
which we use the variable to indicate the time to sleep and, at the end of the loop we increase the value of the
 
variable by 200. So the first time the robot sleeps 200 ms, the second time 400 ms, the third time 600 ms, and so
 
on.
 
Besides adding values to a variable we can also multiply a variable with a number using *=, subtract using -=
 
and divide using /=. (Note that for division the result is rounded to the nearest integer.) You can also add one
 
variable to the other, and write down more complicated expressions. The next example does not have any effect
 
on your robot hardware, since we don't know how to use the NXT display yet!
 
  
 
  int aaa;
 
  int aaa;
Строка 55: Строка 47:
 
  }
 
  }
  
Note on the first two lines that we can define multiple variables in one line. We could also have combined all
+
Заметим, что во второй строке мы объявили сразу несколько переменных за один раз. Мы можем таким образом объявить все переменные из первой и второй строки в одну строку. Переменная названная "values" является массивом, то есть, эта переменная может содержать больше чем просто число: элементы массива, к которым можно обращаться указывая число в квадратных скобках за переменной-массивом.
three of them in one line. The variable named values is an array, that is, a variable that contains more than a
+
В языке NXC массивы целых чисел объявляются так:
number: an array can be indexed with a number inside square brackets. In NXC integer arrays are declared so:
+
 
int name[];
+
int name[];
Then, this line allocates 10 elements initializing them to 0.
+
 
ArrayInit(values, 0, 10);
+
Еще один интересный для нас оператор в приведённой программе - инициализация массива, который определяет, что в массиве values будет 10 элементов и инициализирует их все значением 0:
 +
 
 +
ArrayInit(values, 0, 10);
 +
 
 
==Случайные числа==
 
==Случайные числа==
In all the above programs we defined exactly what the robot was supposed to do. But things get a lot more
+
Во всех приведенных ранее программах мы строго определяли что должен делать. Но может быть интересно создать ситуацию, в которой мы не будем знать что именно будет делать робот. Пусть мы хотим внести некую непредсказуемость в его движения.
interesting when the robot is going to do things that we don't know. We want some randomness in the motions.
+
Для таких ситуаций в языке NXC существует возможность получения случайных чисел. Следующая программа показывает как сделать, чтобы робот перемещался случайным образом. Она без конца движется вперед случайное количество времени и потом поворачивается на случайный угол.
In NXC you can create random numbers. The following program uses this to let the robot drive around in a
+
 
random way. It constantly drives forwards for a random amount of time and then makes a random turn.
+
int move_time, turn_time;
int move_time, turn_time;
+
task main()
task main()
+
{
{
+
  while(true)
while(true)
+
  {
{
+
    move_time = Random(600);
move_time = Random(600);
+
    turn_time = Random(400);
turn_time = Random(400);
+
    OnFwd(OUT_AC, 75);
OnFwd(OUT_AC, 75);
+
    Wait(move_time);
Wait(move_time);
+
    OnRev(OUT_A, 75);
OnRev(OUT_A, 75);
+
    Wait(turn_time);
Wait(turn_time);
+
  }
}
+
}
}
+
 
The program defines two variables, and then assigns random numbers to them. Random(600) means a random
+
Программа объявляет две переменные, а затем присваивает им случайные значения. Random(600) означает случайное число между 0 и 600 (при этом верхняя граница диапазона не включена во множество возможных ответов, т.е. вернётся число из диапазона 0..599). При каждом вызове функции Random получаемые числа будут отличаться.
number between 0 and 600 (the maximum value is not included in the range of numbers returned). Each time
+
 
you call Random the numbers will be different.
+
Обратите внимание, что мы могли избежать использования переменных и напрямую использовать полученное случайное число, написав оператор Wait(Random(600)).
Note that we could avoid the use of the variables by writing directly e.g. Wait(Random(600)).
+
 
You also see a new type of loop here. Rather that using the repeat statement we wrote while(true). The while
+
Вы так же можете увидеть в этой программе новый тип цикла. Вместо использования цикла repeat мы использовали цикл while(true). Оператор цикла while повторяет включенные в него операторы до тех пор, пока условие заключенное в круглые скобки остаётся истинным. Специальное ключевое слово "true" всегда истинно, так что операторы этого цикла будут повторяться бесконечно (ну или по крайней мере до того момента, когда вы нажмёте тёмно-серую кнопку на вашем NXT). Больше информации об операторе while вы узнаете в главе 4.
statement repeats the statements below it as long as the condition between the parentheses is true. The special
+
 
word true is always true, so the statements between the brackets are repeated forever (or at least until you press
 
the dark grey button on NXT). You will learn more about the while statement in Chapter IV.
 
 
==Подводим итоги==
 
==Подводим итоги==
In this chapter you learned about the use of variables and arrays. You can declare other data types than int:
+
В этой главе вы научились использованию переменных и массивов. Вы можете объявлять переменные других типов данных, отличных от "int": это могут быть "short", "long", "byte", "bool" и "string".
short, long, byte, bool and string.
+
 
You also learned how to create random numbers, such that you can give the robot unpredictable behavior.
+
Вы так же научились получать случайные числа, а значит вы можете добавить непредсказуемости в поведение робота.
Finally we saw the use of the while statement to make an infinite loop that goes on forever.
+
В конце главы мы увидели как может быть использован оператор цикла while для создания бесконечного цикла.

Текущая версия на 20:45, 16 мая 2009

Автор: 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 для создания бесконечного цикла.