4. Организация программ циклической структуры. Виды циклов. Циклы с заранее неизвестным числом повторений. Пример. Нахождение суммы бесконечного ряда.

Для реализации циклических процессов используют операторы циклов.

Основные виды циклов:

• цикл-пока (while) (а);
• цикл-до (repeat until) (б);
• счетный цикл (цикл с заданным числом повторений) (в).

3_1

Цикл-пока. Синтаксическая диаграмма оператора «цикл-пока» приведена на рисунке ниже. Условие записывают в виде логического выражения. Оператор тела цикла повторяется, пока условие истинно. Проверка осуществляется на входе. Если при входе в цикл условие не выполняется, то оператор тела цикла игнорируется. Если в тело цикла необходимо поместить несколько операторов, то используют составной оператор.

цикл_пока

Цикл-до. Операторы тела цикла повторяются до выполнения условия, условие проверяется на выходе, т.е. тело цикла всегда выполняется хотя бы один раз. Синтаксическая диаграмма оператора «цикл-до» приведена на рисунке ниже. В тело цикла можно поместить несколько операторов, разделив их точкой с запятой «;».

цикл_до

Счетный цикл. Цикл выполняется, пока переменная (параметр) цикла принимает значения в заданном диапазоне с определенным шагом. Синтаксическая диаграмма оператора приведена на рисунке ниже. Переменная цикла должна иметь порядковый тип. Выражение 1 определяет начальное значение параметра цикла, выражение 2 - конечное значение параметра цикла. Соответственно начальное и конечное значения должны принадлежать к тому же типу, что и параметр цикла. Если используется служебное слово to, то при каждом выполнении цикла переменной цикла присваивается следующее значение порядкового типа переменной. Если используется служебное слово downto, то при каждом выполнении цикла переменной цикла присваивается предыдущее значение порядкового типа переменной. Если диапазон значений переменной цикла пуст, то цикл не выполняется.

счетный_цикл

Пример - нахождение суммы бесконечного ряда:

Вычислить с точностью ε для 0 <= X <= 1:
- приближенное значения функции ln(1+ x) по формуле:

4_2
используя смешанный способ вычисления члена ряда;
- точное значение функции ln(1+x);
- абсолютную и относительную ошибки приближенного значения.

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

program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
var
X,  // - аргумент функции,
Eps,// - требуемую точность,
D,  // - часть (-1)^(N+1)*X^N члена ряда, вычисляемую
      //   по рекуррентной формуле,
R,  // - член ряда,
S,  // - сумму ряда,
Y   // - значение функции ln(1+X),
:Extended;
N  // - номер члена ряда.
:Integer;
begin
Write('Введите требуемую точность: ');
ReadLn(Eps);
Write('Введите значение аргумента функции: ');
ReadLn(X);
D:=1; //Начальное значение для вычисления числителя члена ряда
        //по рекуррентной формуле
N:=1; //Нумерация членов ряда начинается с 1
R:=X; //Первый член ряда
S:=0; //Начальное значение для накопления суммы членов ряда
  //Цикл для вычисления членов ряда и накопления их суммы.
  //Выполнять, пока модуль очередного члена ряда
  //больше требуемой точности.
while Abs(R)>Eps do
try
S:=S+R;   //Включение очередного члена ряда в сумму
    // (*
if N<5 then  //Вывод, используемый при отладке
WriteLn('N=', N, '  R=', R:14:11, '  S=', S:14:11);
    // *)
N:=N+1;   //Увеличение номера члена ряда
D:=-D*X;  //Рекуррентная формула вычисления
              //числителя члена ряда
R:=D/N    //Вычисление N-го члена ряда
except
on E:Exception do //Обработать любое исключение
begin
WriteLn(E.Message);//Вывод типа исключения
WriteLn('Исключение возникло на шаге N = ',N);
ReadLn;
Halt
end;
end; //while try
  //Вывод результатов вычислений:
  //Число шагов, за которое достигнута заданная точность
WriteLn('Число шагов '
         ,'за которое достигнута заданная точность = ',N);
  //Приближенное значение функции ln(1+X)
WriteLn('Приближенное значение функции ln(1+X) = ',S:14:11);
  //Точное значение функции ln(1+X)
WriteLn('ln(1+X) = ',Ln(1+X):14:11);
  //Абсолютная ошибка
WriteLn('Абсолютная ошибка = ',Abs(Ln(1+X)-S):14:11);
  //Относительная ошибка
WriteLn('Относительная ошибка = ',Abs((Ln(1+X)-S)/Ln(1+X)):14:11,'%');
ReadLn;
end.

Hosted by uCoz