Всем доброго времени суток.
Программа выдает ошибку 201 при попытке запуска процедуры skalar остальное работает
Код:
program Project1;
uses
crt;
type
matrix = array of array of Integer;
var
a, tempMatrix: matrix;
i, j, dt, size, k, mode, mi, mj, rez: Integer;
//Выводит матрицу на экран
procedure PrintMatrix(m: matrix; n: Integer);
var
i, j: Integer;
begin
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do
Write(m[i, j]:3);
WriteLn;
end;
end;
// Возвращает транспонированую матрицу
function TransposeMatrix(m: matrix; n: Integer): matrix;
var
i, j: Integer;
b: matrix;
begin
SetLength(b, n, n);
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do
begin
b[i, j] := m[j, i];
end;
end;
TransposeMatrix := b;
end;
// Вычеркивает строку и столбец из матрицы
{
Например, имеем матрицу
1 2 3
4 5 6
7 8 9
и если вызвать эту функцию, то она вернет
RearrangeMatrix(matr, 3, 0, 0)
5 6 0
8 9 0
0 0 0
Никакого сверхъестественного алгоритма нет здесь :)
}
function RearrangeMatrix(a: matrix; m{размер матрицы}, i{индекс строки}, j{индекс столбца} : Integer): matrix;
var
ki, kj, di, dj: Integer;
b: matrix;
begin
SetLength(b, m, m);
di := 0;
for ki := 0 to m - 2 do
begin
if (ki = i) then di := 1;
dj := 0;
for kj := 0 to m - 2 do
begin
if (kj = j) then dj := 1;
b[ki, kj] := a[ki + di, kj + dj];
end;
end;
RearrangeMatrix := b;
end;
{
Вычисляет определитель матрицы
}
function Determinant(a: matrix; n: Integer): Integer;
var
i, d, k: Integer;
b: matrix;
begin
d := 0; // хранит значение определителя
k := 1; // нужен, чтобы умножать на -1 чередующиеся значения определителей (см. алгоритм нахождения определителя с использованием миноров)
if (n = 1) // если размер матрицы 1,
then d := a[0, 0] // значит определитель = единственный элемент матрицы
else if (n = 2) // ещё один частный случай, размер матрицы = 2
then d := (a[0, 0] * a[1, 1]) - (a[1, 0] * a[0, 1]) // стандартный алгоритм
else
for i := 0 to n - 1 do // этот алгоритм описан http://math.semestr.ru/kramer/examples.php
begin
b := RearrangeMatrix(a, n, i, 0); //берем "маленькую" матрицу, с вычеркнутым столбцом/строчкой
PrintMatrix(b, n);
// да, функция вызывает саму себя, но вызывается для "маленькой" матрицы.
//Т.е. если исходная матрица имеет размер = 4, то эта функция будет вызываться
//несколько раз для "маленькой" матрицы размером 3,
//и в свою очередь несколько раз для маленькой матрицы размером 2 и т.п.
d := d + k * a[i, 0] * Determinant(b, n - 1);
//см. алгоритм по ссылке выше.
k := -k;
end;
Determinant := d;
end;
// Возвращает матрицу миноров
function MinorMatrix(a: matrix; n: Integer): matrix;
var
b: matrix;
begin
SetLength(b, n, n);
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do
begin
//Матрица миноров такая же по размеру, как и исходная матрица
//Например, хотим найти элемент минорной матрицы первой строки и третьего столбца
//Вычеркиваем первую строку и третий столбец, находим определитель этой матрицы
//Это и будет результат (элемент минорной матрицы)
b[i, j] := Determinant(RearrangeMatrix(a, n, i, j), n - 1);
end;
end;
MinorMatrix := b;
end;
procedure skal(a:matrix);
var
i: integer;
begin
for i := 1 to size do
begin
Rez := Rez + a[mi, i] * a[i, mj];
end;
writeln('Skalyarnoe proizvedenie ravno: ', Rez);
end;
begin