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

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


Боковая панель

help:cycle

Это старая версия документа.


Назад: Программный код

Циклы

Циклы — это особые конструкции в программе, которые многократно выполняют определённый кусочек кода.

Например, чтобы вывести на экран числа с 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

Вперёд: Массивы

help/cycle.1672578946.txt.gz · Последние изменения: 2023/01/01 13:15 — aleks_versus