Инструменты пользователя

Инструменты сайта


help:cycle

Различия

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

Ссылка на это сравнение

Следущая версия
Предыдущая версия
help:cycle [2023/01/01 13:15]
aleks_versus создано
help:cycle [2025/06/18 10:36] (текущий)
byte Исправление опечатки
Строка 1: Строка 1:
- 
 [[help:​coding|Назад:​ Программный код]] [[help:​coding|Назад:​ Программный код]]
  
 ====== Циклы ====== ====== Циклы ======
 +
 +===== Основная информация =====
  
 **Циклы** — это особые конструкции в программе,​ которые многократно выполняют определённый кусочек кода. **Циклы** — это особые конструкции в программе,​ которые многократно выполняют определённый кусочек кода.
  
-Например,​ чтобы вывести на экран числа с 1 по 15, не обязательно пятнадцать раз писать команду ''​***P**'',​ можно использовать цикл:+Например,​ чтобы вывести на экран числа с 1 по 15, не обязательно пятнадцать раз писать команду ''​%%*P%%'',​ можно использовать цикл:
  
 <sxh qsp> <sxh qsp>
 loop i=1 while i<=15 step i+=1: loop i=1 while i<=15 step i+=1:
- *p "<<​i>>,​ "+    ​*p "<<​i>>,​ "
 end end
 </​sxh>​ </​sxh>​
Строка 17: Строка 18:
  
 <sxh qsp> <sxh qsp>
