Здесь показаны различия между двумя версиями данной страницы.
Следущая версия | Предыдущая версия | ||
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 |