Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр_пас_3.doc
Скачиваний:
111
Добавлен:
04.11.2018
Размер:
13.31 Mб
Скачать

2.4.6. Оператор цикла с постусловием

Этот оператор начинается словом Repeat, после которого следуют операторы, реализующие тело цикла, за ними записывается слово Until и логическое выражение.

При работе такого цикла, сначала выполняются все операторы тела цикла, затем вычисляется логическое выражение, записанное после Until. Если значение этого выражения False, повторяется выполнение тела цикла и опять подсчитывается логическое выражение. И так до тех пор, пока не будет получено значение True. Иными словами выход из цикла осуществляется при истинном значении логического выражения.

Запишем предыдущий пример подсчета факториала, используя оператор цикла с постусловием. Эта программа соответствует алгоритму, представленному на рис.6.

Program Loop1;

{подсчет факториала числа}

Var i, n, Fact : integer;

Begin

Write(‘n=‘);

Readln( n );

Fact := 1;

i := 1;

{цикл с постусловием}

Repeat

Fact := Fact * i;

i := i + 1;

Until i > n;

Writeln(‘n! = ‘,n)

End.

2.4.7. Оператор цикла с предусловием

Оператор цикла с предусловием имеет вид:

While S Do A ,

где S - логическое выражение, A - оператор, представляющий тело цикла.

В этом операторе тело цикла будет выполняться до тех пор, пока значение выражения S истинно. Тем самым, если при входе в цикл значение S есть False, тело цикла не выполнится ни разу.

Рассмотрим пример. Требуется подсчитать сумму бесконечного ряда:

- + - ... + - ...

с заданной точностью.

Для решения этой задачи надо суммировать члены ряда до тех пор, пока абсолютная величина прибавляемого члена не станет меньше значения требуемой точности. Полученная при этом сумма есть сумма ряда с заданной точностью. Алгоритм решения этой задачи состоит из цикла, для которого заранее не известно число повторений, критерием выхода из цикла является величина прибавляемого члена ряда.

На первый взгляд может показаться, что для подсчета величины добавляемого члена надо организовывать дополнительный цикл, т.к. член содержит факториал. Но легко заметить, что, имея значение (i - 1) - го члена можно получить i - ый член, используя рекуррентную формулу

,

где i - номер члена, U - i-ый член ряда. Индексы в этой формуле указывают на то, что в правой части стоит предыдущий член, а в левой получаемый из него следующий. Т.к. после получения нового значения члена ряда - старое значение больше не нужно, новое значение можно записать на место старого, т.е. использовать для них одну и ту же переменную. В программе это выразится в том, что в рекуррентной формуле в левой и правой частях будет присутствовать одна и та же переменная. Естественно перед началом вычислений в цикле эта переменная должна получить значение первого члена ряда.

В соответствии с рассмотренным методом разработаем алгоритм (рис.10) и программу.

Рис. 10

Program Loop3;

Var x,y,z,sum,u : real;

i : integer;

Begin

{Ввод значения x};

Write(‘x=‘);

Readln(x);

{Ввод значения eps};

Write(‘eps=‘);

Readln(eps);

u := x;

i := 1;

sum := u;

z := x*x;

{цикл с предусловием для нахождения суммы ряда}

While Abs( u ) > eps Do

{составной оператор - тело цикла}

Begin

u := -u * z / ( 2* i * (2* i + 1 ));

sum := sum + u;

i := i + 1;

End;

{конец тела цикла}

Writeln(‘sum = ‘, sum)

end.

Переменная z введена в алгоритм для того, чтобы вынести из тела цикла лишние вычисления, это позволит не возводить x в квадрат при каждом повторении цикла. В переменной sum накапливается сумма ряда.