-LOOP {команды до начала цикла} WHILE [условие] STEP {команды в конце итеррации}:​ +LOOP {команды до начала цикла} WHILE [#условие] STEP {команды в конце итерации}:​ 
- {операторы тела цикла}+    {операторы тела цикла}
 END END
 </​sxh>​ </​sxh>​
  
 Здесь: Здесь:
- * ''​{команды до начала цикла}''​ — это команды,​ выполняемые до того, как цикл будет запущен. Данные команды относятся к блоку цикла, но не попадают в итеррации (проходы),​ т.е. выполняются только один раз. Здесь можно, например,​ объявить счётчик цикла. И здесь можно писать множество команд,​ перечисляя их через разделитель ''​**&​**''​ (амперсанд). 
- * ''​[условие]''​ — это выражение,​ по значению которого проверяется условие. Здесь могут использоваться операции сравнения и логические операции в любых связках. В случае,​ если значение выражения ''​[условие]''​ равно нулю, цикл прерывается. 
- * ''​{команды в конце итеррации}''​ — это команды,​ выполняемые в конце каждого прохода цикла. Сюда можно помещать команды,​ которые не относятся напрямую к телу цикла, но тем не менее должны быть выполнены на каждой итеррации. Здесь можно, например,​ изменять значение счётчика цикла. И здесь можно писать на самом деле множество команд,​ перечисляя их через разделитель ''​**&​**''​ (амперсанд). 
- * ''​{операторы тела цикла}''​ — это команды,​ которые необходимо выполнять на каждом проходе,​ и являющиеся основными для цикла. То есть мы делаем цикл именно ради этих команд. 
  
-Цикл в **QSP** ​является отдельным блоком кода, так же как и **действие** ​(''​**[[help:​acts|ACT]]**''​),​ и это значит,​ что внутри ​этого блока кода мы можем объявить локальные переменные. Это очень удобно,​ потому что мы можем объявить локальную переменную для счётчика, ​и это не повлияет на остальные переменные на локации:​+  * ''​%%{команды до начала цикла}%%''​ — это команды, ​выполняемые до того, как цикл будет запущен. Данные команды относятся к блоку цикла, но не попадают в итерации (проходы),​ т.е. выполняются только один раз (не являются телом цикла). Здесь можно, например,​ объявить счётчик цикла. И здесь можно писать множество команд,​ перечисляя их через разделитель ''​%%&​%%''​ (амперсанд). 
 +  ​''​%%[#​условие]%%''​ — это выражение,​ по значению которого проверяется условие, при котором цикл будет выполняться. Здесь могут использоваться операции сравнения и логические операции в любых связках. В случае,​ если значение выражения ''​%%[#​условие]%%''​ равно нулю, цикл прерывается. 
 +  * ''​%%{команды в конце итерации}%%''​ — это команды,​ выполняемые в конце каждого прохода цикла. Сюда можно помещать команды, которые не относятся напрямую к телу цикла, но тем не менее должны ​быть выполнены на каждой итерации. Здесь можно, например,​ изменять значение счётчика цикла. На самом деле здесь можно писать множество ​команд, перечисляя их через разделитель ''​%%&​%%''​ (амперсанд). 
 +  * ''​%%{операторы тела цикла}%%''​ — это командыкоторые необходимо выполнять на каждом проходе. Они являются основными для цикла. То есть мы создаём цикл именно ради этих команд. 
 + 
 +Цикл в **QSP** — это отдельный блок кода (так же как и **действие** ''​**[[help:​acts|ACT]]**''​),​ и это значит,​ что внутри ​цикла мы можем объявить локальные переменные. Это очень удобно,​ потому что мы можем объявить локальную переменную для счётчика, ​что не повлияет на остальные переменные на локации:​
  
 <sxh qsp> <sxh qsp>
Строка 34: Строка 36:
 *pl "i до цикла <<​i>>"​ *pl "i до цикла <<​i>>"​
 loop local i=0 & *p "i в цикле: " while i<6 step i+=1: loop local i=0 & *p "i в цикле: " while i<6 step i+=1:
- *p "<<​i>>,​ "+    ​*p "<<​i>>,​ "
 end end
 *nl "i после цикла <<​i>>"​ *nl "i после цикла <<​i>>"​
Строка 43: Строка 45:
 <sxh qsp> <sxh qsp>
 summ=0 & ! сюда будем записывать сумму чисел summ=0 & ! сюда будем записывать сумму чисел
-! наши числа лежат в массиве ​**mass** +! наши числа лежат в массиве mass 
-loop local i,​size=0,​arrsize('​mass'​) while i<size step i+=1: +loop local i,size = 0,​arrsize('​mass'​) while i<size step i+=1: 
- summ+=mass[i]+    summ += mass[i]
 end end
 *pl '​Сумма всех элементов массива mass: <<​summ>>'​ *pl '​Сумма всех элементов массива mass: <<​summ>>'​
 </​sxh>​ </​sxh>​
 +
 +У циклов нет собственных массивов ''​%%args%%''​ и ''​%%result%%'',​ они используют ''​%%args%%''​ и ''​%%result%%''​ локации (или другого блока кода), на которой расположены.
  
 ===== Виды циклов ===== ===== Виды циклов =====
Строка 54: Строка 58:
 В программировании существуют три основных вида циклов:​ В программировании существуют три основных вида циклов:​
  
- * Цикл с предусловием +  ​* Цикл с предусловием 
- * Цикл с постусловием +  * Цикл с постусловием 
- * Цикл со счётчиком+  * Цикл со счётчиком
  
-**Цикл с предусловием** — это такой цикл, в котором сначала проверяется условие выполнения,​ и только если условие соблюдается,​ производится итеррация. Именно циклы подобного вида мы и рассматривали выше. Вот ещё пример:​+**Цикл с предусловием** — это такой цикл, в котором сначала проверяется условие выполнения,​ и только если условие соблюдается,​ производится итерация. Именно циклы подобного вида мы и рассматривали выше. Вот ещё пример:​
  
 <sxh qsp> <sxh qsp>
Строка 64: Строка 68:
 ! сначала проверяется условие ! сначала проверяется условие
 loop while len($text)>​0:​ loop while len($text)>​0:​
- ! и лишь затем выполняется тело цикла +    ​! и лишь затем выполняется тело цикла 
- *pl $mid($text,​1,​1) +    *pl $mid($text,​1,​1) 
- if len($text)=1:​ +    if len($text)=1:​ 
- $text=''​ +        $text=''​ 
- else +    else: 
- $text=$mid($text,​2) +        $text=$mid($text,​2) 
- end+    end
 end end
 </​sxh>​ </​sxh>​
  
-**Цикл с постусловием** — это такой цикл, в котором сначала производится итеррация (то есть выполняется тело цикла),​ и лишь затем проверяется условие. Такие циклы более редки, но всё же необходимы. В **QSP** не предусмотрена отдельная конструкция для таких циклов,​ поэтому приходится несколько изменять само тело цикла, чтобы цикл работал правильно.+**Цикл с постусловием** — это такой цикл, в котором сначала производится итерация (то есть выполняется тело цикла),​ и лишь затем проверяется условие. Такие циклы более редки, но всё же необходимы. В **QSP** не предусмотрена отдельная конструкция для таких циклов,​ поэтому приходится несколько изменять само тело цикла, чтобы цикл работал правильно.
  
 <sxh qsp> <sxh qsp>
 loop local run=1 while run: loop local run=1 while run:
- ! сначала выполняется тело цикла +    ​! сначала выполняется тело цикла 
- $name=$input('​Введите ваше имя:'​) +    $name=$input('​Введите ваше имя:'​) 
- ! и лишь затем проверяется условие +    ! и лишь затем проверяется условие 
- if $name<>'':​ run=0+    if $name<>'':​ run=0
 end end
 </​sxh>​ </​sxh>​
Строка 89: Строка 93:
 <sxh qsp> <sxh qsp>
 loop local run=1 while run step run=iif($name<>'',​0,​1):​ loop local run=1 while run step run=iif($name<>'',​0,​1):​
- ! сначала выполняется тело цикла +    ​! сначала выполняется тело цикла 
- $name=$input('​Введите ваше имя:'​) +    $name=$input('​Введите ваше имя:'​) 
- ! и лишь затем проверяется условие (в Step)+    ! и лишь затем проверяется условие (в Step)
 end end
 </​sxh>​ </​sxh>​
  
-**Цикл со счётчиком** — в циклах такого вида обязательно присутствует переменная,​ отвечающая за счёт: переменная-счётчик. Переменная счётчик может увеличиваться на каждом проходе,​ или уменьшаться,​ изменяться на разные величины,​ но в любом случае изменяться с каждым проходом:​+**Цикл со счётчиком** — в циклах такого вида обязательно присутствует переменная,​ отвечающая за счёт: переменная-счётчик. Переменная счётчик может увеличиваться на каждом проходе,​ или уменьшаться,​ изменяться на разные величины,​ но в любом случае ​она ​изменяется с каждым проходом:​
  
 <sxh qsp> <sxh qsp>
 ! выводим каждое десятое число от 230 и заканчивая 402 ! выводим каждое десятое число от 230 и заканчивая 402
 loop local i=230 while i<=402 step i+=10: loop local i=230 while i<=402 step i+=10:
- *p "<<​i>>,​ "+    ​*p "<<​i>>,​ "
 end end
  
 ! выводим в обратном порядке каждый третий элемент массива mass ! выводим в обратном порядке каждый третий элемент массива mass
 loop local i=arrsize('​mass'​) while i>0 step i-=3: loop local i=arrsize('​mass'​) while i>0 step i-=3:
- mass[i-1]+    ​mass[i-1]
 end end
 </​sxh>​ </​sxh>​
Строка 111: Строка 115:
 ===== Выход из середины. Прерывание цикла ===== ===== Выход из середины. Прерывание цикла =====
  
-Чтобы в любой момент прервать выполнение цикла, нужно использовать оператор ''​**JUMP**''​ и "​прыжок"​ на метку вне цикла:+Чтобы в любой момент прервать выполнение цикла, нужно использовать оператор ''​%%JUMP%%''​ и "​прыжок"​ на метку вне цикла:
  
 <sxh qsp> <sxh qsp>
Строка 117: Строка 121:
 ! сначала проверяется условие ! сначала проверяется условие
 loop local $s while len($text)>​0:​ loop local $s while len($text)>​0:​
- $s=$mid($text,​1,​1) +    ​$s=$mid($text,​1,​1) 
- if $s='​к':​ jump '​end_of_cycle'​ +    if $s='​к':​ jump '​end_of_cycle'​ 
- *pl $s +    *pl $s 
- if len($text)=1:​ +    if len($text)=1:​ 
- $text=''​ +        $text=''​ 
- else +    else 
- $text=$mid($text,​2) +        $text=$mid($text,​2) 
- end +    end  
 end end
 :​end_of_cycle :​end_of_cycle
Строка 131: Строка 135:
 <sxh qsp> <sxh qsp>
 loop while 1: loop while 1:
- $name=$input('​Введите ваше имя:'​) +    ​$name=$input('​Введите ваше имя:'​) 
- if $name<>'':​ jump '​out'​+    if $name<>'':​ jump '​out'​
 end end
 :out :out
help/cycle.1672578946.txt.gz · Последние изменения: 2023/01/01 13:15 — aleks_versus