В предыдущем посте мы рассмотрели концепцию управляющих структур, которые направляют выполнение программы. Цикл - это управляющая структура, которая вызывает повторение оператора или группы операторов. В C ++ есть три структуры управления циклами: цикл while, цикл do-while и цикл for. Разница между этими структурами заключается в том, как они контролируют повторение.

Цикл while

Цикл while состоит из двух важных частей: (1) выражение, которое проверяется на истинное или ложное значение, и (2) оператор или блок, который повторяется, пока выражение истинно. На рисунке ниже показана логика цикла while.

Вот общая структура цикла while:

В общем формате (expression) - это любое выражение, которое может быть оценено как истинное или ложное, а statement; - это любой допустимый оператор C ++. Первая строка, показанная на рисунке выше, называется заголовком цикла. Он состоит из ключевого слова while, за которым следует выражение, заключенное в круглые скобки. Вот как работает цикл: проверяется (expression) , и если он верен, выполняются инструкции. Затем снова проверяется (expression) . Если это правда, инструкции выполняются . Этот цикл повторяется до тех пор, пока (expression) не станет ложным. Повторяющиеся инструкции известны как тело цикла. Цикл while работает как оператор if, который выполняется снова и снова. Пока выражение внутри круглых скобок истинно, тело цикла будет повторяться. В приведенной ниже программе цикл while используется для вывода «Hello» пять раз.

// This program demonstrates a simple while loop.
#include <iostream>
using namespace std;
int main()
{
    int number = 0;
while (number < 5)
    {
        cout << "Hello\n";
        number++;
    }
    cout << "That's all!\n";
    return 0;
}

Эта программа проверяет переменную number, чтобы определить, меньше ли она 5. Если да, то выполняются операторы в теле цикла. Оператор number++; в теле цикла использует оператор инкремента для добавления единицы к number. Это последний оператор в теле цикла, поэтому после его выполнения цикл начинается заново. Он снова проверяет выражение (number < 5), и, если оно истинно, снова выполняются операторы в теле цикла. Этот цикл повторяется до тех пор, пока выражение (number < 5) не станет ложным. Каждое повторение цикла называется итерацией. Этот цикл выполнит пять итераций, потому что переменная number инициализируется значением 0 и увеличивается каждый раз при выполнении тела цикла. Когда выражение (number < 5) проверяется и оказывается ложным, цикл завершается, и программа возобновляет выполнение с оператора, следующего сразу за циклом. На рисунке ниже показана логика этого цикла.

В этом примере числовая переменная называется переменной управления циклом, поскольку она определяет количество повторений цикла. Цикл while известен как цикл pretest, что означает, что он проверяет свое выражение перед каждой итерацией.

Бесконечные циклы

Петли должны содержать в себе способ завершения. Это означает, что что-то внутри цикла должно в конечном итоге сделать тестовое выражение ложным. Цикл в приведенном выше примере останавливается, когда выражение (number < 5) ложно. Если цикл не может быть остановлен, он называется бесконечным циклом. Бесконечный цикл продолжается до тех пор, пока программа не будет прервана. Вот пример бесконечного цикла:

int number = 0;
while (number < 5)
{
    cout << "Hello\n";
}

Это бесконечный цикл, поскольку он не содержит инструкции, изменяющей значение переменной number. Каждый раз, когда выражение (number < 5) проверяется, number будет содержать значение 0. Также можно создать бесконечный цикл, случайно поставив точку с запятой после первой строки цикла while.

int number = 0;
while (number < 5)
{
    cout << "Hello\n";  // This semicolon is an ERROR!
    number++
}

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

while (number < 5);

Этот цикл while всегда будет выполнять нулевой оператор, который ничего не делает. Программа будет казаться «ушедшей в космос», потому что нет ничего, что можно было бы отобразить на экране или показать активность.

Цикл do-while

Цикл do-while выглядит как перевернутый цикл while. На рисунке ниже показана логика цикла do-while.

Вот структура цикла do-while, когда тело цикла содержит несколько операторов:

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

Цикл for

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

