Тема 1.4. Циклы

В алгоритмах часто встречаются действия, которые требуется повторить несколько раз. Критерием окончания повторений может быть достижение какого-то критического значения, возникновение некоторых условий, внешнее воздействие и так далее. Общим в этих критериях является то, что всегда критерием завершения является некоторое условие. Поскольку о повторяющихся действиях часто говорят как о "циклах", то в программировании все конструкции, которые требуется повторить называются циклом, а завершаются циклы всегда при выполнении некоторого условия.

Счетный оператор цикла for

Первый оператор цикла в Си for часто называют счетным оператором цикла. Связано это с тем, что в заголовке определяется некоторая управляющая переменная (переменная-счетчик), ей присваивается некоторое начальное значение, после каждого прохода переменная счетчик изменяется (увеличивается или уменьшается), а цикл завершается когда переменная счетчик достигает некоторого критического значения.

for(<переменная счетчик>=<нач.знач.>; <условие завершения>; <изменение переменной-счетчика>)
{
<тело цикла>
}

Первая строка, включающая в себя служебное слово for и выражения в круглых скобках называется заголовком цикла, а все что указывается после заголовка внутри фигурных скобок &endash; телом цикла.

Ниже приведен пример участка программы, в котором вычисляется сумма чисел от 1 до 100:

Здесь переменной i присваивается начальное значение 1, затем происходит переход к телу цикла: к текущему значению переменной sum прибавляется текущее значение переменной i. После того, как тело цикла выполнено, происходит увеличение значения переменной i на единицу, новое текущее значение переменной i сравнивается с критическим N, если оно меньше критического, то вновь выполняется тело цикла. Если же значение переменной-счетчика i станет больше критического, то цикл завершится и произойдет переход к следующему за циклом оператору. Этим оператором является вызов функции вывода результата на печать.

Это лишь очень простое описание цикла for, потому что в заголовке могут присутствовать более сложные выражения или отсутствать как некоторые так и все выражения. Однако стольподробное описание оператора цикла выходит за рамки нашего курса.

Условный оператор цикла с пред-условием while

Общий вид условного оператора цикла с предусловие выглядит следующим образом:

while(<условие>)
{
<тело цикла>
}

Пока условие в скбоках истинно (не ложно) выполняется тело цикла. Вот пример вычисления той же суммы, что и в предыдущем примере, только с использованием оператора цикла while:

Теперь инициализацию переменной-счетчика мы делаем до начала цикла, затем проверяется условие завершения цикла, пока оно истинно (отметим, что "while" с английского переводится как "пока") выполняем два оператора, заключенных в фигурные скобки, то есть прибавляем к переменной sum текущее значение переменной i и увеличивае i на единицу.

Следует помнить, что если на момент первой проверки условия, стоящего в круглых скобках после while, оно будет ложным, то тело цикла не выполнитеся ни разу. К тому же, в теле условного оператора цикла всегда должны присутствовать некоторые команды, которые влияют на изменение условия в заголовке. В нашем случае это увеличение переменной i, поэтому рано или позно, но цикл закончится. Если же мы бы забыли эту строку, то однажды войдя в цикл, программа из него уже никогда бы не вышла. Это называется бесконечный цикл. Чаще всего их следует избегать и лишь в редких случаях трудно обойтись без бесконечных циклов.

Условный оператор цикла с пост-условием do ... while

Этот цикл очень похож на предыдущий, но условие в нем проверяется по завершении выполнения тела цикла. Таким образом тело цикла с пост-условие всегда хотя бы один раз будет выполнено. Общи вид:

do
{
<тело цикла>
} while(<условие>)

Пример использования:

Операторы прерывания цикла break и continue

Иногда бывает удобно выйти из цикла другим способом, отличным от проверки условия в его начале или в конце. Оператор break вызывает принудительный выход из циклов for, while и do — аналогично выходу из оператора switch. Выход выполняется из ближайшего (самого внутреннего) цикла или оператора switch.

Оператор continue напоминает break, но передает управление на следующую итерацию (проход) ближайшего цикла for, while или do. В цикле while или do это означает немедленную проверку условия, тогда как в цикле for дополнительно выполняется инкрементирование (изменение переменной-счетчика). Оператор continue применим только к циклам, но не к оператору switch. Если поставить continue внутри switch, в свою очередь находящегося внутри цикла, то управление будет передано на следующий проход этого цикла.