
Сформулируем вышеприведенную задачу в другом виде. Допустим,
необходимо вычислить сумму
с точностью
.
Тогда цикл с параметром (
for … to … do) для этого случая использовать
уже в принципе невозможно, поскольку заранее неизвестно сколько раз
понадобиться прибавлять очередные элементы к общей сумме, чтобы
выполнить поставленное условие. Не лишне напомнить, что решение этой
задачи невозможно непосредственно и в приложении MS Excel. Ведь и в таком
мощном программном продукте необходимо будет написать специальную
процедуру-подпрограмму на языке Visual Basic for Application с
использованием подобных операторов цикла из арсенала данного языка.
Таким образом, на языке ТП решение новой задачи можно записать с
использованием одного из двух операторов цикла с условиями:
(while … do) или (repeat … until).
Для демонстрации их возможностей используем в решении задачи и тот и
другой. Точность эпсилон (
) вычисления значения суммы в программе
моделируем константой с именем eps, начальное значение которой задаём на
уровне 0.01. Обратитет внимание, что основным требованием завершения
циклов должно быть выполнение условия, чтобы значение очередного элемента
суммы elm было меньше значения
=0.01:
elm < eps,
Однако, Вы помните, что условием работы цикла
while ... do является
значение TRUE условного выражения его выполнения. Понятно, что значение
первого элемента суммы не может быть меньше eps. Поэтому мы можем
записать это условие с использованием логической операции инвертирования
(NOT) логического значения.
const eps = 0.01;
var
n : integer;
k, a, SWHILE, SREPEAT : real;
Begin
Writeln('Введите a='); readln(a);
{Cycle WHILE---------------------------------}
n := 1; SWHILE := 0; elm := 1;
while not (elm < eps) do begin
k := 1/n; elm := exp(k*ln(a)); n := n + 1;
SWHILE := SWHILE + elm;
{Cycle REPEAT---------------------------------}
n := 1; SREPEAT := 0;
repeat k := 1/n; elm := exp(k*ln(a));
SREPEAT := SREPEAT + elm; n := n + 1
until elm < eps ;
{-----------------------------------------------}
Writeln(Две суммы=',SWHILE:10:3,SREPEAT:10:3);