Дана матрица. Упорядочить ее строки по убыванию первых элементов строк, если это возможно.с помощью динамических переменных — Pascal(Паскаль)

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.

Leave a Comment

− 1 = 1