В Паскале есть несколько стандартных процедур, изменяющих последовательность выполнения операторов:
- break— завершает выполнение цикла, внутри которого записана;
- continue— выполняет переход к следующей итерации цикла;
- exit— выполняет выход из программы или подпрограммы, внутри которой записана;
- halt— немедленно завершает выполнение программы.
Кроме того, для передачи управления используется оператор перехода goto.
Рассмотрим пример применения процедуры передачи управления.
Пример. Программа вычисления значения функцииСh x (гиперболический косинус) с помощью бесконечного ряда Тейлора с точностью ε по формуле:
Этот ряд сходится при любых значениях аргумента. При увеличении номера nмодуль члена ряда Cn стремится к нулю. При некотором nнеравенство |Cn | =>ε перестает выполняться, и вычисления прекращаются.
Общий алгоритм прост: задать начальное значение суммы ряда, а затем многократно вычислять очередной член ряда и добавлять его к ранее найденной сумме, пока абсолютная величина очередного члена ряда не станет меньше заданной точности.
До выполнения программы предсказать, сколько членов ряда потребуется просуммировать, невозможно. В цикле такого рода есть опасность, что он никогда не завершится. Поэтому для надежности программы необходимо предусмотреть аварийный выход из цикла с печатью предупреждающего сообщения по достижении некоторого максимально допустимого количества итераций.
Прямое вычисление члена ряда по приведенной выше общей формуле, когда х возводится в степень, вычисляется факториал, а затем числитель делится на знаменатель, имеет два недостатка, которые делают этот способ непригодным: большая погрешность вычислений и их низкая эффективность. При вычислении очередного члена ряда предыдущий уже известен, поэтому следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий Cn+1 = Cn *T, где T— некоторый множитель. Подставив в эту формулу Cn и Cn+1 , получим выражение для вычисления Т:
Текст программы с комментариями приведен в (пример 2.4)..
program ch;
const MaxIter = 500; { максимальное количество итераций }
var x, eps : double; { аргумент и точность }
c, y : double; { член ряда и его сумма }
n : integer; { номер члена ряда }
done : boolean; { признак достижения точности }
begin
writeln('Введите аргумент и точность:');
readln(x, eps);
done := true;
c := 1; y := c; { первый член ряда и нач. значение суммы }
n := 0;
while abs(c) > eps do begin
c := c * sqr(x) /(2 * n + 1)/(2 * n + 2); { очередной член ряда }
y := y + c; { добавление члена ряда к сумме }
inc(n);
if n > MaxIter then begin { аварийный выход из цикла }
writeln('Ряд расходится!');
done := false; break
end
end;
if done then
writeln('Для аргумента ', x, ' значение функции: ', y, #13#10,
'вычислено с точностью', eps, ' за ', n, ' итераций');
readln;
end.