Цикл с постусловием (do while)




Вопрос 20

Операторы цикла в С++.

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

Операторы цикла используются для организации многократно повторяющихся вычислений. Любой цикл состоит из тела цикла, то есть тех операторов, которые выполняются несколько раз, начальных установок, модификации параметра цикла и проверки условия продолжения выполнения цикла (рис. 1.8).

 

 

Один проход цикла называется итерацией. Проверка условия выполняется на каждой итерации либо до тела цикла (тогда говорят о цикле с предусловием), либо после тела цикла (цикл с постусловием). Разница между ними состоит в том, что тело цикла с постусловием всегда выполняется хотя бы один раз, после чего проверяется, надо ли его выполнять еще раз. Проверка необходимости вы­полнения цикла с предусловием делается до тела цикла, поэтому возможно, что он не выполнится ни разу.

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

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

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение, как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue, return и goto. Передавать управление извне внутрь цикла не реко­мендуется.

Для удобства, а не по необходимости, в C++ есть три разных оператора цикла – while, do … while и for.

Цикл с предусловием (while)

Цикл с предусловием реализует структурную схему, приведенную на рис. 1.8, а, и имеет вид:

while (выражение) оператор

 

Выражение определяет условие повторения тела цикла, представленного про­стым или составным оператором. Выполнение оператора начинается с вычисле­ния выражения. Если оно истинно (не равно false), выполняется оператор цик­ла. Если при первой проверке выражение равно false, цикл не выполнится ни разу. Тип выражения должен быть арифметическим или приводимым к нему. Выражение вычисляется перед каждой итерацией цикла.

Пример (программа печатает таблицу значений функции у=х2+1во введенном диапазоне):

#include <stdio.h>

int main(){

float Xn, Xk, Dx;

printf("Введите диапазон и шаг изменения аргумента:");

scanf("%f%f%f", &Xn, &Xk, &Dx);

printf("| X | Y |\n"); // шапка таблицы

float X = Xn; // установка параметра цикла

while (X <= Xk){ // проверка условия продолжения

printf("| %5.2f | %5.2f |\n", X, X*X + 1); // тело цикла

X += Dx; // модификация параметра

}

return 0;

}

 

Пример (программа находит все делители целого положительного числа):

#include <iostream.h>

int main(){

int num;

cout << "\n Введите число: "; cin >> num;

int half = num / 2; // половина числа

int div = 2; // кандидат на делитель

while (div <= half){

if (!(num % div)) cout << div << "\n";

div++;

}

return 0;

}

Распространенный прием программирования – организация бесконечного цикла с заголовком while (true) либо while (1) и принудительным выходом из тела цикла по выполнению какого-либо условия.

В круглых скобках после ключевого слова while можно вводить описание пере­менной[1]. Областью ее действия является цикл:

while (int x = 0){ … /* область действия х */ }

Цикл с постусловием (do while)

Цикл с постусловием реализует структурную схему, приведенную на рис. 1.8, б, и имеет вид:

do оператор while выражение;

 

Сначала выполняется простой или составной оператор, составляющий тело цик­ла, а затем вычисляется выражение. Если оно истинно (не равно false), тело цик­ла выполняется еще раз. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управле­ния. Тип выражения должен быть арифметическим или приводимым к нему.

Пример (программа осуществляет проверку ввода):

#include <iostream.h>

int main(){

char answer;

do{

cout << "\n Купи слоника! "; cin >> answer; }

while (answer!= 'y');

return 0;

}

Пример. Программа вычисляет квадратный корень вещественного аргумента X с заданной точностью Eps по итерационной формуле:

.

где yn-1 – предыдущее приближение к корню (в начале вычислений выбирается произвольно), уn – последующее приближение.

Процесс вычислений прекраща­ется, когда приближения станут отличаться друг от друга по абсолютной вели­чине менее, чем на величину заданной точности. Для вычисления абсолютной величины используется стандартная функция fabs(), объявление которой нахо­дится в заголовочном файле <math. h>.

#include <stdio.h>

#include <math.h>

int main(){

double X, Eps; // аргумент и точность

double Yp, Y = 1; // предыдущее и последующее приближение

printf("Введите аргумент и точность: ");

scanf("%lf%lf", &X, &Eps);

do{

Yp = Y;

Y = (Yp + X/Yp)/2;

}

while (fabs(Y - Yp) >= Eps);

printf("\n Корень из %lf равен %lf", X, Y);

return 0;

}

Цикл с параметром (for)

Цикл с параметром имеет следующий формат:

for (инициализация; выражение; модификации) оператор;

Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько опе­раторов, разделенных запятой (операцией «последовательное выполнение»), на­пример, так:

for (int i = 0, j = 2;...,

int k, m;

for (k = 1, m = 0;...

Областью действия переменных, объявленных в части инициализации цикла, яв­ляется цикл[2]. Инициализация выполняется один раз в начале исполнения цикла. Выражение определяет условие выполнения цикла: если его результат, приве­денный к типу bool, равен true, цикл выполняется. Цикл с параметром реализо­ван как цикл с предусловием.

Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую. Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запя­той надо оставить на своих местах!). Пример (оператор, вычисляющий сумму чисел от 1 до 100):

for (int i = 1, s = 0; i<=100; i++) s += i;

Пример (программа печатает таблицу значений функции у=х2+1во введенном диапазоне):

#include <stdio.h>

int main(){

float Xn, Xk, Dx, X;

printf("Введите диапазон и шаг изменения аргумента: ");

scanf("%f%f%f", &Xn, &Xk, &Dx);

printf("| X | Y |\n");

for (X = Xn; X<=Xk; X += Dx)

printf("| %5.2f | %5.2f |\n",X, X*X + 1);

return 0;

}

Пример (программа находит все делители целого положительного числа):

#include <iostream.h>

int main(){

int num. half, div;

cout << "\n Введите число: "; cin >> num;

for (half = num/2, div = 2; div <= half; div++)

if (!(num % div)) cout << div <<"\n";

return 0;

}

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

for (b1; b2; b3) оператор; b1 while (b2){ оператор; b3;}

 

Часто встречающиеся ошибки при программировании циклов – использование в теле цикла неинициализированных переменных и неверная запись условия вы­хода из цикла.

Чтобы избежать ошибок, рекомендуется:

· проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);

· проверить, изменяется ли в цикле хотя бы одна переменная, входящая в усло­вие выхода из цикла;

· предусмотреть аварийный выход из цикла по достижению некоторого коли­чества итераций (см. пример в следующем разделе);

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

Операторы цикла взаимозаменяемы, но можно привести некоторые рекоменда­ции по выбору наилучшего в каждом конкретном случае.

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

Оператор for предпочтительнее в большинстве остальных случаев (однознач­но — для организации циклов со счетчиками).

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

 


[1] В старых версиях компиляторов это требование стандарта может не поддерживаться.

[2] В старых версиях компиляторов это требование стандарта может интерпретироваться по-другому.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: