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.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | { Функция возвращает А в степени В,
если А > 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. |
|
Сравните задачу Proc37 с примером For15. Только отличие этих решений в том, что в задаче For15 фигурирует натуральная степень, а в предыдущем случае - вещественная.
Proc38. Описать функцию Power2(A, N) вещественного типа, находящую величину A
N (A — вещественный, N — целый параметр) по следующим формулам:
A0 = 1; AN = A·A·…·A (N сомножителей), если N > 0; AN = 1/(A·A·…·A) (|N| сомножителей), если N < 0. |
С помощью этой функции найти A
K, A
L, A
M, если даны числа A, K, L, M.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | { Функция возвращает А в степени 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. |
|
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.
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 | { Функция возвращает А в степени 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. |
|