Циклы

Определения, классификация

Цикл — это последовательность каких-либо действий, которая может повторяться многократно.

В цикле всегда выделяют:

По расположению управляющей части циклы делятся на циклы с предусловием и на циклы с постусловием.

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

Цикл с постусловием всегда выполняется хотя бы один раз. В нём вначале выполняется тело цикла, а затем делается проверка: надо ли снова повторять цикл.

В языках С/С++ имеется три оператора цикла: for, while и do. Конечно, цикл можно организовать и искусственно, применяя операторы if и goto, но рекомендуется всегда использовать «настоящие» операторы цикла.

Цикл while

Слово while переводится как «пока». То есть, пока истинно некое условие, повторять цикл.

Схематично этот цикл можно изобразить так, как показано на рисунке:


Как видим — это цикл с предусловием. Вначале проверяем истинность некоторого условия, а затем, если оно истинно, выполняем операторы (один или несколько), составляющие тело цикла.

Такой цикл не выполниться ни разу, если условие изначально ложно.

Условие — это любое выражение, имеющее результат логического или арифметического типа, т.е. условие для операторов цикла записывается точно также, как для оператора ветвления if.

Формально оператор while можно записать так:

while(условие) // Заголовок

{

   операторы тела цикла

}

Тело цикла практически всегда необходимо оформлять как блок, так как оператор while редко содержит в своём теле только один оператор.

Алгоритм работы оператора прост:

  1. Вычисляется значение условия в заголовке оператора.

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

Пример. Найти сумму квадратов первых 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 это цикл с постусловием. Его схема выглядит так:


Формальная запись:

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

Это самый популярный оператор цикла для всех С-подобных языков. Популярность объясняется необычайной гибкостью и мощью этого оператора. Циклы for в языках типа Basic и тем более Pascal кажутся просто примитивными.

Формальная запись оператора for следующая:

for(начальные действия; условие; дополнительные действия)

{

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

}

Начальные действия — это любые операторы присваивания, записанные через запятую. Здесь, как правило, делается инициализация различных переменных, необходимых для работы в цикле for.

Условие — логическое или арифметическое выражение, записывается так же, как и для других операторов цикла и оператора if.

Дополнительные действия — любые записанные через запятую операторы присваивания и (или) операторы-выражения (автоувеличение, автоуменьшение).

Алгоритм работы оператора for:

  1. Вычисляются операторы, составляющие начальные действия.

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

Количество операторов в начальных и в дополнительных действиях может быть любым. Любая часть в заголовке (или даже все части) могут отсутствовать:

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 позволяет работать более комфортно, записывать исходный текст в более естественной и компактной форме.

Hosted by uCoz
Назад
На верх
Вперёд
Hosted by uCoz