- Вывод текста
- Программирование
- Оформление
- Расширенные возможности
- Нюансы написания игр под разные плееры
-
- 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