Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 54. Произведение членов двусторонней арифметической прогрессии на заданном отрезке от стартового члена прогрессии до граничного значения.


Сегодня, уважаемые подписчики, мы с вами приступаем к изучению алгоритмов на базе итерационных циклов.

Прописные истины. Программист – человек, который решает проблему, о которой вы не знали, таким способом, который вы не понимаете.

ПРОИЗВЕДЕНИЕ ЧЛЕНОВ АРИФМЕТИЧЕСКОЙ ПРОГРЕССИИ

Эта задача интересна тем, что на алгоритмическом языке она может быть решена с помощью арифметического цикла, но на языке Паскаль для этого нужен итерационный цикл.

Задача C.2.1. “Произведение членов двусторонней арифметической прогрессии на отрезке”. Заданы стартовый член A и разность R двусторонней арифметической прогрессии. Задано также некоторое граничное число M справа или слева от стартового члена. Построить алгоритм и подпрограмму вычисления произведения членов арифметической прогрессии, находящихся на отрезке между A и M включительно.

Тем, кто забыл, что собой представляет двусторонняя арифметическая прогрессия, рекомендую обратиться к материалам занятия №48 “Двусторонняя арифметическая прогрессия”.

Например, для исходных данных A=3, R=5, M=14 мы получаем три члена прогрессии 3, 8, 13, которые попадают на отрезок [3, 14]. Соответственно искомое произведение составляет 3*8*13=312.

Начнём с алгоритмического языка, который вы, уважаемые подписчики, уже, наверное, основательно подзабыли. Из его средств нам понадобится команда повторения с параметром. Поэтому рекомендую сначала обратиться к материалам занятия №40 “Операторы арифметических циклов”.

Нужный нам алгоритм на алгоритмическом языке имеет следующий вид.

алг ОтрАП ( A, R, M: вещ ): вещ

дано стартовый член A, разность R и граничное число M

надо произведение членов прогрессии на отрезке от A до M

нач i, P: вещ

если M>A то R := Abs(R) иначе R := –Abs(R)   

:= 1

для i от A до M шаг R

выполнять := P * i

ОтрАП := P

кон

Алгоритм ОтрАП интересен тем, что в нём используется команда повторения с параметром, шаг которой отличен от единицы. При этом параметр цикла i выполняет роль текущего члена арифметической прогрессии.

Из перечня свойств двусторонней арифметической прогрессии известно, что разность двусторонней арифметической прогрессии R может быть только положительной. При этом члены прогрессии вправо от стартового вычисляются путём сложения с разностью, а члены прогрессии влево от стартового – путём вычитания разности. Обеспечиваем это условие в самом начале алгоритма с помощью математической функции Abs(x). 

Но, затем знак R корректируется. Это способствует существенному упрощению алгоритма. Если принять R>0, то члены прогрессии, вычисляемые путём сложения с разностью, будут получаться вправо от стартового. Если же принять R<0, то члены прогрессии, вычисляемые путём сложения с разностью, будут получаться влево от стартового. Таким образом, упрощение алгоритма достигается за счёт того, что в любом случае используется только операция сложения.  

От чего же должен зависеть знак разности прогрессии R? Конечно же от заданного граничного числа M! Если M>A, то разность R должна быть положительной, если M<A, то разность R должна быть отрицательной.

Естественное условие <> 0 должно обеспечиваться на этапе задания значений исходных данных. Иначе возможно “зацикливание”. Факт, известный ещё со времён изучения правила исполнения команды повторения с параметром. В случае арифметической прогрессии это объясняется также и естественными причинами: члены прогрессии равны между собой, следовательно их количество даже на отрезке нулевой длины бесконечно.

Получение произведения членов арифметической прогрессии на отрезке обеспечивается с помощью команды повторения с параметром, в заголовке которой указано, что значения перемножаемых членов прогрессии должны начинаться со стартового значения A, а далее изменяться с шагом R до тех пор, пока они не выходят за пределы граничного значения M.

Осуществим перевод команды повторения с параметром с АЯ на язык Паскаль. Для этого воспользуемся правилом из материалов занятия №40 “Операторы арифметических циклов”.

Формальное применение правила перевода даёт следующий результат:

     i := A;
     While ( M – i ) * R >= 0 Do Begin P := P * i; i := i + R End;

Внимательное изучение этого результата наводит на мысль о возможной оптимизации. Действительно, можно обойтись без переменной i. Вместо неё вполне подойдёт переменная A из числа исходных данных алгоритма. Действительно, истинное значение стартового члена A в команде повторения используется лишь однажды, в отличие от других исходных данных алгоритма (разность R и граничное значение M).

Окончательный перевод алгоритма с АЯ на язык Паскаль и программа в целом представлены ниже.     

{$B+,D+,E+,I+,L+,N+,Q+,R+,X-}
Program C_02_01;
   Function Product_Segment ( A, R, M: Real ): Real;
      Var P: Real;
   Begin
      If M > A Then R := Abs(R) Else R := -Abs(R);
      P := 1;
      While ( M - A ) * R >= 0 Do
         Begin P := P * A; A := A + R End;
      Product_Segment := P
   End;
   Var A,R,M: Real;
Begin
   Repeat
      Write('
Введите стартовый член прогрессии: A= ');
      ReadLn(A);
      Write('
Введите разность прогрессии: R= ');
      ReadLn(R);
      Write('
Введите граничное число: M= ');
      ReadLn(M)
   Until R<>0;
   WriteLn('
Произведение на отрезке P=',Product_Segment(A,R,M):0:4);
   ReadLn
End.

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.

 


В избранное