Автор: MoonFox
Дата сообщения: 06.09.2006 13:47
[more=Код]
Код: const
N = 5; { Размерность массива A (изменить на то что нужно) }
K = 7; { Размерность массива B }
type
TItem = Integer; { Тип элементов массивов (изменить, если не целые числа) }
TVector = array[1 .. 16384] of TItem; { Служебный тип для представления матриц произвольной размерности как вектора внутри процедур }
procedure FindMinItem(var Matrix; Size: Integer; var MinValue: TItem; var X, Y: Integer); { На входе передаем матрицу (подразумевается квадратная), ее размер и переменные для возврата минимального значения и его индекса }
var
M: TVector absolute Matrix; { "финт ушами": рассматриваем переданную через нетипизированный параметр Matrix матрицу как плоский массив достаточно большой длинны }
I, J: Integer;
begin
X := 1; Y := 1; { Первый элемент - кандидат на минимальное значение }
MinValue := M[Pred(Y) * Size + X]; { Чтобы пересчитать индексы матрицы на индекс вектора, надо умножить уменьшенный на единицу номер строки на размер матрицы и прибавить номер столбца }
for I := 2 to Size do { Перебираем столбцы со 2-ого (первый элемент мы уже просмотрели) }
for J := 1 to I do { И строки с первой до главной диагонали }
if M[Pred(J) * Size + I] < MinValue then { Если нашли очередной минимум, то запоминаем его значение и индексы }
begin
X := I; Y := J;
MinValue := M[Pred(Y) * Size + X];
end;
end;
procedure CombineVector(var Matrix; Size: Integer; var Result); { На входе матрица (подразумевается квадратная) и размер, на выходе вектор сумм }
var
M: TVector absolute Matrix; { см. выше }
R: TVector absolute Result;
I, J: Integer;
begin
for I := 1 to Size do { Обнуляем вектор сумм }
R[I] := 0;
for I := 1 to Size do { Идем по столбцам матрицы }
for J := I to Size do { И строкам ниже главной диагонали }
R[J] := R[J] + M[Pred(J) * Size + I]; { И суммируем нужные значения }
end;
procedure PrintMatrix(var Matrix; Size: Integer); { Процедура для печати матрицы }
var
M: TVector absolute Matrix;
I, J: Integer;
begin
for J := 1 to Size do
begin
for I := 1 to Size do
Write(M[Pred(J) * Size + I] : 5);
WriteLn;
end;
end;
var
A: array[1 .. N, 1 .. N] of TItem;
B: array[1 .. K, 1 .. K] of TItem;
V: array[1 .. N] of TItem;
MinValue: TItem;
I, J: Integer;
begin
Randomize; { Заполнение массивов случайными значениями }
for I := 1 to N do
for J := 1 to N do
A[I, J] := Trunc(Random * 1000);
WriteLn('*** Matrix A ***');
PrintMatrix(A, N);
for I := 1 to K do
for J := 1 to K do
B[I, J] := Trunc(Random * 1000);
WriteLn('*** Matrix B ***');
PrintMatrix(B, K);
FindMinItem(A, N, MinValue, I, J);
WriteLn('Min value of upper items from matrix A is ', MinValue, ' found at position [', I, ', ', J, ']');
FindMinItem(B, K, MinValue, I, J);
WriteLn('Min value of upper items from matrix B is ', MinValue, ' found at position [', I, ', ', J, ']');
CombineVector(A, N, V);
WriteLn('Vector of sums of lower items from matrix A:');
for I := 1 to N do
Write(V[I] : 5);
end.