Циклы while
Оператор цикла while выполняет оператор или блок до тех пор, пока проверочное условие (выражение) остается истинным. Он имеет следующий синтаксис:
while(выражение) оператор или_блок
Если выражение представляет собой константу с истинным значением, тело цикла будет выполняться всегда и, следовательно, мы имеем дело с бесконечным оператором. Цикл также окажется бесконечным, когда условие, определенное в выражении изначально, истинно и нигде далее в теле цикла не изменяется. Если же проверочное условие возвращает ложное значение, осуществится выход из цикла и тело оператора while будет пропущено.
Довольно часто в качестве выражения используется оператор присваивания. Так как при этом возвращается некоторое число, в операторе while фактически производится сравнение полученного значения с нулем (следует напомнить, что ноль — эквивалент ложного значения) с дальнейшим принятием решения о выходе из цикла либо его продолжении
Как и для оператора for, если в цикле должны синхронно изменяться несколько переменных, которые зависят от переменной цикла, вычисление их значений можно поместить в проверочное выражение оператора while, воспользовавшись оператором "запятая".
Приведенный ниже пример показывает использование оператора цикла while для представления десятичного числа в двоичном виде.
#include <iostream.h>
int main ()
{
int counter = 4;
short dec;
while(1)// Бесконечный цикл
{
cout « "Введите десятичное число ";
cout « "от 0 до 15: " ;
cin » dec;
cout « "Двоичное представление";
cout « " числа" « dec « ": "; while(counter)
{
if(dec & 8)
cout « 1; else
cout « 0; dec = dec « 1; counter--;
}
cout « ' \n'; counter = 4;
}
return 0;
}
В приведенном примере вводится десятичное число dec, и далее в цикле while осуществляется проверка четвертого бита (число от 0 до 15 может быть закодировано четырьмя битами). Если бит установлен (равен единице), на экран выводится единица, а если он находится в сброшенном состоянии - выводится ноль.
Циклы do-while
В отличие от оператора while, цикл do-while сначала выполняет тело (оператор или блок), а затем уже осуществляет проверку выражения на истинность. Такая конструкция гарантирует, что тело цикла будет обязательно выполнено хотя бы один раз.
Синтаксис оператора имеет вид:
do
оператор_или_блок_операторов ; while(выражение)
Одно из часто используемых применений данного оператора - запрос к пользователю на продолжение выполнения программы:
#include <iostream.h>
int main ()
{
char answer;
do {
// Тело программы
...
cout « "Продолжать выполнение?";
cin » answer;
}
while(answer != 'N')
return 0;
}
Таким образом, тело программы будет повторяться до тех пор, пока пользователь на вопрос "Продолжать выполнение?" не ответит символом ' N'. При этом, в качестве переменной, используемой для хранения этого значения, выступает answer.
Оператор break
Вполне вероятно, у вас уже назревает вопрос, что же делать, если нужно предусмотреть выход из оператора цикла в нескольких местах, не дожидаясь выполнения оставшейся части кода. Здесь на помощь программисту приходит оператор break. Данный оператор может встречаться в теле цикла сколько угодно раз и, как и в случае switch-case, передает управление вне тела конструкции.
В приведенном ниже примере пользователю предлагается ввести число, которое в дальнейшем тестируется на попадание в один из трех диапазонов. На самом деле, если введенное число больше трех, происходит выход из тела цикла while и запрос на ввод числа повторяется.
#include <iostream.h>
int main ()
{
int answer = 0;
do
{
while(answer)
{
if(answer <= 3)
cout«" Меньше 3-x\n"; break;
// Выход из цикла while
// В этот фрагмент кода никогда не попадем
if(answer > '3' && answer < '7')
cout«"От 3-х до 7-ми\n";
break;
if(answer >= '7')
cout«"Больше 7-ми\n";
}
// В этот фрагмент кода попадаем по
break cout « "Repeat?\n";
cin » answer;
}
while(answer != 0);
return 0;
На практике оператор break часто используют для выхода из бесконечного цикла.
for( ; ; )
{
// Условие 1:
if(...)
{
...
break; }
// Условие 2 if (...)
{
break;
}
}
В данном примере, если выполнится любой из условных операторов if, будет достигнут и соответствующий оператор break, который выведет управление из тела конструкции бесконечного цикла for.