Иногда вы знаете точное количество итераций, которые должен выполнить цикл. Цикл, который повторяется определенное количество раз, известен как цикл с управляемым счетчиком. Например, если цикл просит пользователя ввести суммы продаж для каждого месяца в году, он будет повторяться двенадцать раз. По сути, цикл подсчитывает до двенадцати и просит пользователя вводить сумму продаж каждый раз, когда он производит подсчет. Цикл, управляемый счетчиком, должен состоять из трех элементов:

  1. Он должен инициализировать переменную счетчика начальным значением.
  2. Он должен проверить переменную счетчика, сравнив ее с максимальным значением. Когда переменная счетчика достигает своего максимального значения, цикл завершается.
  3. Он должен обновлять переменную счетчика во время каждой итерации. Обычно это делается путем увеличения переменной.

Циклы, управляемые счетчиком, настолько распространены, что C ++ предоставляет специальный тип цикла. Он известен как цикл for. Цикл for специально разработан для инициализации, тестирования и обновления переменной счетчика. Вот формат цикла for, когда он используется для повторения блока:

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

Вот пример простого цикла for, который пять раз выводит «Hello»:

for (int count = 0; count < 5; count++)
{
    cout << "Hello" << endl;
}

В этом цикле выражение инициализации - count = 0, выражение проверки - count < 5, а выражение обновления - count++. В теле цикла есть один оператор - оператор cout. На рисунке ниже показана последовательность событий, происходящих во время выполнения цикла. Обратите внимание, что шаги 2–4 повторяются до тех пор, пока проверочное выражение истинно.

Обратите внимание, как переменная счетчика count используется для управления количеством повторений цикла. Во время выполнения цикла эта переменная принимает значения от 1 до 5, и когда тестовое выражение count < 5 ложно, цикл завершается. Также обратите внимание, что в этом примере переменная count используется только в заголовке цикла для управления количеством итераций цикла. Он не используется ни для каких других целей. Также можно использовать переменную счетчика в теле цикла. Поскольку цикл for проверяет свое тестовое выражение перед выполнением итерации, это цикл предварительного тестирования.

Выбор цикла для использования

Каждый из трех циклов C ++ идеально подходит для использования в разных ситуациях. Вот краткое описание того, когда следует использовать каждый цикл.

  • Цикл while. Цикл while - это условный цикл, что означает, что он повторяется, пока существует определенное условие. Это также цикл предварительного тестирования, поэтому он идеально подходит в ситуациях, когда вы не хотите, чтобы цикл повторялся, если условие ложно с самого начала. Например, проверка ввода, который был прочитан, и чтение списков данных, завершенных контрольным значением, являются хорошими приложениями цикла while.
  • Цикл do-while. Цикл do-while также является условным. Однако, в отличие от цикла while, do-while - это цикл посттестирования. Он идеален в ситуациях, когда вы всегда хотите, чтобы цикл повторялся хотя бы один раз. Цикл do-while - хороший выбор для повторения меню.
  • Цикл for. Цикл for - это цикл предварительного тестирования, который имеет встроенные выражения для инициализации, тестирования и обновления. Эти выражения позволяют очень удобно использовать переменную-счетчик для управления количеством итераций, выполняемых циклом. Выражение инициализации может инициализировать переменную счетчика начальным значением, выражение проверки может проверять переменную счетчика, чтобы определить, удерживает ли она максимальное значение, а выражение обновления может увеличивать переменную счетчика. Цикл for идеален в ситуациях, когда известно точное количество итераций.

Необязательные темы: разрыв и продолжение цикла

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

Цикл while в следующем сегменте программы выполняется 10 раз, но оператор break останавливает его после пятой итерации.

int count = 0;
while (count++ < 10) 
{
    cout << count << endl;
    if (count == 5)
        break;
}

Использование break во вложенном цикле

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

for (int row = 0; row < 5; row++) 
{
    for (int star = 0; star < 20; star++)
    {
        cout << ‘*’;
        if (star == 10)
            break;
    }
    cout << endl;
}

Заявление продолжить

Оператор continue вызывает немедленное завершение текущей итерации цикла. Когда встречается continue, все операторы в теле цикла, которые появляются после него, игнорируются, и цикл готовится к следующей итерации.

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

Следующий сегмент программы демонстрирует использование continue в цикле while:

int testVal = 0;
while (testVal++ < 10)
{
    if (testVal == 4) 
        continue;
    cout << testVal << “ “;
}

Этот цикл выглядит так, как будто он отображает целые числа от 1 до 10. Однако, когда testVal равно 4, оператор continue заставляет цикл пропускать оператор cout и начинать следующую итерацию. Выход цикла:

1 2 3 5 6 7 8 9 10