For: различия между версиями

Материал из UoPilot
Перейти к навигации Перейти к поиску
(Новая страница: « == Описание == Команда FOR выполняет цикл несколько раз в соответствии со значением переме...»)
 
 
Строка 5: Строка 5:
 
== Синтаксис ==
 
== Синтаксис ==
 
Привязка к окну: нет.
 
Привязка к окну: нет.
<br>Работа со свернутым окном: да.
+
<br>Работа со свернутым окном: да.
  for &lt;#i> &lt;#iMin> &lt;#iMax> [&lt;#шаг>]
+
  for <#i> <#iMin> <#iMax> [<#шаг>]
 
   [строки_скрипта]
 
   [строки_скрипта]
 
   [[break [уровень_break]]|[continue]]
 
   [[break [уровень_break]]|[continue]]
Строка 12: Строка 12:
 
  end_for
 
  end_for
 
Где:
 
Где:
&lt;br>'''#i''' - числовая переменная-счётчик
+
<br>'''#i''' - числовая переменная-счётчик
&lt;br>'''#iMin''' - начальное значение отсчета
+
<br>'''#iMin''' - начальное значение отсчета
&lt;br>'''#iMax''' - конечное значение отсчета (включительно)
+
<br>'''#iMax''' - конечное значение отсчета (включительно)
&lt;br>'''#шаг''' - шаг цикла (значение, которое при каждом цикле прибавляется к #i). Может быть положительным или отрицательным.  Необязателен. Если не указан, то равен 1.
+
<br>'''#шаг''' - шаг цикла (значение, которое при каждом цикле прибавляется к #i). Может быть положительным или отрицательным.  Необязателен. Если не указан, то равен 1.
&lt;br>'''break''' - команда прерывания цикла. Передаёт управление на строку, находящуюся сразу за end_for.
+
<br>'''break''' - команда прерывания цикла. Передаёт управление на строку, находящуюся сразу за end_for.
&lt;br>'''continue''' - команда продолжения цикла. Передаёт управление на следующий круг цикла (на строку for ...).
+
<br>'''continue''' - команда продолжения цикла. Передаёт управление на следующий круг цикла (на строку for ...).
  
 
== Примеры ==
 
== Примеры ==
Строка 169: Строка 169:
  
 
[[While]]
 
[[While]]
&lt;br>[[Repeat]]
+
<br>[[Repeat]]
&lt;br>[[Break]]
+
<br>[[Break]]
&lt;br>[[Continue]]
+
<br>[[Continue]]
  
 
== История развития ==
 
== История развития ==
  
 
'''0.98 beta'''
 
'''0.98 beta'''
&lt;br>Добавил цикл for ... end_for:
+
<br>Добавил цикл for ... end_for:
  for #&lt;имя> &lt;начало> &lt;конец> [шаг]
+
  for #<имя> <начало> <конец> [шаг]
 
     ...
 
     ...
 
  end_for
 
  end_for
Если переменная существовала, то она заменяется, иначе добавляется. После завершения цикла переменная равна &lt;конец>+1.
+
Если переменная существовала, то она заменяется, иначе добавляется. После завершения цикла переменная равна <конец>+1.
  
 
'''1.07 beta x'''
 
'''1.07 beta x'''
&lt;br>Исправил ошибку в команде break при прерывании нескольких циклов repeat или for.
+
<br>Исправил ошибку в команде break при прерывании нескольких циклов repeat или for.
  
 
'''1.07 beta 7'''
 
'''1.07 beta 7'''
&lt;br>Исправлена ошибка в операторе for, внесенная в предыдущей версии.
+
<br>Исправлена ошибка в операторе for, внесенная в предыдущей версии.
  
 
'''2.05'''
 
'''2.05'''
&lt;br>Исправил ошибку в операторе for с повторным использованием переменных.
+
<br>Исправил ошибку в операторе for с повторным использованием переменных.
  
 
'''2.27.1'''
 
'''2.27.1'''
&lt;br>Исправил ошибку в команде 'for', когда оно вообще не должно было в тело цикла заходить 'for #i 2 1 1'. Малость оптимизировал.
+
<br>Исправил ошибку в команде 'for', когда оно вообще не должно было в тело цикла заходить 'for #i 2 1 1'. Малость оптимизировал.
  
 
'''2.27.2'''
 
'''2.27.2'''
&lt;br>Исправил ошибку в команде 'for', когда оно перестало выполнять 'for #i 1 1'.
+
<br>Исправил ошибку в команде 'for', когда оно перестало выполнять 'for #i 1 1'.
  
 
'''2.29'''
 
'''2.29'''
&lt;br>Исправил ошибку обработки шага равного нулю в команде 'for', из-за которой цикл отрабатывал только 1 раз. 'for #i 1 5 0'
+
<br>Исправил ошибку обработки шага равного нулю в команде 'for', из-за которой цикл отрабатывал только 1 раз. 'for #i 1 5 0'
  
 
'''2.31'''
 
'''2.31'''
&lt;br>Убрал ограничение на выход из 'for' по 'goto'.
+
<br>Убрал ограничение на выход из 'for' по 'goto'.
  
 
'''2.41'''
 
'''2.41'''
&lt;br>Исправил 'return' в 'for' и 'repeat' из двойного 'gosub'.
+
<br>Исправил 'return' в 'for' и 'repeat' из двойного 'gosub'.
 
[[Категория:Циклы]]
 
[[Категория:Циклы]]

Текущая версия на 10:36, 28 августа 2019

Описание

Команда FOR выполняет цикл несколько раз в соответствии со значением переменной управления циклом. Эта переменная может увеличиваться или уменьшаться при выполнении цикла. Циклы могут быть бесконечными или могут иметь конечное значение для переменной управления. Код будет выполняться до тех пор, пока переменная управления удовлетворяет аргументам команды. Если переменная управления вышла за предел конечного значения, выполняется выход из цикла. Переменная управления сохраняет значение последнего выполненного цикла.

Синтаксис

Привязка к окну: нет.
Работа со свернутым окном: да.

for <#i> <#iMin> <#iMax> [<#шаг>]
  [строки_скрипта]
  [[break [уровень_break]]|[continue]]
  [строки_скрипта]
end_for

Где:
#i - числовая переменная-счётчик
#iMin - начальное значение отсчета
#iMax - конечное значение отсчета (включительно)
#шаг - шаг цикла (значение, которое при каждом цикле прибавляется к #i). Может быть положительным или отрицательным. Необязателен. Если не указан, то равен 1.
break - команда прерывания цикла. Передаёт управление на строку, находящуюся сразу за end_for.
continue - команда продолжения цикла. Передаёт управление на следующий круг цикла (на строку for ...).

Примеры

// Пример 1 (вперед, с шагом 2)
for #i 4 8 2
  msg Миша съел #i яблок(а)
end_for
msg После цикла i = #i
end_script
// увидим: 4 6 8
// Пример 2 (назад, с шагом -1)
set #a 4
set #b 2
set #s -1
for #j #a #b #s
  msg Считаем назад: #j
end_for
msg Закончили счёт
end_script
// увидим: 4 3 2 закончили
// Пример 3 (вперед, с шагом 1, используем break)
for #k 2 6
  msg Считаем вперед: #k A
  if #k = 4
     break // прервать цикл
  end_if   
  msg Считаем вперед: #k Б
end_for
msg Закончили счёт
end_script
// увидим: 2А 2Б 3А 3Б 4А Закончили
// Пример 4 (вперед, с шагом 1, используем continue)
for #i 3 5
  msg Считаем вперед: #i A
  if #i = 4
     continue // на следующий круг цикла
  end_if   
  msg Считаем вперед: #i Б
end_for
msg Закончили счёт
end_script
// увидим: 3А 3Б 4А 5А 5Б Закончили
// Пример 5 (вперед, с шагом 1, внутри цикла принудительно дополнительно увеличиваем счетчик)
for #a 5 10 1 // для #а  от 5 до 10  с шагом 1
 set #a #a + 1 // увеличение на единицу. Шаг получается 1+1=2.
 msg #a
end_for
end_script
// увидим: 6 8 10
// Пример 6 (вложенные циклы)
for #i 1 3
  for #j 6 8
     set #n (#i * 10) + #j
     msg #n
  end_for
end_for
end_script
// Увидим: 16 17 18 26 27 28 36 37 38
// Пример 7 - посчитаем количество точек заданного цвета из перечисленных в скрипте
// set linedelay 1 // раскомментировать эту строку, если нужно чтобы скрипт работал быстро
init_arr %a(1 2) 39 24, 16 14, 25 30, 23 48 // перечисляем после скобок пары координат всех проверяемых точек
set #color 32768 // искомый цвет точки
set #sz size (%a) // определили число пар точек в массиве %a
set #n 0 // тут будем считать число точек нужного цвета
for #i 1 #sz // в цикле проверяем цвет всех точек
  if %a[#i 1] %a[#i 2] #color // проверяем цвет в #i-й точке
     set #n #n + 1 // если цвет совпал с заданным, то увеличиваем счетчик найденных точек
  end_if
end_for
msg Найдено #n точек с цветом #color
end_script
// Пример 8 - кликаем по сетке 5x4 двигаясь снизу-вверх слева-направо
set #x1 0 // X левого нижнего угла  
set #y1 40 // Y левого нижнего угла
set #dx 5 // шаг по оси X
set #dy -2 // шаг по оси Y ("-" значит вверх на экране)
set #sizeY 5 // число строк
set #sizeX 4 // число столбцов
set #x2 #x1 + #dx * (#sizeX - 1) // вычисляем другой угол
set #y2 #y1 + #dy * (#sizeY - 1)
for #x #x1 #x2 #dx // переход по столбцам
  for #y #y1 #y2 #dy // переход по строкам
    // left #x #y abs // для выполнения кликов - раскомментировать строку
    log x = #x, y = #y
  end_for // #y
end_for // #x
end_script
// Пример 9
// Движение по сетке 6 * 7. В каждой строке меняется направление движения.
set linedelay 0
set #x1 700       // X левого верхнего угла
set #y1 400       // Y левого верхнего угла
set #dx -80       // шаг по оси X ("-" означает что движение будет справа налево)
set #dy 80       // шаг по оси Y
set #sizeY 7      // число строк
set #sizeX 7      // число столбцов
set #x2 #x1 + #dx * (#sizeX - 1)     // вычисляем другой угол
set #y2 #y1 + #dy * (#sizeY - 1)
set #z 1         // переменная для подсчёта строк
set #xx1 #x1     // X левого верхнего угла 

for #y #y1 #y2 #dy         // переход по строкам
    if  mod(#z 2) = 1      // если строка нечётная меняем направление
        set #tmp #x1
        set #x1 #x2
        set #x2 #tmp
       set #dx abs(#dx)
    else                   // иначе (строка чётная) двигаться влево
        set #x1 #xx1
        set #dx -#dx
        set #x2 #x1 + #dx * (#sizeX - 1)
    end_if
    for #x #x1 #x2 #dx         // переход по столбцам
        move #x #y             // перемещение курсора
        wait 200               // ждать 0,2 сек
    end_for
    set #z #z + 1
end_for
end_script
// Пример 10
// Цикл с нецелыми числами.
for #i 150 250 1
   set $s insert ("," #i 2)   // вставить запятую во вторую позицию
   hint $s
   wait 100
end_for
end_script
// Пример 11
// Прерывание вложенных циклов
for #n 0 1000 1 //Первый цикл, уровень вложенности 2
    for #i 0 1000 1 //Второй цикл, уровень вложенности 1
        log 'Второй цикл'
        break 2 //прерываем первый цикл
        log 'Эта строка не будет выведена'
    end_for
    log 'И эта тоже'
end_for
log 'Вышли из всех циклов'

Смотрите также

While
Repeat
Break
Continue

История развития

0.98 beta
Добавил цикл for ... end_for:

for #<имя> <начало> <конец> [шаг]
    ...
end_for

Если переменная существовала, то она заменяется, иначе добавляется. После завершения цикла переменная равна <конец>+1.

1.07 beta x
Исправил ошибку в команде break при прерывании нескольких циклов repeat или for.

1.07 beta 7
Исправлена ошибка в операторе for, внесенная в предыдущей версии.

2.05
Исправил ошибку в операторе for с повторным использованием переменных.

2.27.1
Исправил ошибку в команде 'for', когда оно вообще не должно было в тело цикла заходить 'for #i 2 1 1'. Малость оптимизировал.

2.27.2
Исправил ошибку в команде 'for', когда оно перестало выполнять 'for #i 1 1'.

2.29
Исправил ошибку обработки шага равного нулю в команде 'for', из-за которой цикл отрабатывал только 1 раз. 'for #i 1 5 0'

2.31
Убрал ограничение на выход из 'for' по 'goto'.

2.41
Исправил 'return' в 'for' и 'repeat' из двойного 'gosub'.