• когда число итераций определяется в процессе вычислений, в зависимости от получаемых результатов; например, вычисления выполняются по одинаковым формулам с использованием при очередной итерации в качестве исходных данных результатов предыдущей итерации:
x, y, z на очередной итерации(очередные значения переменных!!!) à пересчитываются в зависимости от значенийэтих переменных x, y, z на предыдущем этапе;
завершение работы цикла происходит, например, при достижении заданной точности, т.е. когда результаты вычислений на очередной итерации отличаются от предыдущих результатов не больше чем на некоторую заданную величину ε (эпсилон).
Итерационные циклы тесно связаны с итерационными методами решения уравнений и систем.
Примеры алгоритмов с итерационными циклами:
• вычисление корня нелинейного уравнения (методом итераций, методом касательных (Ньютона), методом деления отрезка пополам и т.д.),
• вычисление суммы бесконечного числа слагаемых (функции путем разложения ее в бесконечный ряд (ряд Тейлора), интеграла и т.д.)
Если изобразить общую схему итерационного цикла, то в нем обязательно будут переменные, сохраняющие результат предыдущего (х1) и еще более ранних (х2,...) шагов, а также переменная х – результат текущего шага:
for (х1=..., х2=...; условие(х1,х2); х2=х1,х1=х)
{...х = f (x 1, x 2);...}
Например, вычислить у = √х как предельное значение последовательности, определяемой рекуррентной формулой: yk=(yk-1 + x/yk-1)/2 для k = 1, 2,.…
нач
вещ Х, Ynew, Yold;
вещ epsilon;
ввод X, epsilon; // ввод значения переменной х и точности epsilon
Yold = X;
Ynew = (Yold + X/ Yold)/2;
пока (abs (Ynew – Yold) >= epsilon) цикл
Yold= Ynew;
Ynew= (Yold + X/ Yold)/2;
кцикл
вывод Ynew;
кон
-----------------------------------------------------------------------------------------
Рассмотрим вычисление числа π.
π/4 =1-1/3+1/5-1/7+1/9-….
π = 4 * π/4;
Найдем выражение для пересчета значения последующего слагаемого через предыдущее:
![]() | ![]() | ||||||||
![]() | ![]() | ||||||||
![]() | |||||||||
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream> //включение заголовков для ввода/вывода в поток в стиле С++
#include <iomanip>
using namespace std; //подключение стандартного пространства имен
int main()
{
int k = 1;
double x = 1.0, sum = x, eps = 0.000001;
while (abs(x) > eps)
{
x = -x *(2 * k - 1)/(2 * k + 1);
sum += x;
k++;
}
cout << setiosflags(ios::fixed) << setprecision(7);
cout << "summa:" << setw(11) << sum << endl;
cout << endl;
cout << "PI:" << setw(11) << sum * 4 << endl;
system("pause");
return 0;
}
Директива #include <iomanip> подключает заголовочный файл с объявлениями манипуляторов, определяющих форматирование вывода:
- setw(n) – значение n задает минимальную ширину поля вывода;
- setprecision(m) – значение m задает точность представления вещественных чисел (максимальное количество цифр дробной части при вводе и выводе);
- setiosflags(ios:: fixed) – устанавливает форматный флаг потока ввода-вывода для представления вещественных чисел в формате с фиксированной точкой;
- setiosflags(ios:: scientific) – устанавливает форматный флаг потока ввода-вывода для представления вещественных чисел в формате с мантиссой и порядком.
Результат:
summa: 0.7853987
PI: 3.1415947
Напомним, что точность eps = 0.00000 1.
-----------------------------------------------------------------------------------------











