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

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Создана новая страница размером <p align=center><b>Автор: Daniele Benedettelli</b><br><br><i>Перевод: © Ботов Антон aka =DeaD=, 2009<br><br>Экс...)
 
(Summary)
 
(не показано 8 промежуточных версий 1 участника)
Строка 2: Строка 2:
  
 
=Управляющие структуры=
 
=Управляющие структуры=
In the previous chapters we saw the repeat and while statements. These statements control the way the other
+
В предыдущих главах мы видели операторы "repeat" и "while". Эти операторы управляют тем, каким образом выполняются или не выполняются другие операторы программы. Такие операторы называются “управляющие структуры”. В этой главе мы познакомимся с другими управляющими структурами.
statements in the program are executed. They are called “control structures”. In this chapter we will see some
+
 
other control structures.
 
 
==Оператор "if"==
 
==Оператор "if"==
Sometimes you want that a particular part of your program is only executed in certain situations. In this case the
+
Иногда возникает необходимость выполнять часть программы только в какой-то ситуации. В этом случае используется оператор "if". Давайте я вам покажу как это делается на примере. Для этого мы добавим новый трюк в программу, с которой мы работали в предыдущей главе. Мы хотим, чтобы робот проезжал прямо, а потом поворачивал случайным образом либо вправо, либо влево. Чтоб добиться такого поведения от робота мы опять будем использовать случайные числа. Мы берём случайное число, которое либо положительное, либо отрицательное. Если это число меньше 0 мы делаем поворот направо, иначе поворот налево. Вот получившаяся программа:
if statement is used. Let me give an example. We will again change the program we have been working with so
+
 
far, but with a new twist. We want the robot to drive along a straight line and then either make a left or a right
+
#define MOVE_TIME 500
turn. To do this we need random numbers again. We pick a random number that is either positive or negative. If
+
#define TURN_TIME 360
the number is less than 0 we make a right turn; otherwise we make a left turn. Here is the program:
+
task main()
#define MOVE_TIME 500
+
{
#define TURN_TIME 360
+
  while(true)
task main()
+
  {
{
+
    OnFwd(OUT_AC, 75);
while(true)
+
    Wait(MOVE_TIME);
{
+
    if (Random() >= 0)
OnFwd(OUT_AC, 75);
+
    {
Wait(MOVE_TIME);
+
      OnRev(OUT_C, 75);
if (Random() >= 0)
+
    }
{
+
    else
OnRev(OUT_C, 75);
+
    {
}
+
      OnRev(OUT_A, 75);
else
+
    }
{
+
    Wait(TURN_TIME);
OnRev(OUT_A, 75);
+
  }
}
+
}
Wait(TURN_TIME);
+
 
}
+
Оператор "if" выглядит похожим на оператор "while". Если условие внутри круглых скобок истинно, тогда выполняется часть программы заключенная в фигурные скобки. В противном случае, выполняется часть программы заключенная в фигурные скобки после ключевого слова "else". Давайте подробнее взглянем на условие которое мы использовали. Оно выглядит как "Random() >= 0". Это означает что значение Random() должно быть больше или равно 0, чтобы условие считалось истинным. Вы можете сравнивать значения различными способами, вот наиболее важные из них:
}
+
* "==" равно;
The if statement looks a bit like the while statement. If the condition between the parentheses is true the part
+
* "<" меньше;
between the brackets is executed. Otherwise, the part between the brackets after the word else is executed. Let
+
* "<=" меньше или равно;
us look a bit better at the condition we use. It reads Random() >= 0. This means that Random() must be
+
* ">" больше;
greater-than or equal to 0 to make the condition true. You can compare values in different ways. Here are the
+
* ">=" больше или равно;
most important ones:
+
* "!=" не равно.
== equal to
+
 
< smaller than
+
Вы можете комбинировать условия используя ключевое связку "&&", которая означает логическое "и", или связку "||", которая означает логическое “или”. Вот некоторые примеры условий:
<= smaller than or equal to
+
"true" всегда истинно
> larger than
+
"false" никогда не истинно
>= larger than or equal to
+
"ttt != 3" истинно, когда "ttt" не равно 3
!= not equal to
+
"(ttt >= 5) && (ttt <= 10)" истинно, когда "ttt" лежит между 5 и 10 включительно
You can combine conditions use &&, which means “and”, or ||, which means “or”. Here are some examples of
+
"(aaa == 10) || (bbb == 10)" истинно, если "aaa" или "bbb" (или и то и другое) равно 10
conditions:
+
 
