nextupprevious

Next:4.2.3 Упражнения
Up:4.2 Независимая обработка элементов последовательности
Previous:4.2.1 Перекодировщик


4.2.2 Выборка элементов последовательности

Задача. Распечатать все такие элементы $Y$ заданной непустой последовательности вещественных чисел, что K$К > 1$ и $\mid Y\mid > \mid e^X \cdot \sin^2X - Y^2 \mid$, где K -- порядковый номер элемента $Y$, а X -- первый элемент последовательности.

Решение. Для функции $Выборка$, которую должна реализовать разрабатываемая программа, не удается записать соотношения, подобные тем, которые были сформулированы для функции $КОД$ (см. п. 4.2.1). Однако если ввести в рассмотрение новую функцию Выбор$Выбор$, для которой

для всех чисел Х и последовательностей $\alpha$, то для нее справедливы соотношения:

где $\mid~\alpha\mid>0$ и $F(X,Y)$ -- функция, имеющая значением либо пустую строку $\Lambda$, если $\mid Y \mid \leq\mid e^X \sin^2 X - Y^2 \mid$, либо строку, состоящую из одного числа $Y$, в противном случае.

Таким образом, имеем

и вычисление функции $Выборка$Выбор$Выбор$может быть осуществлено в два этапа: первый этап -- это ввод первого элемента последовательности, а второй -- вычисление функции Выбор в точном соответствии с методом, рассмотренным при решении задачи в п. 4.2.1.
 

module ВыборкаЭлементовПоследовательности;
    var X,Y : real;
begin (* {|Input2|>0, |Input1|=0, Otput=Выборка(Input1)}*)
    read(X);
    while ~ Eof do (* {Ограничивающее выражение: |Input2|} *)
        (* { X = Голова(Input), |Input1|=1, Otput=Выборка(Input1)}*)
        read(Y);  if abs(Y) $>$ abs(Exp(X) $*$ sqr(Sin(X)) - sqr(Y)) then write(Y) end
        (* { X = Голова(Input), Otput=Выборка(Input1)}*)
    end
    (* {Otput=Выборка(Input)}*)
end ВыборкаЭлементовПоследовательности.

Недостатком этой программы является то, что в ней для каждого элемента $Y$ заданной последовательности заново повторяется вычисление функции $F(X,Y)$. Ясно, что при этом выполняется много лишней работы, поскольку значение выражения $e^X \sin^2 X$ никак не зависит от значения элемента $Y$ и может быть вычислено один раз перед выполнением оператора цикла следующим образом:

module ВыборкаЭлементовПоследовательности2;
    var X,Y : real; S:real;
begin  (* {|Input2|>0, |Input1|=0, Otput=Выборка(Input1)}*)
    Read(X); S := Exp(X) $*$ Sqr(Sin(X));
    (* { X = Голова(Input), |Input1|=1, Otput=Выборка(Input1),$S = Exp(X)*Sqr(Sin(X)) \}$*)
    while ~ Eof do (* {Ограничивающее выражение: |Input2|}*)
        (* { X = Голова(Input), |Input2|>0, Otput=Выборка(Input1), $S = Exp(X)*Sqr(Sin(X)) \}$*)
        read(Y); if abs(Y) $>$ abs(S - sqr(Y)) then write(Y) end
        (* { X = Голова(Input), |Input2|>0, Otput=Выборка(Input1), $S = Exp(X)*Sqr(Sin(X)) \}$ *)
    end
    (* {Otput=Выборка(Input)}* )
end ВыборкаЭлементовПоследовательности2.
 

Next:4.2.3 Упражнения
Up:4.2 Независимая обработка элементов последовательности
Previous:4.2.1 Перекодировщик



© В.Н. Касьянов, Е.В.Касьянова, 2004