Program xa;
Uses
crt;
Type
_Type=integer; {Тип хранимой информации в матрице}
Tmas=array [1..1] of _Type; {Массив _Type размерностью [1..1]}
Pmas=^Tmas; {Указатель на одномерный массив}
Tmatr=array [1..1] of Pmas; {Массив указателей }
Matr=^Tmatr; {Указатель на массив указателей}
Const
N=5;
M=3;
Var
a:Matr;
i,j:integer;
begin
{$R-}
{Отключаем проверку выхода за диапазон}
Randomize;
GetMem(a,sizeof(Tmatr)*n); {Выделяем память для указателей на строки}
for i:=1 to n do
GetMem(a^[i],sizeof(Tmas)*m); {Выделяем память под элементы в каждой строке}
for i:=1 to n do
for j:=1 to n do
a^[i]^[j]:=random(100); {Заполняем матрицу случайными числами в диапазоне
от 0 до 99}
clrscr;
Writeln('MatpuL/a Pe3mepHoCT''I-O ',N,'x',M,' :');
for i:=1 to n do
begin
for j:=1 to m do
Write(a^[i]^[j],' '); {выводим матрицу}
Writeln
end;
readln;
for i:=1 to n do
FreeMem(a^[i],sizeof(Tmas)*m); {Освобождаем память в порядке, обратном выделению,
т.е. сначала из под элементов каждой строки}
FreeMem(a,sizeof(Tmatr)*n); {А потом и из под указателей на каждую строку.}
{$R+}
end.
Вариант 2
uses crt;
{$R-}
const n=10;
type
Tmas=^TTmas;{одна строка матрицы}
TTmas=array[1..1] of integer;
Tmatr=^TTmatr;{матрица-массив указателей на строки}
TTmatr=array[1..1] of Tmas;
var
a:Tmatr;
i,j,k:integer;
x:integer;{буфер для обмена при сортировке}
begin
clrscr;
randomize;
getmem(a,sizeof(TTmas)*n*2);{выделяем память под указатели на строки}
{поскольку сортируем в двух циклах, нужно в 2 раза больше памяти}
for i:=1 to n do
getmem(a^[i],sizeof(integer)*n);{для каждой строки память для хранения данных}
writeln ('Исходная матрица:');
for i:=1 to n do
begin
for j:=1 to n do
begin
a^[i]^[j]:=random(50);
write(a^[i]^[j]:4);
end;
writeln;
end;
write('Press Enter...');
readln;
for i:=1 to n-1 do
for k:=i+1 to n do
if a^[i]^[1]<a^[k]^[1] then{сравниваем первые элементы строк}
for j:=1 to n do
begin
x:=a^[i]^[j];
a^[i]^[j]:=a^[k]^[j]; {сортируем столбцы прямым обменом параллельно с первым}
a^[k]^[j]:=x;
end;
writeln('Отсортированная матрица:');
for i:=1 to n do
begin
for j:=1 to n do
write(a^[i]^[j]:4);
writeln;
end;
write('Press Enter...');
for i:=1 to n do
freemem(a^[i],sizeof(integer)*n); {освобождаем память в обратном порядке, сначала удалим строки}
freemem(a,sizeof(TTmas)*n*2); {потом указатели на них}
write('Press Enter...');
readln
end.