Skip to content

Instantly share code, notes, and snippets.

@AChep
Last active August 29, 2015 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AChep/ce250476d0aec34818d2 to your computer and use it in GitHub Desktop.
Save AChep/ce250476d0aec34818d2 to your computer and use it in GitHub Desktop.
matrix.pas
program matrix_solver;
const
MAX_LEN = 10;
type
MATRIX = record
m : array [1..MAX_LEN, 1..MAX_LEN] of real;
n : integer;
end;
var
m : MATRIX;
x, y : integer;
{
Считает количество символов, которыми записано
заданое число.
}
function calc_size(a:real):integer;
begin
calc_size := length(floattostr(a));
end;
{
Выводит заданое количество пробелов.
}
procedure print_space(n: integer);
var
i : integer;
begin
for i := 1 to n do
write(' ');
end;
{
Вывод текущего состояния матрицы.
}
procedure print_matrix(var m: MATRIX);
var
s : array [1..MAX_LEN] of integer;
x, y, k:integer;
begin
for x := 1 to m.n do begin
for y := 1 to m.n do begin
k := calc_size(m.m[x, y]);
if k > s[x] then s[x] := k;
end;
inc(s[x]);
end;
for y := 1 to m.n do begin
for x := 1 to m.n do begin
write(m.m[x, y]);
k := calc_size(m.m[x, y]);
print_space(s[x] - k);
end;
writeln();
end;
end;
procedure read_matrix(var m : MATRIX);
var
x, y:integer;
begin
write('Введите размерность матрицы: ');
readln(m.n);
for y := 1 to m.n do begin
if y <> 1 then
writeln();
for x := 1 to m.n do begin
write('a(', x, ';', y, '): ');
readln(m.m[x, y]);
end;
end;
end;
{
Сводит часть одной колонки матрицы
к нулю.
}
procedure subtract_row(var m : MATRIX; row : integer);
var
k : array[1..MAX_LEN] of real;
i, x, y, column : integer;
begin
column := row + 1;
// Посчитать коэфициенты.
for i := column to m.n do
k[i] := m.m[row, i] / m.m[row, row];
// Пересчет матрицы.
for y := column to m.n do
for x := row to m.n do
m.m[x, y] := m.m[x, y] - k[y] * m.m[x, row];
end;
function calc_determinant(m : MATRIX; log : boolean):real;
var
i:integer;
d:real;
begin
for i := 1 to m.n - 1 do begin
subtract_row(m, i);
if log then begin
print_matrix(m);
writeln();
end;
end;
d := 1;
for i := 1 to m.n do
d := d * m.m[i, i];
calc_determinant := d;
if log then writeln('Определитель: ', d);
end;
begin
read_matrix(m);
writeln('-----------------');
writeln('Исходная матрица:');
print_matrix(m);
writeln('-----------------');
writeln('Решение:');
calc_determinant(m, true);
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment