16.05.2010, 19:03
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.
Вот в приложении вариант с нетипизированными параметрами. Там обрабатываются две ПРЯМОУГОЛЬНЫЕ матрицы, с квадратными все просто - передавайте одинаковое число строк и столбцов (второй и третий параметры подпрограмм)
Если нужно через absolute, то пара строк изменится, но суть останется ("пара" от немецкого ein Paar = несколько)
Приложение:
const
sizeofInteger = sizeof(Integer);
procedure Sort(var m; const rows, cols: Integer);
var
k, n, p1, p2: Integer;
s, o: Word;
temp: Pointer; {Делаю через динамическую память - если не
так надо, напишите. Будет чуть дольше}
begin
s := Seg(m);
o := Ofs(m);
GetMem(temp, cols*sizeofInteger);
for k:=1 to rows-1 do
for n := k+1 to rows do
begin
p1 := memw[s:o+(k-1)*cols*sizeofInteger];
p2 := memw[s:o+(n-1)*cols*sizeofInteger];
if p2 > p1 then
begin
{Обмен строк местами}
move(ptr(s, o+(k-1)*cols*sizeofInteger)^, temp^,
cols*sizeofInteger);
move(ptr(s, o+(n-1)*cols*sizeofInteger)^,
ptr(s, o+(k-1)*cols*sizeofInteger)^,
cols*sizeofInteger);
move(temp^, ptr(s, o+(n-1)*cols*sizeofInteger)^,
cols*sizeofInteger);
end
end;
FreeMem(temp, cols*sizeofInteger);
end;
procedure Print(var m; rows, cols: Integer);
var k, n, p: Integer;
s, o: Word;
begin
s := Seg(m);
o := Ofs(m);
for k:=1 to rows do
begin
for n := 1 to cols do
begin
p := memw[s:o + ((k-1)*cols + (n-1))*sizeofInteger];
Write(p:5);
end;
WriteLn;
end;
end;
procedure FillMatrics(var m; const rows, cols: Integer);
var k,n, p: Integer;
s, o: Word;
begin
s := Seg(m);
o := Ofs(m);
{Через нетипированный параметр передается только адрес
переменной. Так что нужно вычислять положение
элементов по типу, номеру ряда и числу столбцов}
for k:=1 to rows do
for n := 1 to cols do begin
p := k*100 + n;
(* Вариант - случайными числами *)
{p := Random(1000);}
memw[s:o + ((k-1)*cols + (n-1))*sizeofInteger] := p
end;
end;
var
m1: array[1..3, 1..10] of Integer;
m2: Array[1..5, 1..3] of Integer;
BEGIN
FillMatrics(m1, 3, 10);
WriteLn('Исходная матрица m1 3х10');
Print(m1, 3, 10);
Sort(m1, 3, 10);
WriteLn('Отсортированная матрица m1');
Print(m1, 3, 10);
FillMatrics(m2, 5, 3);
WriteLn('Исходная матрица m2 5х3');
Print(m2, 5, 3);
Sort(m2, 5, 3);
WriteLn('Отсортированная матрица m2');
Print(m2, 5, 3);
END.
5
отлично продумано спасибо!