Лекция №4. Для решения ряда задач требуется многократное повторение одних и тех же действий

Циклы

Для решения ряда задач требуется многократное повторение одних и тех же действий. На практике это реализуется либо с помощью рекурсий, которые мы будем изучать позже, либо с помощью итерации. Итерация – это повторение одних и тех же действий определенное количество раз. Основным методом итерации является цикл. Большую часть работы программы выполняют, находясь в состоянии цикла.

Оператор цикла while

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

Синтаксис оператора while следующий:

while (вывражение)

оператор;

Выражение (условие) – это любое выражение языка С++, а оператор – любой допустимый оператор или блок операторов. Если выражение истинно, выполняется оператор, после чего условие выражения проверяется снова. Так будет продолжаться до тех пор, пока выражение не станет ложным: тогда цикл while завершается, а выполнение программы продолжается со следующей точки.

Пример:

//считать до 10

int x = 0;

while (x < 10)

cout << "X: " << x++;

А теперь рассмотрим полноценную программу, в которой значение переменной counter увеличивается до тех пор, пока не станет равным 5.

Эта несложная программа демонстрирует цикл оператора while. Сначала проверяется условие, и если оно истинно, то выполняется тело цикла. В данном случае условию продолжения цикла удовлетворяют все значения переменной counter, меньшие 5 (строка 10). Если условие истинно, то в строке 12 значение счетчика увеличивается на единицу, а в строке 13 выводится на экран. Как только значение счетчика достигает 5 и условие цикла в строке 10 перестает выполняться, все тело цикла пропускается и программа переходит к строке 15.

Более сложные операторы while

Условие, проверяемое в операторе while, может быть таким же сложным, как и любое другое выражение. Оно может состоять из нескольких выражений, объедененных логическими операторами &&, || и!.

Код ниже демонстрирует более сложный оператор while

Это простая игра. Введите два числа – одно меньше (small), другое больше (large). Затем меньшее число начинает увеличиваться на единицу, а большее уменьшаться на два до тех пор, пока они не встретятся.

В строках 15-18 осуществляется ввод значений. В строке 20 проверяются три условия продолжения цикла:

  1. меньшее число меньше большего;
  2. большее больше 0;
  3. меньшее число меньше максимально допустимого.

В строке 22 значение переменной small увеличивается на 1, а в строке 23 значение переменной large уменьшается на 2.

Цикл завершается, когда хотя бы одно из условий перестает выполняться. После этого управление передается в строку 25, следующую за телом цикла.

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

В строке 10 пользователю предлагается ввести начальное значение счетчика (counter). В строке 12 это значение проверяется (оно не должно быть больше 0), а затем в теле цикла уменьшается на 1. При первом запуске программы начальное значение счетчика равнялось трем, поэтому тело цикла выполнилось трижды. Во втором случае было введено число 0. Выражение в строке 12 возвращает false, поскольку counter не больше нуля. Условие цикла не выполняется, поэтому все тело пропускается и на экран ничего не выводится.

Оператор цикла do … while

Как же поступить, чтобы сообщение выводилось, по крайней мере, один раз? С помощью оператора while это сделать невозможно, так как условие проверяется еще до выполнения тела цикла. Эту проблему можно решить использовав оператор do … while. Он сначала выполняет тело цикла, а условие продолжения проверяет потом. Это гарантирует выполнение операторов цикла, по крайней мере, один раз.

Ниже приведен измененный вариант предыдущей программы, в котором вместо while используется do … while.

В строке 11 пользователю предлагается ввести начальное значение счетчика. В операторе do … while тело цикла выполняется до проверки условия, что гарантирует выполнение операторов цикла, по меньшей мере, один раз. В строке 15 текст сообщения выводится на экран, в строке 16 значение счетчика уменьшается на 1, а встроке 18 проверяется условие продолжения цикла.

Операторы break и continue

Иногда необходимо перейти к началу цикла еще до завершения выполнения всех операторов тела цикла. Для этого используется оператор continue.

