Какую функцию выполняет оператор ** - Free Pascal
Формулировка задачи:
Наткнулся на оператор ** в статье про арифметические операции. Вот что там написано:
To exponentiate two types, the ** exponentiation operator must be overloaded.
Как я понял это что-то вроде операции возведения в степень, но вопрос в том, как ее использовать. Пробовал записывать его между двумя операндами, но компилятор ругается на типы переменных.
Что все-таки делает этот оператор и где его можно использовать?
Решение задачи: «Какую функцию выполняет оператор **»
textual
Листинг программы
{$mode objfpc}
const
size = 4;
type
TMatrix = array[1 .. size, 1 .. size] of double;
operator * (const a, b: TMatrix) m: TMatrix;
var i, j, k: integer;
begin
for i := 1 to size do
for j := 1 to size do begin
m[i, j] := 0;
for k := 1 to size do
m[i, j] := m[i, j] + a[i, k] * b[k, j]
end;
end;
operator * (const a: TMatrix; const f: double) m: TMatrix;
var i, j: integer;
begin
for i := 1 to size do
for j := 1 to size do
m[i, j] := f * a[i, j]
end;
operator + (const a, b: TMatrix) m: TMatrix;
var i, j: integer;
begin
for i := 1 to size do
for j := 1 to size do
m[i, j] := a[i, j] + b[i, j]
end;
{ Возведение матрицы в степень }
operator ** (const a: TMatrix; const pow: integer) m: TMatrix;
var i, j: Integer;
begin
if pow = 0 then begin
for i := 1 to size do
for j := 1 to size do
m[i, j] := Byte(i = j);
exit
end;
m := a;
for i := 1 to pred(pow) do
m := m * a;
end;
procedure matrixPrint(a: TMatrix);
var i, j: integer;
begin
for i := 1 to size do begin
for j := 1 to size do
write(a[i, j]:9:2);
writeln
end
end;
const
n = 3;
p: array[1 .. n] of double = (1.0, -2.0, 3.0);
const
a: TMatrix = (
(10, 11, 14, 16),
(12, 17, 10, 16),
( 8, 12, 12, 7),
( 8, 5, 17, 1)
);
var
Res: TMatrix;
i: Integer;
begin
matrixPrint(a);
for i := 1 to n do
res := res + (a ** (n - i)) * p[i]; { Все вычисление многочлена матрицы записывается в одну строчку }
matrixPrint(Res)
end.
Объяснение кода листинга программы
В данном коде на языке Free Pascal реализована работа с матрицами.
- В первой части кода (с 1 по 12 строчку) определены операции над матрицами: умножение матрицы на число, сложение двух матриц, а также возведение матрицы в степень.
- Далее (с 13 по 20 строчку) определена функция печати матрицы, которая выводит значения матрицы на экран.
- В конце кода (с 21 по 30 строчку) определён многочлен, вычисление которого производится с помощью возведения матрицы в степень и добавления произведений элементов матрицы и коэффициентов многочлена. Результат вычисления выводится на экран.