Другие языки программирования и технологии

Программирование. Матрицы. Pascal.

Доброго времени суток.

Насколько я понял, требуется переставить строки в массивах с разными размерностями одной процедурой. Что ж.. . Такое возможно. Для этого нужно знать, что двухмерные массивы располагаются в памяти последовательно, строка за строкой и уметь пользоваться директивой absolute с помощью которой переменные совмещаются в памяти. Другими словами, два идентификатора указывают на одну область в памяти.

Общий ход действий таков. Объявляется пользовательский тип данных.

type
TData = Integer; {для другого типа просто измените эту строку}

Объявляются две переменные типа массив с нужными размерностями.

var
A : array[1..3,1..4] of TData;
B : array[1..5,1..5] of TData;

Объявляется и реализуется процедура перестановки строк в массиве.

{перестановка строк}
procedure SwapRows(var Arr; RowCount, ColCount, Row1, Row2: Byte);
var
A : array[1..MaxInt] of TData absolute Arr;
j : Integer;
T : TData;
begin
for j:=1 to ColCount do begin
T := A[ColCount * (Row1-1) + j];
A[ColCount * (Row1-1) + j] := A[ColCount * (Row2-1) + j];
A[ColCount * (Row2-1) + j] := T;
end;
end;

В этой процедуре директивой absolute выполняется совмещение в памяти формального параметра Arr и локальной переменной A, что позволяет обращаться к элементам двухмерного массива, как к одномерному. Причем, верхняя граница одномерного массива, равная MaxInt, позволяет в широких пределах варьировать размерность двухмерного массива.

А дальше все просто. В программе делаете так.

SwapRows(A, 3, 4, 2, 3);
SwapRows(B, 5, 5, 2, 4);

Проверено и работает.

Используя приведенный механизм, не трудно написать набор процедур для работы с двухмерными массивами произвольной размерности. Например, вывод массива на экран, очистка строки или столбца, копирование и т. д.

Удачи!
Игорь Алирзаев
Игорь Алирзаев
59 613
Лучший ответ
Если срочно не горит. . Завтра могу помочь. . Добавляйся в агент
Halle Salle
Halle Salle
298