Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Процедуры передачи управления




В Паскале есть несколько стандартных процедур, изменяющих последовательность выполнения операторов:

  • 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.

 





Поделиться с друзьями:


Дата добавления: 2015-10-27; Мы поможем в написании ваших работ!; просмотров: 502 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Велико ли, мало ли дело, его надо делать. © Неизвестно
==> читать все изречения...

2524 - | 2183 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.