Программирование LEGO NXT роботов на языке NXC - Управляющие структуры

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

Автор: Daniele Benedettelli

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

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

Управляющие структуры

В предыдущих главах мы видели операторы "repeat" и "while". Эти операторы управляют тем, каким образом выполняются или не выполняются другие операторы программы. Такие операторы называются “управляющие структуры”. В этой главе мы познакомимся с другими управляющими структурами.

Оператор "if"

Иногда возникает необходимость выполнять часть программы только в какой-то ситуации. В этом случае используется оператор "if". Давайте я вам покажу как это делается на примере. Для этого мы добавим новый трюк в программу, с которой мы работали в предыдущей главе. Мы хотим, чтобы робот проезжал прямо, а потом поворачивал случайным образом либо вправо, либо влево. Чтоб добиться такого поведения от робота мы опять будем использовать случайные числа. Мы берём случайное число, которое либо положительное, либо отрицательное. Если это число меньше 0 мы делаем поворот направо, иначе поворот налево. Вот получившаяся программа:

#define MOVE_TIME 500
#define TURN_TIME 360
task main()
{
  while(true)
  {
    OnFwd(OUT_AC, 75);
    Wait(MOVE_TIME);
    if (Random() >= 0)
    {
      OnRev(OUT_C, 75);
    }
    else
    {
      OnRev(OUT_A, 75);
    }
    Wait(TURN_TIME);
  }
}

Оператор "if" выглядит похожим на оператор "while". Если условие внутри круглых скобок истинно, тогда выполняется часть программы заключенная в фигурные скобки. В противном случае, выполняется часть программы заключенная в фигурные скобки после ключевого слова "else". Давайте подробнее взглянем на условие которое мы использовали. Оно выглядит как "Random() >= 0". Это означает что значение Random() должно быть больше или равно 0, чтобы условие считалось истинным. Вы можете сравнивать значения различными способами, вот наиболее важные из них:

  • "==" равно;
  • "<" меньше;
  • "<=" меньше или равно;
  • ">" больше;
  • ">=" больше или равно;
  • "!=" не равно.

Вы можете комбинировать условия используя ключевое связку "&&", которая означает логическое "и", или связку "||", которая означает логическое “или”. Вот некоторые примеры условий:

"true" всегда истинно
"false" никогда не истинно
"ttt != 3" истинно, когда "ttt" не равно 3
"(ttt >= 5) && (ttt <= 10)" истинно, когда "ttt" лежит между 5 и 10 включительно
"(aaa == 10) || (bbb == 10)" истинно, если "aaa" или "bbb" (или и то и другое) равно 10

Обратите внимание, что оператор "if" может имеет два блока кода внутри себя. Часть начинающаяся сразу после условия, которая будет выполнена если условие истинно, и часть после ключевого слова "else", которая будет выполнена в противном случае. Ключевое слово "else" и блок кода после него являются необязательными. Так что вы можете пропустить их, если не нужно ничего делать когда условие ложно.

Оператор "do"

Еще одна управляющая структура - это оператор "do". Его используют следующим образом:

do
{
  statements;
}
while (condition);

Операторы внутри фигурных скобок после "do" выполняются до тех пор, пока условие в круглых скобках истинно. Условие может быть задано тем же способом, что и в операторе "if" рассмотренном выше. Вот пример программы с использованием этого оператора. Под её управлением робот перемещается случайным образом в течение 20 секунд, после чего останавливается.

int move_time, turn_time, total_time;
task main()
{
  total_time = 0;
  do
  {
    move_time = Random(1000);
    turn_time = Random(1000);
    OnFwd(OUT_AC, 75);
    Wait(move_time);
    OnRev(OUT_C, 75);
    Wait(turn_time);
    total_time += move_time;
    total_time += turn_time;
  }
  while (total_time < 20000);
  Off(OUT_AC);
}

Заметим, что оператор "do" практически один в один повторяет оператор "while". Но в операторе "while" условие проверяется перед выполнением блока операторов внутри него, а в операторе "do" это делается после. Таким образом в операторе "while" команды могут вообще не выполниться ни разу, а в операторе "do" они выполнятся 1 раз в любом случае.

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

В этой главе вы познакомились с двумя новыми управляющими структурами - оперторами "if" и "do". Вместе с рассмотренными ранее операторами "repeat" и "while" они управляют тем какие фрагменты программы будут выполняться и в каком порядке. Очень важно, чтобы вы полностью понимали как они это делают. Поэтому будет полезным перед переходом к следующей главе поэкспериментировать с новыми операторами, пока вы не будете уверены, что освоили их использование.