В Паскале есть несколько стандартных процедур, изменяющих последовательность выполнения операторов:
- break — завершает выполнение цикла, внутри которого записана;
- continue — выполняет переход к следующей итерации цикла;
- exit — выполняет выход из программы или подпрограммы, внутри которой записана;
- halt — немедленно завершает выполнение программы.
Кроме того, для передачи управления используется оператор перехода goto.
Рассмотрим пример применения процедуры передачи управления.
Пример. Программа вычисления значения функции sin x (синус) с помощью бесконечного ряда Тейлора с точностью по формуле:
y = x - x3/3! + x5/5! - x7/7! +…Этот ряд сходится при любых значениях аргумента. Точность достигается при |Rn| < ε, где Rn —остаточный член ряда, который для данного ряда можно заменить величиной 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:= x; y:= c; { первый член ряда и нач. значение суммы } n:= 0; while abs(c) > eps do begin c:=- c * sqr(x) /(2 * n + 2)/(2 * n + 3); { очередной член ряда } 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.