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

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

  Все выпуски  

Занятие 48. Двустороння арифметическая прогрессия. Определение. Произведение заданного числа членов. Защита от недопустимых значений исходных данных.


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

Утверждается, что в программировании нет чересчур простых задач. Имеется в виду, что всегда можно отыскать пути их усложнения, с тем чтобы добавить им красоты и получить от этого эстетическое удовлетворение.

ДВУСТОРОННЯЯ АРИФМЕТИЧЕСКАЯ ПРОГРЕССИЯ

1. Определение двусторонней арифметической прогрессии.

Впервые о двусторонней арифметической прогрессии упоминалось в материалах занятия 41. При этом было сказано, что она является более сложным образованием, нежели элементарная арифметическая прогрессия.

Основой двусторонней арифметической прогрессии является стартовый член a0. Все остальные члены прогрессии рассматриваются в обе стороны от стартового. Вправо от стартового расположены по возрастанию члены прогрессии, большие a0. Влево от стартового расположены по убыванию члены прогрессии, меньшие a0. Как и в элементарной арифметической прогрессии, разность между последующим и предыдущим членами остаётся неизменной. Например, двусторонняя прогрессия со стартовым членом a0 = 2 и разностью r = 3 имеет вид: ..., -7, -4, -1, 2, 5, 8, 11, 14, ... .

Основные свойства двусторонней арифметической прогрессии таковы:

-       двусторонняя арифметическая прогрессия может быть продолжена бесконечно как вправо, так и влево;

-       двусторонняя арифметическая прогрессия расматривается только как  возрастающая;

-       в качестве стартового может рассматриваться любой член двусторонней арифметической прогрессии;

-       разность двусторонней арифметической прогрессии может быть только положительной;

-       члены двусторонней арифметической прогрессии вправо от стартового вычисляются путём сложения с разностью;

-       члены двусторонней арифметической прогрессии влево от стартового вычисляются путём вычитания разности.

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

Решим следующую задачу.

Задача C.1.5. “Произведение заданного числа членов арифметической прогрессии”. Заданы стартовый член A и разность R двусторонней арифметической прогрессии. Построить подпрограмму вычисления произведения N последовательных членов этой прогрессии вправо (³ 0).

Подпрограмма C.1.5 (функция Product_Progression) перемножает между собой N последовательных членов двусторонней арифметической прогресии вправо, включая и стартовый. Для решения этой задачи аналитического выражения не существует, в отличие от задач вычисления суммы первых N членов прогрессии или её члена с порядковым номером N.

Подпрограмму C.1.5 легко получить преобразованием предыдущей подпрограммы C.1.4 (см. материалы занятия ).

Сначала переориентируем её на вычисление произведения первых N членов  последовательности рекуррентного типа. Для этого достаточно заменить единицей начальное нулевое значение рабочей переменной S, а также заменить сложение умножением. При желании можно изменить наименование подпрограммы и обозначения переменных.

Теперь учтём, что рекуррентное соотношение для вычисления очередного члена арифметической прогресии имеет вид A:=A+R. Дополнительно в заголовке подпрограммы уберём формальный параметр-функцию и добавим разность прогрессии R. 

   Function Product_Progression ( A, R: Real; N: Integer ): Real;
      Var i: Integer; P: Real;
   Begin
      P := 1;
      For i:=1 To N Do Begin P := P * A; A := A + R End;
      Product_Progression := P
   End;

Напомним, что, в соответствии со свойствами двусторонней арифметической прогрессии, ограничением является R > 0. Однако, в данном случае это ограничение не критично. При отрицательном значении разности R мы получим произведение N последовательных членов этой прогрессии влево.

Самостоятельный интерес представляет частный случай данной подпрограммы, когда в качестве арифметической прогрессии рассматриваются последовательные целые числа, начиная с единицы. При этом стартовый член A = 1 и разность R = 1. В этом случае мы получаем произведение целых чисел от 1 до N включительно, которое называется факториалом числа N и обозначается N!.

Подпрограмма C.1.5 при таких условиях существенно упрощается. От переменных A и R можно отказаться, поскольку обе представляют собой величины постоянные. И, кроме того, следует учесть, что значения переменной A совпадают со значениями параметра цикла i. Таким образом, вычислить N!  при небольших N можно с помощью следующей подпрограммы:

   Function Factor ( N: Integer ): LongInt;
      Var i: Integer; P: LongInt;
   Begin
      P := 1;
      For i:=1 To N Do P := P * i;

      Factor := P
   End;

Отметим, что данная подпрограмма правильно вычисляет также и 0!, который, по определению, равен единице.

3. Защита от недопустимых значений исходных данных.

Приведём полный текст программы C.1.5.

{$B+,D+,E+,I+,L+,N+,Q+,R+,X-}
Program C_01_05;
  
Function Product_Progression ( A, R: Real; N: Integer ): Real;
     
Var i: Integer; P: Real;
  
Begin
     
P := 1;
     
For i:=1 To N Do Begin P := P * A; A := A + R End;
     
Product_Progression := P
  
End;
  
Function Error ( R: Real; N: Integer ): Boolean;
     
Var A,B: Boolean;
  
Begin
     
A := R <= 0; B := N < 0;
     
If A Then
        
WriteLn('Ошибка 1: разность прогрессии не положительна');
      
If B Then
        
WriteLn('Ошибка 2: количество членов прогрессии отрицательно');
     
Error := A Or B
  
End;
  
Var A,R: Real; N: Integer;
Begin
  
Write('Введите стартовый член прогрессии: A= ');
  
ReadLn(A);
  
Repeat
     
Write('Введите разность прогрессии: R= ');
     
ReadLn(R);
     
Write('Введите количество членов прогрессии: N= ');
     
ReadLn(N)
  
Until Not Error(R,N);
  
WriteLn('Произведение вправо P=',Product_Progression(A,R,N):0:4);
  
ReadLn
End.

Полный листинг программы C.1.5 приведён с целью продемонстрировать возможность применения для защиты от недопустимых значений исходных данных, вводимых с клавиатуры, диагностической функции Error(R:Real;N:Integer):Boolean. Свойства этой логической функции таковы:

-       функция Error контролирует введённое значение разности двусторонней арифметической прогрессии, которая должна быть положительной (R > 0);

-       функция Error контролирует введённое значение количества членов арифметической прогрессии, которое не должно быть отрицательным ( 0);

-       функция Error выводит на экран диагностические сообщения, то есть сообщения о том, какие именно ошибки были допущены при вводе значений с клавиатуры;

-       функция Error принимает истинное значение, если при вводе с клавиатуры была допущена хотя бы одна из указанных ошибок, и ложное, если введённые исходные данные имели допустимые значения.

Совместное использование оператора цикла-ДО и диагностической функции Error обеспечивает идентификацию ошибок и, при необходимости, повторный ввод исходных данных.

Значение стартового члена арифметической прогрессии по смыслу задачи не имеет никаких ограничений. Поэтому его ввод с клавиатуры организован за пределами цикла.

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

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


В избранное