- Вывод текста
- Программирование
- Оформление
- Расширенные возможности
- Нюансы написания игр под разные плееры
-
- x AeroQSP
- Утилиты и средства разработки
Это старая версия документа.
Циклы — это особые конструкции в программе, которые многократно выполняют определённый кусочек кода.
Например, чтобы вывести на экран числа с 1 по 15, не обязательно пятнадцать раз писать команду *P, можно использовать цикл:
loop i=1 while i<=15 step i+=1: *p "<<i>>, " end
Для организации циклов в QSP используется оператор loop, состоящий из трёх ключевых слов. Общая запись выглядит так:
LOOP {команды до начала цикла} WHILE [условие] STEP {команды в конце итеррации}:
{операторы тела цикла}
END
Здесь:
{команды до начала цикла} — это команды, выполняемые до того, как цикл будет запущен. Данные команды относятся к блоку цикла, но не попадают в итеррации (проходы), т.е. выполняются только один раз. Здесь можно, например, объявить счётчик цикла. И здесь можно писать множество команд, перечисляя их через разделитель & (амперсанд).[условие] — это выражение, по значению которого проверяется условие. Здесь могут использоваться операции сравнения и логические операции в любых связках. В случае, если значение выражения [условие] равно нулю, цикл прерывается.{команды в конце итеррации} — это команды, выполняемые в конце каждого прохода цикла. Сюда можно помещать команды, которые не относятся напрямую к телу цикла, но тем не менее должны быть выполнены на каждой итеррации. Здесь можно, например, изменять значение счётчика цикла. И здесь можно писать на самом деле множество команд, перечисляя их через разделитель & (амперсанд).{операторы тела цикла} — это команды, которые необходимо выполнять на каждом проходе, и являющиеся основными для цикла. То есть мы делаем цикл именно ради этих команд.
Цикл в QSP является отдельным блоком кода, так же как и действие (ACT), и это значит, что внутри этого блока кода мы можем объявить локальные переменные. Это очень удобно, потому что мы можем объявить локальную переменную для счётчика, и это не повлияет на остальные переменные на локации:
i=99 *pl "i до цикла <<i>>" loop local i=0 & *p "i в цикле: " while i<6 step i+=1: *p "<<i>>, " end *nl "i после цикла <<i>>"
Циклы очень удобно использовать для перебора массивов. Например, с помощью цикла можно сложить все числа, хранящиеся в массиве:
summ=0 & ! сюда будем записывать сумму чисел
! наши числа лежат в массиве **mass**
loop local i,size=0,arrsize('mass') while i<size step i+=1:
summ+=mass[i]
end
*pl 'Сумма всех элементов массива mass: <<summ>>'
В программировании существуют три основных вида циклов:
Цикл с предусловием — это такой цикл, в котором сначала проверяется условие выполнения, и только если условие соблюдается, производится итеррация. Именно циклы подобного вида мы и рассматривали выше. Вот ещё пример:
$text='Выводим текст в столбик' ! сначала проверяется условие loop while len($text)>0: ! и лишь затем выполняется тело цикла *pl $mid($text,1,1) if len($text)=1: $text='' else $text=$mid($text,2) end end
Цикл с постусловием — это такой цикл, в котором сначала производится итеррация (то есть выполняется тело цикла), и лишь затем проверяется условие. Такие циклы более редки, но всё же необходимы. В QSP не предусмотрена отдельная конструкция для таких циклов, поэтому приходится несколько изменять само тело цикла, чтобы цикл работал правильно.
loop local run=1 while run:
! сначала выполняется тело цикла
$name=$input('Введите ваше имя:')
! и лишь затем проверяется условие
if $name<>'': run=0
end
Данный цикл можно изменить вот так, чтобы убрать условие из тела цикла:
loop local run=1 while run step run=iif($name<>'',0,1):
! сначала выполняется тело цикла
$name=$input('Введите ваше имя:')
! и лишь затем проверяется условие (в Step)
end
Цикл со счётчиком — в циклах такого вида обязательно присутствует переменная, отвечающая за счёт: переменная-счётчик. Переменная счётчик может увеличиваться на каждом проходе, или уменьшаться, изменяться на разные величины, но в любом случае изменяться с каждым проходом:
! выводим каждое десятое число от 230 и заканчивая 402
loop local i=230 while i<=402 step i+=10:
*p "<<i>>, "
end
! выводим в обратном порядке каждый третий элемент массива mass
loop local i=arrsize('mass') while i>0 step i-=3:
mass[i-1]
end
Чтобы в любой момент прервать выполнение цикла, нужно использовать оператор JUMP и "прыжок" на метку вне цикла:
$text='Выводим текст в столбик' ! сначала проверяется условие loop local $s while len($text)>0: $s=$mid($text,1,1) if $s='к': jump 'end_of_cycle' *pl $s if len($text)=1: $text='' else $text=$mid($text,2) end end :end_of_cycle
loop while 1:
$name=$input('Введите ваше имя:')
if $name<>'': jump 'out'
end
:out