true always true
+
Обратите внимание, что оператор "if" может имеет два блока кода внутри себя. Часть начинающаяся сразу после условия, которая будет выполнена если условие истинно, и часть после ключевого слова "else", которая будет выполнена в противном случае. Ключевое слово "else" и блок кода после него являются необязательными. Так что вы можете пропустить их, если не нужно ничего делать когда условие ложно.
false never true
+
 
ttt != 3 true when ttt is not equal to 3
 
(ttt >= 5) && (ttt <= 10) true when ttt lies between 5 and 10
 
(aaa == 10) || (bbb == 10)true if either aaa or bbb (or both) are equal to 10
 
- 17 -
 
Note that the if statement has two parts. The part immediately after the condition, which is executed when the
 
condition is true, and the part after the else, which is executed when the condition is false. The keyword else and
 
the part after it are optional. So you can omit them if there is nothing to do when the condition is false.
 
 
==Оператор "do"==
 
==Оператор "do"==
There is another control structure, the do statement. It has the following form:
+
Еще одна управляющая структура - это оператор "do". Его используют следующим образом:
do
+
do
{
+
{
statements;
+
  statements;
}
+
}
while (condition);
+
while (condition);
The statements between the brackets after the do part are executed as long as the condition is true. The condition
+
 
has the same form as in the if statement described above. Here is an example of a program. The robot runs
+
Операторы внутри фигурных скобок после "do" выполняются до тех пор, пока условие в круглых скобках истинно. Условие может быть задано тем же способом, что и в операторе "if" рассмотренном выше. Вот пример программы с использованием этого оператора. Под её управлением робот перемещается случайным образом в течение 20 секунд, после чего останавливается.
around randomly for 20 seconds and then stops.
+
int move_time, turn_time, total_time;
int move_time, turn_time, total_time;
+
task main()
task main()
+
{
{
+
  total_time = 0;
total_time = 0;
+
  do
do
+
  {
{
+
    move_time = Random(1000);
move_time = Random(1000);
+
    turn_time = Random(1000);
turn_time = Random(1000);
+
    OnFwd(OUT_AC, 75);
OnFwd(OUT_AC, 75);
+
    Wait(move_time);
Wait(move_time);
+
    OnRev(OUT_C, 75);
OnRev(OUT_C, 75);
+
    Wait(turn_time);
Wait(turn_time);
+
    total_time += move_time;
total_time += move_time;
+
    total_time += turn_time;
total_time += turn_time;
+
  }
}
+
  while (total_time < 20000);
while (total_time < 20000);
+
  Off(OUT_AC);
Off(OUT_AC);
+
}
}
+
 
Note also that the do statement behaves almost the same as the while statement. But in the while statement the
+
Заметим, что оператор "do" практически один в один повторяет оператор "while". Но в операторе "while" условие проверяется перед выполнением блока операторов внутри него, а в операторе "do" это делается после. Таким образом в операторе "while" команды могут вообще не выполниться ни разу, а в операторе "do" они выполнятся 1 раз в любом случае.
condition is tested before executing the statements, while in the do statement the condition is tested at the end.
+
 
For the while statement, the statements might never be executed, but for the do statement they are executed at
+
==Подводим итоги==
least once.
+
В этой главе вы познакомились с двумя новыми управляющими структурами - оперторами "if" и "do". Вместе с рассмотренными ранее операторами "repeat" и "while" они управляют тем какие фрагменты программы будут выполняться и в каком порядке. Очень важно, чтобы вы полностью понимали как они это делают. Поэтому будет полезным перед переходом к следующей главе поэкспериментировать с новыми операторами, пока вы не будете уверены, что освоили их использование.
Summary
 
In this chapter we have seen two new control structures: the if statement and the do statement. Together with the
 
repeat statement and the while statement they are the statements that control the way in which the program is
 
executed. It is very important that you understand what they do. So better try some more examples yourself
 
before continuing.
 

Текущая версия на 14:15, 1 октября 2010

Автор: 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" они управляют тем какие фрагменты программы будут выполняться и в каком порядке. Очень важно, чтобы вы полностью понимали как они это делают. Поэтому будет полезным перед переходом к следующей главе поэкспериментировать с новыми операторами, пока вы не будете уверены, что освоили их использование.