Какую функцию выполняет оператор ** - 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. В первой части кода (с 1 по 12 строчку) определены операции над матрицами: умножение матрицы на число, сложение двух матриц, а также возведение матрицы в степень.
  2. Далее (с 13 по 20 строчку) определена функция печати матрицы, которая выводит значения матрицы на экран.
  3. В конце кода (с 21 по 30 строчку) определён многочлен, вычисление которого производится с помощью возведения матрицы в степень и добавления произведений элементов матрицы и коэффициентов многочлена. Результат вычисления выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы