Циклы FOR, WHILE, REPEAT в QLua (lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 8, среднее: 5,00 из 5)
Загрузка...

Qlua-основы
В скриптовом языке QLua есть 3 вида циклов (for, while и repeat):

1. FOR - DO - END имеет 2 типа:

-- 1-й тип:
 
   -- Цикл сделает 10 итераций, увеличивая каждый раз переменную i на 1, т.е. i будет меняться от 0 до 9,
   -- переменная i является локальной для цикла, т.е. видна только внутри него
   for i = 0, 9, 1 do
      A = A*2;
   end;
   -- Данный цикл можно было записать и без 3-го аргумента, потому что по умолчанию он равен 1
   for i = 0, 9 do
      A = A*2;
   end;
   -- Но вместо 1 можно использовать любое другое число, или выражение, результат которого является числом
   -- Например так, цикл сделает только 5 итераций и остановится, потому что в 6-й итерации i будет равна 10 (0,2,4,6,8,10), а 10 > 9
   for i = 0, 9, 2 do
      A = A*2;
   end;
   -- Здесь используется выражение, т.е. каждая итерация увеличивает переменную i на 2
   for i = 0, 9, 1+1 do
      A = A*2;
   end;
   -- Можно сделать цикл на убывание
   for i = 9, 0, -1 do
      A = A*2;
   end;
 
-- 2-й тип:
 
-- Такой вариант при каждой итерации записывает в i индекс, а в value значение элемента из массива Array, 
-- перебирая, таким образом, все элементы в массиве типа {[1] = 10, [2] = "Текст", [3] = 50}
for i,value in ipairs(Array) do
   -- здесь какой-то блок кода
end;
 
-- Такой вариант при каждой итерации записывает в key ключ, а в value значение элемента из массива Array, 
-- перебирая, таким образом, все элементы в массиве типа {red = "Красный", green = "Зеленый", blue = "синий"}
for key,value in pairs(Array) do
   -- здесь какой-то блок кода
end;

2.WHILE - DO - END

while A < 10 do
   -- здесь какой-то блок кода 
end;
-- Читается так: ПОКА выполняется условие A меньше 10 ВЫПОЛНЯТЬ(делать) блок кода КОНЕЦ

3.REPEAT - UNTIL

repeat
   -- здесь какой-то блок код
until A < 10
-- Читается так: ПОВТОРЯТЬ блок кода ДО ТОГО, пока не выполняется условие A меньше 10

Для того, чтобы досрочно выйти из любого, вышеописанного, цикла служит оператор break.
Пример использования:

for i = 0, 9, 1 do
   if i >= 2 then break; end; -- цикл завершится на 3-й итерации (0,1,2)
