Циклы в программировании 1С 8. 3
Циклы в программировании 1С 8.3
Цикл в программировании — это любая многократно исполняемая последовательность инструкций, организованная любым способом. Именно так описывается цикл во всех языках программирования. По сути циклы в 1С 8.3 не исключение. Но как всегда, каждый язык программирования имеет свою конструкцию, синтаксис, что выражаясь на обычном языке можно описать как правописание. Перейдем к изучении основных понятий и к примерам.
Циклы Bash
Как я уже сказал, циклы позволяют выполнять один и тот же участок кода необходимое количество раз. В большинстве языков программирования существует несколько типов циклов. Большинство из них поддерживаются оболочкой Bash. Мы рассмотрим их все в сегодняшней статье, но сначала поговорим какими они бывают:
- for — позволяет перебрать все элементы из массива или использует переменную-счетчик для определения количества повторений;
- while — цикл выполняется пока условие истинно;
- until — цикл выполняется пока условие ложно.
Циклы Bash, это очень полезная вещь и разобраться с ними будет несложно. Bash позволяет использовать циклы как в скриптах, так и непосредственно в командной оболочке. Дальше мы рассмотрим каждый из этих видов циклов.
Цикл for
Цикл for bash применяется очень часто из-за своей специфики. Его проще всего использовать когда вы знаете сколько раз нужно повторить операцию или вам нужно просто обработать по очереди все элементы массива и вы не хотите контролировать количество повторений.
Цикл for имеет несколько синтаксисов и может вести себя по разному. Для перебора элементов списка удобно использовать такой синтаксис:
for переменная in список
do
команда1
команда2
done
Каждый цикл for независимо от типа начинается с ключевого слова for. Дальше все зависит от типа. В этом случае после for указывается имя переменной, в которую будет сохранен каждый элемент списка, затем идет ключевое слово in и сам список. Команды, которые нужно выполнять в цикле размещаются между словами do и done.
Проверим все на практике и напишем небольшой скрипт, который будет выводить номера от 1 до 5:
!/bin/bash
for number in 1 2 3 4 5
do
echo $number
done
Дайте скрипту права на выполнение и запустите его:
chmod +x for1.sh
./for1.sh
Вы увидите, что все выполняется так, как и предполагалось. Программа выведет цифры от 1 до 5, которые мы перечислили в массиве. Вы можете передать циклу любой массив, например, вывод какой-либо другой команды:
for iface in $(ls /sys/class/net/)
do
echo $iface
done
Как вы уже поняли, этот цикл выводит список всех, подключенных к системе сетевых интерфейсов. Но в цикле вы можете не только их выводить, но и выполнять какие-либо действия.
Следующий тип цикла for похож на его реализацию в языках программирования Си и С++. Он состоит из трех частей, инициализатора счетчика, условия продолжения выполнения и действия над счетчиком. Вот синтаксис:
for (( счетчик = 1 ; счетчик < 10 ; счетчик ++ ))
do
команда1
команда2
done
Этот цикл немного сложнее, но он позволяет сделать больше. С помощью такого цикла можно не только перебирать массивы, но и сделать необходимое количество повторений. Рассмотрим пример:
!/bin/bash
for ((i=1; i < 10; i++))
do
echo $i
done
Результат странный, правда? Обратите внимание, как выполняется проверка условия. Значение счетчика сравнивается с эталоном. Действие с переменной счетчиком выполняется сразу же после завершения основного блока команд, а уже потом делается сравнение. Таким образом, у нас при первом выполнении i равно 1, а после него уже два 2. Теперь к завершению девятого прохода значение счетчика будет увеличено на единицу и станет 10. Условие сравнения 10 < 10 не верно, поэтому цикл дальше не выполняется.
С помощью этого же синтаксиса можно сделать бесконечные циклы bash linux:
!/bin/bash
for ((;;))
do
echo «Бесконечный цикл, нажмите CTRL+C для выхода»
done
Если необходимо, вы можете выйти из цикла преждевременно. Но так делать не рекомендуется. Для выхода используйте команду break:
!/bin/bash
for (i=1;i<10;i++)
do
echo Значение счетчика $i
if [[ i -gt 5]]
break
fi
done
Со циклами for мы завершили, теперь вы знаете как они выглядят и что с ними делать. Дальше мы рассмотрим циклы while и until. Они намного проще и более универсальны.
Цикл While
Суть цикла While в том, что он будет повторяться до тех пор, пока будет выполняться условие, указанное в объявлении цикла. Здесь нет никаких счетчиков и если они вам нужны, то организовывать их вам придется самим. Bash цикл while имеет такой синтаксис:
while [ условие ]
do
команда1
команда2
команда3
done
Это работает так: сначала выполняется проверка на правильность условия, если true, выполняется набор команд, затем снова выполняется проверка, и так пока условие не вернет отрицательный результат. Это нам тоже нужно сделать вручную. Рассмотрим пример:
!/bin/bash
x=1
while [ $x -lt 5 ]
do
echo «Значение счетчика: $x»
x=$(( $x + 1 ))
done
Здесь сначала мы устанавливаем значение счетчика в единицу, затем, в условии сравниваем его с 5, пока счетчик меньше пяти будут выполняться команды из блока do-done. Но еще в этом блоке нам нужно увеличивать значение счетчика на единицу, что мы и делаем.
Также с помощью while мы можем прочитать несколько строк из стандартного ввода:
!/bin/bash
hile read line
do
echo $line
done
Программа будет запрашивать новые строки пока вы не передадите ей символ конца файла с помощью сочетания клавиш Ctrl+D. Бесконечный цикл while bash с помощью while еще проще организовать:
while :
do
echo «Бесконечный цикл bash, для выхода нажмите Ctrl+C»
done
Цикл until
Нам осталось рассмотреть последний цикл. Это цикл until. Он очень похож на while и отличается от него только работой условия. Если в первом нужно чтобы условие всегда было истинным, то здесь все наоборот. Цикл будет выполняться пока условие неверно. Синтаксис:
until [ условие ]
do
команда1
команда2
done
Думаю после рассмотрения реального примера со счетчиком будет намного понятнее как это работает:
!/bin/bash
count=1
until [ $count -gt 10 ]
do
echo «Значение счетчика: $count»
count=$(( $count + 1 ))
done
Мы задаем значение счетчика 1 и увеличиваем его на единицу при каждом проходе. Как только условие счетчик больше 10 выполнится, сразу цикл будет остановлен. В циклах while и until тоже можно использовать команды break и continue для выхода из цикла и завершения текущего прохода, но мы не будем это очень подробно рассматривать.
Основы программирования
Повтор действий в процедурах достигается при помощи организации циклов. Цикл – это многократно повторяемая последовательность операторов . Существуют различные способы организации циклов, но во всех способах есть:
- строка, которая отмечает начало цикла, и строка, которая отмечает его конец;
- условие выхода из цикла или продолжения выполнения цикла.
Условие выхода из цикла может располагаться в начале или в конце цикла . Нормальный выход из цикла производится, когда выполнено это условие. Внутри цикла можно задать дополнительные условия выхода из цикла и использовать операторы немедленного завершения цикла . После выхода из цикла управление передается оператору, следующему за оператором окончания цикла .
Нельзя передавать управление внутрь цикла и из цикла к оператору, расположенному вне цикла .
В языке Visual Basic применяется несколько форм операторов цикла . Одни и те же действия по повтору команд можно записать различными способами, но в разных ситуациях удобнее использовать определенные способы организации циклов:
- вычисляемые циклы повторяют набор команд определенное (вычисляемое) число раз;
- объектные циклы выполняют набор команд для каждого объекта группы;
- логически прерываемые циклы повторяют команды, пока условие имеет истинное значение или пока значение условия не станет таковым.
Цикл For…Next
Оператор используется для организации вычисляемого цикла ( counted loop ), который применяется, если известно или может быть вычислено количество повторений.
- counter – переменная цикла (счетчик цикла);
- start – начальное значение переменной цикла;
- end – конечное значение переменной цикла;
- step – шаг цикла. Необязательное значение. По умолчанию шаг цикла равен единице;
- Exit For – оператор немедленного выхода из цикла;
- statements – набор повторяемых команд (тело цикла);
- Next – оператор окончания цикла.
На рис.16.9 приведен пример оператора вычисляемого цикла, в котором подсчитывается сумма первых десяти натуральных чисел. При первом входе в цикл счетчик цикла устанавливается в начальное значение ( start=1 ). При каждом повторе к счетчику цикла прибавляется шаг цикла (step, по умолчанию 1). Как только значение переменной цикла превысит конечное значение ( end=10 ), цикл завершается. Можно подсчитать, сколько раз выполнится цикл. Например, если шаг цикла равен единице, то цикл выполняется end-start+1 раз и каждый раз с новым значением счетчика цикла.
Счетчик цикла – числовая переменная, которая обычно участвует в вычислениях внутри цикла. По окончании цикла значение счетчика равно конечному значению плюс шаг цикла при нормальном завершении цикла, т. е. если не было принудительного выхода из цикла по условию.
Параметры цикла start, end, step могут быть заданы числами, числовыми переменными или числовыми выражениями. Параметры цикла вычисляются при входе в цикл и не изменяются во время выполнения цикла, даже если меняются переменные, влияющие на эти значения. Параметры цикла могут иметь положительные и отрицательные значения.
Цикл For Each…Next
Цикл объектного типа используется для массивов или коллекций объектов. Циклы объектного типа повторяют последовательность операторов ровно столько раз, сколько элементов содержится в массиве или в коллекции. В отличие от вычисляемого цикла переменная цикла не является счетчиком цикла, а содержит значение элемента массива или ссылку на объект из коллекции объектов.
- element – переменная, значения которой суть элементы из группы;
- group – массив данных или коллекция объектов;
- statements – последовательность операторов, выполняемая для каждого элемента;
- Exit For – оператор, осуществляющий немедленный выход из цикла.
Если цикл выполняется для массива, то переменная element должна быть переменной типа Variant. Если цикл записан для коллекции объектов, то тип переменной element – Object, или должен совпадать с типом элементов коллекции объектов. Не рекомендуется внутри цикла изменять количество элементов массива или коллекции, так как команды тела цикла могут не обработать новый элемент. Цикл For Each для коллекции объектов более эффективен, чем цикл For Next.
На рис.16.10 в цикле суммируются ячейки интервала A1:B10.
Цикл Do…Loop
Этот цикл является логически прерываемым циклом. Цикл повторяет набор инструкций, пока выполнено некоторое условие. Такую форму цикла чаще всего применяют в условиях неопределенности, когда нельзя заранее установить, сколько раз потребуется повторять действия, например, если заранее не известно, скольким сотрудникам следует рассчитать зарплату.
- condition – тестируемое выражение со значением True или False;
- While|Until – ключевые слова (используется одно из двух), которые определяют, до каких пор будут выполняться команды, составляющие тело цикла: While – повтор операторов, пока условие (condition) истинно; Until – повтор операторов, пока условие ложно (пока условие не станет истинным). Таким образом, циклы с ключевым словом While эквивалентны циклам Until, в которых перед условием стоит отрицание Not: While condition = Until Not condition;
- Exit Do – оператор немедленного выхода из цикла;
- statements – последовательность операторов, выполняемых в цикле.
По сути, оператор имеет пять вариантов синтаксиса: запись условия While|Untilперед входом в цикл (предусловие), запись условия While|Until1 в конце цикла (постусловие) и запись оператора без задания условия. В последнем случае в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен присутствовать оператор немедленного выхода из цикла Exit Do (рис.16.11).
Если условие выполнения цикла нарушено при входе в цикл, то в случае предусловия тело цикла не выполнится ни разу, а в случае постусловия операторы тела цикла выполнятся один раз.
Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.
На рис.16.11 представлена процедура и результат расчета суммы социальных выплат. Предполагается, что данные о зарплате размещены в ячейках колонки A. Цикл выполняется, пока очередная ячейка не окажется пустой или нулевой.
Выход из цикла производится оператором Exit Do. Процедура на рис.16.12 выполняет те же действия, но в операторе цикла задано предусловие с ключевым словом While.
Цикл While…Wend
Этот способ организации цикла повторяет команды тела цикла, пока заданное условие верно. Он полностью эквивалентен циклу Do…Loop с условием While в первой строке оператора (сравни рис.16.12 и рис.16.13). При таком способе организации цикла не применяется оператор немедленного завершения цикла.