program MatrixProcessing;

{$MODE DELPHI}

uses
  SysUtils;

const
  N = 6;  // строки
  M = 7;  // столбцы

type
  TMatrix = array[1..N, 1..M] of Real;

// процедура заполнения матрицы
procedure FillMatrix(var Matrix: TMatrix);
var
  i, j: Integer;
begin
  Randomize;
  for i := 1 to N do
    for j := 1 to M do
      Matrix[i, j] := Random * 100; // числа от 0 до 100
end;

// процедура вывода матрицы на экран
procedure PrintMatrix(const Matrix: TMatrix; const Caption: string);
var
  i, j: Integer;
begin
  Writeln(Caption);
  for i := 1 to N do
  begin
    for j := 1 to M do
      Write(Matrix[i, j]:8:2);
    Writeln;
  end;
  Writeln;
end;

// функция поиска минимального элемента в строке и его индекса столбца
function FindMinInRow(const Row: array of Real; RowSize: Integer): Integer;
var
  i, MinIndex: Integer;
  MinValue: Real;
begin
  MinIndex := 0;
  MinValue := Row[0];
  for i := 1 to RowSize - 1 do
    if Row[i] < MinValue then
    begin
      MinValue := Row[i];
      MinIndex := i;
    end;
  Result := MinIndex + 1; // +1 тк индексы в массиве начинаются с 0, а в матрице — с 1
end;

// процедура поиска наибольшего среди минимальных элементов строк и его индексов
procedure FindMaxAmongMins(const Matrix: TMatrix; var RowIndex, ColIndex: Integer);
var
  i: Integer;
  CurrentMinCol: Integer;
  CurrentMin, MaxAmongMins: Real;
begin
  MaxAmongMins := -MaxInt; // начальное значение очень маленькое число

  for i := 1 to N do
  begin
    // создаём временный массив для строки
    CurrentMinCol := FindMinInRow(Matrix[i], M);
    CurrentMin := Matrix[i, CurrentMinCol];

    if CurrentMin > MaxAmongMins then
    begin
      MaxAmongMins := CurrentMin;
      RowIndex := i;
      ColIndex := CurrentMinCol;
    end;
  end;
end;

// процедура сортировки матрицы по убыванию 
procedure SortMatrixDescending(var Matrix: TMatrix);
var
  FlatArray: array of Real;
  i, j, k: Integer;
  Temp: Real;
begin
  // преобразуем матрицу в одномерный массив
  SetLength(FlatArray, N * M);
  k := 0;
  for i := 1 to N do
    for j := 1 to M do
    begin
      FlatArray[k] := Matrix[i, j];
      Inc(k);
    end;

  // сортировка пузырьком
  for i := 0 to High(FlatArray) - 1 do
    for j := 0 to High(FlatArray) - i - 1 do
      if FlatArray[j] < FlatArray[j + 1] then
      begin
        Temp := FlatArray[j];
        FlatArray[j] := FlatArray[j + 1];
        FlatArray[j + 1] := Temp;
      end;

  // возвращаем отсортированные значения в матрицу
  k := 0;
  for i := 1 to N do
    for j := 1 to M do
    begin
      Matrix[i, j] := FlatArray[k];
      Inc(k);
    end;
end;

var
  Matrix: TMatrix;
  RowIndex, ColIndex: Integer;

begin
  try
    // заполняем матрицу
    FillMatrix(Matrix);

    // выводим исходную матрицу
    PrintMatrix(Matrix, 'Original matrix:');

    // находим наибольший среди минимальных элементов строк
    FindMaxAmongMins(Matrix, RowIndex, ColIndex);
    Writeln('The largest among the minimum elements is in the row ',
            RowIndex, ', col ', ColIndex, '.');
    Writeln('Value: ', Matrix[RowIndex, ColIndex]:8:2);
    Writeln;

    // сортируем матрицу по убыванию
    SortMatrixDescending(Matrix);

    // выводим отсортированную матрицу
    PrintMatrix(Matrix, 'Matrix after sorting in descending order:');

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  Readln; 
end.