Однако в ряде случаев требуется выйти из цикла еще до проверки условия продолжения цикла. Для этого используется оператор break.

Пример использования этих операторов приведен ниже.

Оператор цикла for

Оператор цикла for состоит из ключевого слова for и пары круглых скобок, содержащих три оператора, которые отделяются точками с запятой.

Синтаксис оператора for следующий:

for (инициализация; проверка; приращение)

оператор инициализация устанавливает начальное состояние счетчика. Следующий оператор, проверка – это любое выражение языка С++, результат которого проверяется на каждом цикле. Если результат этого выражения истина, то выполняется тело цикла, а затем, поcле изменения счетчика на величину приращения (по умолчанию увеличение на единицу), действия повторяются.

Например:

// вывести Hello! десять раз

for (int i = 0; i < 10; i++)

cout << "Hello! ";

или

for (int i = 0; i < 10; i++)

{

cout << "Hello! " << endl;

cout << "the value of i is " << i;

}

Первое выражение цикла for является инициализацией счетчика цикла (установкой его начального значения). Счетчик, как правило, представляет собой целочисленную переменную, которая объявляется и инициализируется прямо в цикле for. Второй параметр цикла for представляет собой условие продолжения цикла, которое может быть любым выражением, как и в операторе while, возвращающее логическое значение. Третий параметр устанавливает значение приращения счетчика цикла. В этой части также может использоваться любое корректное выражение или оператор С++.

Пример использования цикла for приведен ниже

Оператор for в строке 10 инициализирует счетчик counter, проверяет его текущее значение и приращение. Тело оператора находится в строке 11. Конечно, вместо него может быть и блок операторов.

Инициализация нескольких счетчиков и их приращение

В инициализации нескольких счетчиков нет ничего необычного, проверка нескольких условий продолжения цикла, также вполне допусима, как инесколько операций над счетчиками цикла. Инициализацию и приращение можно замерить радом операторов, разделяемыз запятой.

В строке 9 переменные i и j инициализируются нулевыми значениями. Затем проверяется условие i < 3, и так как оно справедливо тело цикла выполняется первый раз, и значение счетчиков выводятся на экран. После этого выполняется третья часть оператора for, в которой значения переменных-счетчиков i и j увеличиваются на 1 и на 2 соответственно.

После выполнения строки 10 и изменения значений переменных, условие проверяется снова. Если условие по-прежнему справедливо, тело цикла выполняется еще раз. Это происходит до тех пор, пока условие цикл ане станет ложным. Тогда управление передет к следующему оператору после цикла.

Пустые операторы цикла for

Любой оператор цикла for может отсутствовать. Чтобы отметить позицию пропущенного оператора, используется точка с запятой (;). Чтобы создать цикл for, который работает так же, как цикл while, достаточно отказаться от первого и третьего операторов. Продемонстрируем это на примере.

Очевидно, что результат выполнения такого циклав точности совпадает с результатом выполнения цикла while из ранее рассмотренного примера. В строке 9 инициализируется значение перменной counter. Установки параметров цикла for, показанные в строке 10, сожержат только проверку условия продолжения цикла. Приращение переменной цикла отсутствует, поэтому он ведет себя точно так же, как и цикл while (counter < 5).

Можно опустить даже все три параметра цикла for, а для управления циклом использовать операторы break и continue. Пример использования конструкции for без параметров приведен ниже.

Здесь удалены все три оператора – инициализация, условие и приращение. Начальное значение счетчика инициализируется в строке 9 еще до начала работы цикла. Условие продолжение цикла также проверяется в отдельном операторе if в строке 15, и если оно истинно, то в строке 18 увеличивается значение счетчика. Если условие не выполняется, оператор break в строке 21 прерывает выполнения цикла.

Несмотра на то, что рассмотренная программа совершенно абсурдна, встречаются ситуации, когда конструкция for (;;) оказывается просто необходимой. Такой пример мы рассмотрим чуть позже.

