Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ОАиП.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.14 Mб
Скачать

Рекомендации по использованию циклов

Часто встречающимися ошибками при программировании циклов являются использование в теле цикла переменных, которым не были присвоены начальные значения, а также неверная запись условия продолжения цикла. Нужно помнить и о том, что в оператореwhile истинным должно являться условие повторения вычислений, а в операторе repeat — условие их окончания.

Чтобы избежать ошибок, рекомендуется:

  • не забывать о том, что если в теле циклов while и for требуется выполнить более одного оператора, нужно заключать их в блок;

  • убедиться, что всем переменным, встречающимся в правой части операторов присваивания в теле цикла, до этого присвоены значения, а также проверить, возможно ли выполнение других операторов;

  • проверить, изменяется ли в теле цикла хотя бы одна переменная, входящая в условие продолжения цикла;

  • предусматривать аварийный выход из итеративного цикла по достижении некоторого предельно допустимого количества итераций (пример см. в следующем разделе).

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]