Цикл — это последовательность каких-либо действий, которая может повторяться многократно.
В цикле всегда выделяют:
тело цикла — это те действия, что многократно повторяются;
управляющую конструкцию, предназначенную для определения необходимости повтора цикла.
По расположению управляющей части циклы делятся на циклы с предусловием и на циклы с постусловием.
В цикле с предусловием вначале определяется, можно ли выполнять тело цикла, и затем, если можно, тело цикла выполняется. И так происходит до тех пор, пока не станет ложным некоторое условие в заголовке цикла.
Цикл с постусловием всегда выполняется хотя бы один раз. В нём вначале выполняется тело цикла, а затем делается проверка: надо ли снова повторять цикл.
В языках С/С++ имеется три оператора цикла: for, while и do. Конечно, цикл можно организовать и искусственно, применяя операторы if и goto, но рекомендуется всегда использовать «настоящие» операторы цикла.
Слово while переводится как «пока». То есть, пока истинно некое условие, повторять цикл.
Схематично этот цикл можно изобразить так, как показано на рисунке:
Как
видим — это цикл с предусловием. Вначале проверяем истинность
некоторого условия,
а затем, если оно истинно, выполняем операторы (один или несколько),
составляющие тело цикла.
Такой цикл не выполниться ни разу, если условие изначально ложно.
Условие — это любое выражение, имеющее результат логического или арифметического типа, т.е. условие для операторов цикла записывается точно также, как для оператора ветвления if.
Формально оператор while можно записать так:
while(условие) // Заголовок
{
операторы тела цикла
}
Тело цикла практически всегда необходимо оформлять как блок, так как оператор while редко содержит в своём теле только один оператор.
Алгоритм работы оператора прост:
Вычисляется значение условия в заголовке оператора.
Если оно истинно, то выполняются операторы тела цикла, а затем управление снова передаётся на заголовок. Если условие ложно, то оператор заканчивает работу. После этого будет выполняться оператор, следующий сразу же за оператором цикла.
Пример. Найти сумму квадратов первых n натуральных чисел.
Возможный текст программы:
#include <iostream>
using namespace std;
int main()
{
int i, n, s;
cout << "n=";
cin >> n;
s = 0;
i = 1;
while(i <= n)
{
s += i * i;
i++;
}
cout << "s=" << s << endl;
return 0;
}
В языках С/С++ оператор while используется реже, чем, к примеру, в Паскале, так как в С/С++ отдают предпочтение очень мощному и универсальному циклу for. (Паскалевский цикл for – это жалкое подобие того, что есть в С/С++ !).
Цикл do — это цикл с постусловием. Его схема выглядит так:
Формальная
запись:
do{
Операторы тела цикла
}while(Условие);
Цикл do всегда выполняется хотя бы один раз. И далеко не во всех задачах это хорошо. Для нашей только что рассмотренной задачи этот цикл может дать побочный эффект: если n по ошибке задать отрицательным или равным нулю, то s будет равно 1, что явно не так. А вот использовать цикл do для проверки входных данных очень даже удобно! Что мы и сделаем, тем самым избавимся от побочного эффекта.
Итак, та же задача: найти сумму квадратов первых n натуральных чисел.
Возможный текст программы с использованием цикла do:
#include <iostream>
using namespace std;
int main()
{
int i, n, s;
do{
cout << "n=";
cin >> n;
}while(n <= 0);
s = 0;
i = 1;
do{
s += i * i;
i++;
}while(i <= n);
cout << "s=" << s << endl;
return 0;
}
Как правило, цикл do используется для ввода данных с проверкой и для организации меню в консольных программах.
Это самый популярный оператор цикла для всех С-подобных языков. Популярность объясняется необычайной гибкостью и мощью этого оператора. Циклы for в языках типа Basic и тем более Pascal кажутся просто примитивными.
Формальная запись оператора for следующая:
for(начальные действия; условие; дополнительные действия)
{
Операторы тела цикла
}
Начальные действия — это любые операторы присваивания, записанные через запятую. Здесь, как правило, делается инициализация различных переменных, необходимых для работы в цикле for.
Условие — логическое или арифметическое выражение, записывается так же, как и для других операторов цикла и оператора if.
Дополнительные действия — любые записанные через запятую операторы присваивания и (или) операторы-выражения (автоувеличение, автоуменьшение).
Алгоритм работы оператора for:
Вычисляются операторы, составляющие начальные действия.
Вычисляется условие. Если оно ложно, то оператор заканчивает свою работу. Если условие истинно, то выполняются операторы тела цикла, потом — операторы, составляющие группу дополнительных действий, и затем снова делается проверка истинности условия. И так до тех пор, пока оно остаётся истинным.
Количество операторов в начальных и в дополнительных действиях может быть любым. Любая часть в заголовке (или даже все части) могут отсутствовать:
for( ; ; ) { операторы тела цикла }
Но точки с запятыми обязательно должны быть!
Снова вернёмся к нашему примеру, но реализуем его с помощью оператора for: найти сумму квадратов первых n натуральных чисел.
Возможный текст программы:
#include <iostream>
using namespace std;
int main()
{
int i, n, s;
do{
cout << "n=";
cin >> n;
}while(n <= 0);
for(s = 0, i = 1; i <= n; i++)
s += i * i;
cout << "s=" << s << endl;
return 0;
}
Как видим, ранее рассмотренный оператор цикла while — это сильно урезанный цикл for.
Цикл for позволяет работать более комфортно, записывать исходный текст в более естественной и компактной форме.