В этом совете рассмотрено решение задачи сортировки матрицы в Delphi.
Условие:
Дана действительная квадратная матрица порядка N. С помощью допустимых преобразований добиться, чтобы один из элементов матрицы, обладающий наибольшим по модулю значением, располагался в левом верхнем углу матрицы.
Общий вид кода:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, XPMan, StdCtrls, Grids;
type
TForm1 = class(TForm)
sg_isx: TStringGrid;
Label1: TLabel;
Button1: TButton;
XPManifest1: TXPManifest;
sg_sort: TStringGrid;
Button2: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
sg_tmp: TStringGrid;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
i,j:Integer;
begin
for i := 0 to 14 do
for j := 0 to 14 do
begin
sg_isx.Cells[i,j] := IntToStr(Random(100) - 50);
sg_sort.Cells[i,j] := sg_isx.Cells[i,j];
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
Var
i,j,k,g:Integer; //пер. для циклов
zn,xzn,yzn:Integer; // пер. для хранения инфо о наибольшем элементе
begin
zn := 0;
//Блок программы определяющий наибольший элемент в матрице
for i := 0 to 14 do
for j := 0 to 14 do
if abs(zn) < abs(StrToInt(sg_sort.Cells[i,j] )) then
begin
zn := StrToInt(sg_sort.Cells[i,j]);
xzn := i;
yzn := j;
end;
Label5.Caption := 'Max abs(' IntToStr(zn) ') [' IntToStr(xzn) ','
IntToStr(yzn) ']';
//Блок программы сортирующий матрицу
//Сортировка по столбцам
for i := 0 to xzn - 1 do
begin
k := xzn - i; //реализация обратного отсчета
for j := 0 to 14 do //сохраняем перемещаемый столбец
sg_tmp.Cells[0,j] := sg_sort.Cells[k,j];
for j := 0 to 14 do //копируем данные из соседнего столбца
sg_sort.Cells[k,j] := sg_sort.Cells[k - 1,j];
for j := 0 to 14 do //вставка столбца из резервной копии
sg_sort.Cells[k - 1,j] := sg_tmp.Cells[0,j];
end;
//Сортировка по строкам
for i := 0 to yzn - 1 do
begin
g := yzn - i; //реализация обратного отсчета
for j := 0 to 14 do //сохраняем перемещаемую строку
sg_tmp.Cells[0,j] := sg_sort.Cells[j, g];
for j := 0 to 14 do //копируем данные из соседней строки
sg_sort.Cells[j,g] := sg_sort.Cells[j, g - 1];
for j := 0 to 14 do //вставка строки из резервнвной копии
sg_sort.Cells[j, g - 1] := sg_tmp.Cells[0,j];
end;
end;
end.
Внешний вид:
Комментариев достаточно, что бы понять алгоритм.
Пока все, удачных проб. Сургай Владмир.