Вложенные циклы.

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

В начале программы пользователю предлагается ввести количество строк и столбцов, а также символ, которым будет заполняться матрица. Первый, внешний цикл for в строке 21, инициализирует счетчик (i) значением 0. Затем следует тело цикла.

В первой строк тела внешнего цикла (строка 23) инициализируется еще один цикл. Переменной j присваивается значение 0 и начинается выполнение тела внутреннего цикла. Внутренний цикл for содержит только один оператор (вывод символа). Затем проверяется условие (j < columns) и если оно истинно, j увеличивается на единицу, а на экран выводится следующий символ. Так продолжается до тех пор, пока j не станет равно числу столбцов.

После вывода на экран 13 символов условие внутреннего цикла оказывается ложным, и управление передается в строку 25, где на экран виводится символ новой строки. После этого проверяется условие внешнего цикла (i < rows), и если оно истинно, то увеличивается счетчик i и тело внешнего цикла выполняется заново.

При второй итерации внешнего цикла опять выполняется внутренний цикл. Переменной j опять присваивается нулевое значение, и все операции внутреннего цикла повторяются сначала.

Область действия переменных в операторе for

Область действия переменных, объявленных в заголовке цикла for, ограничивается исключительно блоком цикла for.

for (int i = 0; i < 5; i++)

{

cout << i << endl;

}

i = 7; // переменная вышла за пределы видимости

В данном примере компилятор выдаст ошибку при попытке присвоить переменной i значение 7, так как переменная не объявлена.

int i; // объявлена вне цикла

for (i = 0; i < 5; i++)

{

cout << i << endl;

}

i = 7; // теперь доступна для всего кода

В этом же случае код откомпилируется без ошибок, так как переменная i объявлена вне цикла for.

Оператор switch

Мы уже рассматривали применение операторов if и if … else. но в некоторых ситуациях применение оператора if может привести к вознокновению очень сложных конструкций с большим числом вложенных операторов. Язык С++ располагает альтернативным решение этой проблемы – оператором switch. В отличие от оператора if, он позволяет проверять сразу несколько условий, организуя ветвление программы более эффективно. Синтаксис оператора switch следующий:

switch (выражение)

{

case значение1: оператор;

break;

case значение2: оператор;

break;

....

case значениеN: операт+ор;

break;

default: оператор;

}

Выражением в скобках оператора switсh может быть любое допустимое выражение языка С++, а оператором – любой допустимый оператор или блок операторов, кроме логических операций и выражений сравнения.

Переход осуществляется к той строке оператора switch, где после слова case находится значение, соответствующее результату выражения. С этой строки выполнение операторов продолжается до тех пор, пока оператор switch не завершится либо пока не встретится оператор break, если ни одно значение case не соответствует результату выраджения, то выполняются операторы, следующие за словом default, а в случае его отсутствия оператор switch завершается.

Если оператор break в конце оператора case отсутствует, выполнение переходит к следующему оператору case. Ниогда это необходимо, но обычно приводит к ошибкам.

Программа предлагает ввести число, которое передается оператору switch. Если введен 0, что соответсвует оператору case в строке 15, то на экран выводится сообщение ”Too small, sorry!”, после чего оператор break завершает выполнение оператора switch. Если введено число 5, управление передается в строку 17 и выводится соответсвующее сообщение, а затем выполняется строка 18, в которой также выводится сообщение, и так до строки 22.

Если введенное число не принадлежит диапазону от 0 до 5, то выполняется строка 23 с оператором default, в которой выводится сообщение ”Too large!”.

Использование оператора switch для меню.

Вернемся к циклу for с пустыми операторами. Бесконечный цикл используют для организации меню, в которых пользователь может выбрять какой-либо пункт, выполнить соответствующие действия, а затем снова вернутся к меню. Так будет продолжаться до тех пор, пока пользователь не выберет пункт выхода.

Бесконечный цикл не имеет условия выхода. Чтобы выйти из этого цикла, необходим оператор break.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: