В задании 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