Лабораторный практикум по основам языка C/С++ |
Тема 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
, в
свою очередь находящегося внутри цикла, то управление будет передано на следующий
проход этого цикла.