Root /ArchiveAbout
()

Proc 37 - 39

Proc 37 - 39

В задании Proc37 описываем процедуру, вычисляющую А в степени В, где А и В - вещественные числа. Proc38 - аналогичная задача, только показатель степени здесь целый. В примере Proc39 используется комбинация методов из предыдущих двух процедур.

Proc37. Описать функцию Power1(A, B) вещественного типа, находящую величину AB по формуле AB = exp(B·ln(A)) (параметры A и B — вещественные). В случае нулевого или отрицательного параметра A функция возвращает 0. С помощью этой функции найти степени AP, BP, CP, если даны числа P, A, B, C.

{ Функция возвращает А в степени В, 
 если А > 0, и 0, если А ≤ 0 }
function Power1(A, B: real): real;
begin
  if A > 0 then Power1 := exp(B * (ln(A)))
  else Power1 := 0
end;

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

var
  P, A, B, C: real;

begin
  write('P = ');
  readln(P); //вводим показатель степени P
  write('A = ');
  readln(A); //вводим основание степени А
  write('B = ');
  readln(B); //вводим основание степени В
  write('C = ');
  readln(C); //вводим основание степени С
  writeln;
  { Выводим результат: }
  writeln(' A^', P, ' = ', Power1(A, P):0:4);
  writeln(' B^', P, ' = ', Power1(B, P):0:4);
  writeln(' C^', P, ' = ', Power1(C, P):0:4);
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Exp(x: real): real;: Возвращает экспоненту числа x. **function** Ln(x: real): real;: Возвращает натуральный логарифм числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Сравните задачу Proc37 с примером For15. Только отличие этих решений в том, что в задаче For15 фигурирует натуральная степень, а в предыдущем случае - вещественная.

Proc38. Описать функцию Power2(A, N) вещественного типа, находящую величину AN (A — вещественный, N — целый параметр) по следующим формулам:

|A0 = 1;
AN = A·A·…·A (N сомножителей), если N > 0;
AN = 1/(A·A·…·A) (|N| сомножителей), если N < 0.| |--------------------------------------------------------------------------------------------------------------------------------------------------| С помощью этой функции найти AK, AL, AM, если даны числа A, K, L, M.

{ Функция возвращает А в степени N 
 (A - вещественное, N - целое) }
function Power2(A: real; N: integer): real;
var
  i: word;
  pow: real;
begin
  pow := 1; //начальное значение степеня
  if N <> 0 then begin
   { |N| раз умножаем А само на себя, в результате 
   чего на выходе из цикла получим А в степени |N|: }
    for i := 1 to abs(N) do
      pow := pow * A;
   { Если показатель степени отрицательный, 
   то находим обратное значение: }
    if N < 0 then pow := 1 / pow
  end;
  Power2 := pow
end;

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

var
  A, pow: real;
  K, L, M: integer;

begin
  write('A = ');
  readln(A); //вводим основание степени А
  write('K = ');
  readln(K); //вводим показатель степени K
  pow := Power2(A, K); //вычисляем A в степени K
  writeln(' Результат: ', pow:0:4); //выводим результат
  writeln;
  write('L = ');
  readln(L); //вводим показатель степени L
  pow := Power2(A, L); //вычисляем A в степени L
  writeln(' Результат: ', pow:0:4); //выводим результат
  writeln;
  write('M = ');
  readln(M); //вводим показатель степени M
  pow := Power2(A, M); //вычисляем A в степени M
  writeln(' Результат: ', pow:0:4); //выводим результат
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Abs(x: integer): integer;: Возвращает модуль числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Proc39. Используя функции Power1 и Power2 из Proc37 и Proc38, описать функцию Power3(A, B) вещественного типа с вещественными параметрами, находящую AB следующим образом: если B имеет нулевую дробную часть, то вызывается Power2(A, N), где N — переменная целого типа, равная числу B; иначе вызывается Power1(A, B). С помощью Power3 найти AP, BP, CP, если даны числа P, A, B, C.

{ Функция возвращает А в степени B (A и B- вещественные) }
function Power3(A: real; var B: real): real;

  { Функция возвращает А в степени В, 
   если А > 0, и 0, если А ≤ 0 }
  function Power1(A, B: real): real;
  begin
    if A > 0 then Power1 := exp(B * (ln(A)))
    else Power1 := 0;
  end;
  
  { Функция возвращает А в степени N 
   (A - вещественное, N - целое) }
  function Power2(A: real; N: integer): real;
  var
    i: word;
    pow: real;
  begin
    pow := 1; //начальное значение степеня
    if N <> 0 then begin
     { |N| раз умножаем А само на себя, в результате 
     чего на выходе из цикла получим А в степени |N|: }
      for i := 1 to abs(N) do
        pow := pow * A;
     { Если показатель степени отрицательный, 
     то находим обратное значение: }
      if N < 0 then pow := 1 / pow
    end;
    Power2 := pow
  end;

{ Тело основной процедуры: }
begin
 { Если дробная часть равна 0, то нам надо вызвать функцию 
 Power2(A, B). Но поскольку В - вещественного типа, то просто 
 вызвать эту ф-ю мы не можем, так как параметр N в функции Power2 
 целого типа. В этом случае надо число В преобразовать к целому 
 типу. Для этого надо вместо В поставить Round(B): }
  if frac(B) = 0 then //дробная часть равна 0
    Power3 := Power2(A, round(B)) //вызываем ф-ю Power2
  else //дробная часть больше 0
    Power3 := Power1(A, B) //вызываем ф-ю Power1
end;

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

var
  P, A, B, C: real;

begin
  write('P = ');
  readln(P); //вводим показатель степени P
  write('A = ');
  readln(A); //вводим основание степени А 
  write('B = ');
  readln(B); //вводим основание степени В
  write('C = ');
  readln(C); //вводим основание степени С
  writeln;
  writeln(' A^', P, ' = ', Power3(A, P):0:4);
  writeln(' B^', P, ' = ', Power3(B, P):0:4);
  writeln(' C^', P, ' = ', Power3(C, P):0:4)
end.

**type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Exp(x: real): real;: Возвращает экспоненту числа x. **function** Ln(x: real): real;: Возвращает натуральный логарифм числа x. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 **function** Abs(x: integer): integer;: Возвращает модуль числа x. **function** Frac(x: real): real;: Возвращает дробную часть числа x. **function** Round(x: real): integer;: Возвращает x, округленное до ближайшего целого. **type** real;: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308