Root /ArchiveAbout
()

Proc 34 - 36

Proc 34 - 36

В задании Proc34 решаем задачу о нахождении факториала числа, Proc35 - двойного факториала, а в Proc36 описываем функцию для вычисления чисел Фибоначчи.

Proc34. Описать функцию Fact(N) вещественного типа, вычисляющую значение факториала N! = 1·2·…·N (N > 0 — параметр целого типа; вещественное возвращаемое значение используется для того, чтобы избежать целочисленного переполнения при больших значениях N). С помощью этой функции найти факториалы пяти данных целых чисел.

{ Функция возвращает значение факториала N! = 1·2·…·N }
function Fact(N: byte): real;
var
  i: byte;
  f: real;
begin
  f := N; //начальное значение факториала
 { Для вычисления фактоиала N надо перемножить числа от N до 2: }
  for i := N downto 3 do
    f := f * (i - 1);
  Fact := f;
end;

  { Основная программа }

var
  N, count: byte;

begin
 { По условию задачи надо вычислить факториалы 5 чисел: }
  for count := 1 to 5 do begin
    write('N = ');
    readln(N);
    writeln(' ', N, '! = ', Fact(N)); //вызываем функцию
    writeln;
  end;
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 * * *

Другой способ написания процедуры для вычисления факториала числа N. В отличие от предыдущего метода, здесь в цикле for индексация идет по возрастанию (от 2 до N).

{ Функция возвращает значение факториала N! = 1·2·…·N }
function Fact(N: byte): real;
var
  i: byte;
  f: real;
begin
  f := 1;
  for i := 2 to N do f := f * i;
  Fact := f
end;

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Сравните эту программу с задачей For19, где тоже рассматривается вычисление факториала числа, но только без процедур.

Proc35. Описать функцию Fact2(N) вещественного типа, вычисляющую двойной факториал:

N!! = 1·3·5·…·N, если N – нечетное;
N!! = 2·4·6·…·N, если N – четное
(N > 0 — параметр целого типа; вещественное возвращаемое значение используется для того, чтобы избежать целочисленного переполнения при больших значениях N). С помощью этой функции найти двойные факториалы пяти данных целых чисел.
{ Функция возвращает значение двойного факториала:
      N!! = 1·3·5·…·N,    если N — нечетное;
      N!! = 2·4·6·…·N,    если N — четное }
function Fact2(N: byte): real;
var
  i: byte;
  f2: real;
begin
  f2 := N; //начальное значение двойного факториала
  i := N; //начальный множитель в факториале 
  while i > 3 do begin
    i := i - 2; //множитель уменьшаем на 2
    f2 := f2 * i; //находим факториал
  end;
  Fact2 := f2
end;

  { Основная программа }

var
  N, count: byte;

begin
  for count := 1 to 5 do begin
    write('N = ');
    readln(N); //вводим число
    writeln(' ', N, '!! = ', Fact2(N)); //вычисляем факториал
    writeln;
  end;
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните программу Proc35 с задачей While6.

Proc36. Описать функцию Fib(N) целого типа, вычисляющую N-й элемент последовательности чисел Фибоначчи FK, которая описывается следующими формулами:

F1 = 1, F2 = 1, FK = FK−2 + FK−1, K = 3, 4, … .

Используя функцию Fib, найти пять чисел Фибоначчи с данными номерами N1, N2, …, N5.

{ Функция возвращает N-й элемент последовательности чисел 
Фибоначчи FK, которая описывается следующими формулами:
  F1 = 1,   F2 = 1,   FK = FK−2 + FK−1,   K = 3, 4, … }
function Fib(N: byte): integer;
var
  F1, F2, FK, f: integer;
  K: byte;
begin
  if N in [12] then f := 1 //для N, равных 1 или 2, имеем 1
  else begin
    F1 := 1; //первый элемент
    F2 := 1; //второй элемент
    K := 2; //начальный номер элемента
    repeat
      inc(K); //увеличиваем номер на 1
      f := F1 + F2; //находим K-й элемент Фибоначчи
      F1 := F2; //(K-2)-й элемент заменяем на (K-1)-й
      F2 := f; //а (K-1)-й элемент заменяем на K-й
    until K = N //выходим, если номер элемента равен N  
  end;
  Fib := f
end;

  { Основная программа }

const
  Q = 5; //количество вводимых чисел

var
  N, i: byte;

begin
  for i := 1 to Q do begin
    write('N', i, ' = '); //запрашиваем ввод N (с приставкой i)
    readln(N); //вводим число
    writeln(' ', N, '-й элемент: ', Fib(N)); //результат
    writeln;
  end
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните Proc36 со следующими задачами: While24, For33 и Array5.