end;

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Циклы FOR, WHILE, REPEAT в QLua (lua): 75 комментариев

  1. Не получается от править код! отображается только часть!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    function OnCalculate(indx)
    	if indx = high then
    			high = price
    			end
    		end
    			message("Значение high = " ..high);
    		return high
    	end
    end
  2. Привет всем! Подскажите, пожалуйста, что не так с этим кодом? Перебирает все свечи в источнике, соединяет максимумы, а надо найти и отрисовать ХАЙ за период.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    function Init()
       return #Settings.line
    end
     
    function OnCalculate(indx)
       i = 1
       local high = 0
       local price = H(indx)
       repeat
          if price >= high then
             high = price
             message("Значение high = " ..high);
          end
          i = i + 1
       until i > 5
     
       return high
    end
     
    -- или
     
    function OnCalculate(indx)
       if indx < Settings.period then
          return nil
       else
          local high = 0
          local price = H(indx)
     
          for i = indx-Settings.period+1, indx do
             if price >= high then
                high = price
             end
          end
     
          message("Значение high = " ..high);
     
          return high
       end
    end
  3. Дмитрий, в некоторых языках есть оператор выхода не из цикла (break), а из текущей итерации, что-то навроде "Продолжить", "Continue"

    While Run do
    if (чего-то не хватает пока, поэтому не будем дальше идти) then
    continue
    end
    .........
    .......
    end

          1. Здравствуйте! Городить все таки приходится. Вот пример, если бы было continue:

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            
            function main()
               while RUN do
                  if A < 5 then
                     continue   -- сразу переходим на строку 2      
                  end
                  ...   -- Что-то делаем
                  if B > 10 then
                     continue   -- сразу переходим на строку 2
                  end
                  ...   -- Что-то делаем
               end
            end

            а вот та же самая задача без continue:

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            
            function main()
               while RUN do
                  if A >= 5 then
                     ...   -- Что-то делаем       
                     if B <= 10 then
                        ...   -- Что-то делаем            
                     end    
                  end
               end
            end

            Т.е. приходиться вкладывать if'ы друг в друга. На таком простом примере это не кажется проблемой, но в реальном коде совсем не удобно, что нельзя в любом месте цикла всего одним оператором перейти в его начало.

              1. Дмитрий, уезжайте с этого вордпреса или наладьте. Вы не устали править?
                Если А больше 5 - не значит, что В больше 10, пример не правильный

                1. Хорошо, приведу Вам более реальный пример, если А, В Вам не нравятся 🙂 :

                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  
                  function main()
                     while RUN do
                        if "заявка не выставлена" then
                           continue   -- сразу переходим на строку 2      
                        end
                        ...   -- Проверяем сделки
                        if "сделка не прошла по заявке" then
                           continue   -- сразу переходим на строку 2
                        end
                        ...   -- Что-то делаем
                     end
                  end

                  Хотя, тоже не очень удачный пример, но, думаю, так понятнее смысл

                  1. Короче мы поняли друг друга - "continue" не нужна, если не можешь сделать блок If, то нет смысла и в "continue", только путаница будет. Поэтому Арка и не переходит на 5,2 dll - а там есть даже оператор goto который вообще то облегчил бы некоторые задачи существенно.

  4. function OnCalculate(index)
    if index < Settings.period then
    return nil
    else local sum = 0
    for i = index-Settings.period+1,
    index do sum = sum +C(i) end return sum/Settings.period
    end
    end

    Ребят вот хоть убей не понимаю эту строчку "for i = index-Settings.period+1,", вот единица в конце, зачем она нужна (+1).??Заранее большое спасибо за ответ!

    1. 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      function OnCalculate(index)
         if index < Settings.period then
            return nil
         else
            local sum = 0
            for i = index-Settings.period+1, index do
               sum = sum +C(i)
            end
            return sum/Settings.period
         end
      end

      Видимо это для того, чтобы не обратиться к свече по индексу 0, т.к. они с 1 начинаются

      1. Нет уж, Вам спасибо за шикарный сайт!
        Еще вопросик, в конце статей есть переходы на предыдущую запись и следующую, я почему-то подумал, что переходы соответствуют дереву содержания в левой колонке, но как-то так.

    1. здравствуйте!
      n =3

      вот код и этот,который использую.месидж показывает все равно работает код. я не правильно больше меньше установил?первый вариант правильный?его не использовал а второй.задача прикол-ве эн раз выйти из цикла и перейти дальше по программе.пришлось циклом if делать а этот работает.
      for i = 0n dofor i = 0, n do
      if i >= 2 then break; end; -- цикл завершится на 3-й итерации (0,1,2)
      end;
      if i = 2 then break
      end -- цикл завершится на 3-й итерации (0,1,2)
      end

      1. да и какой из этих циклов самый короткий.for i .while A < 10 do ... .
        while A < 10 do .здесь а -? 10 это n.
        break выход из цикла а return ? что после ретурна нужно. программа останавливается без ошибок .нил пока не пробовал труе останавливается.

        1. и если знаете как сделать цикл с удалением через сколько то циклов .покороче.одни элементы используются несколько раз. луа это круто может.