Процедуры передачи управления
В Паскале есть несколько стандартных процедур, изменяющих последовательность выполнения операторов:
- 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.