Ошибка "range cheсk error" возникает когда ты пытаешься обратиться к элементу массива за его пределами. Если у тебя массив 5*5, и при цикле
Код:
for i := 1 to 5 do
for j := 1 to 5 do
ты пытаешься обратиться к элементу массива №6
Код:
if table[i, j + 1] > table[i,j] then
Вот здесь ты исключаешь только последний элемент
Код:
if (i <> 5) and (j <> 5) then
А надо
Код:
if (i <> 5) OR (j <> 5) then
Чтобы исключало последнюю строку и столбец
или сделай проще Вместо
Код:
for i := 1 to 5 do
for j := 1 to 5 do
Укажи
Код:
for i := 1 to 4 do
for j := 1 to 4 do
А это у тебя работает? Вообще не должно запуститься
Код:
begin
var i,j, k, x :integer;
У тебя в этом месте
Код:
else if (1 <> p - 1) and (table[i + 1, j] > table[i,j])then
тоже будет ошибка т.к. значение P никак дальше не меняется.
Судя по
Р это количество элементов (в данном случае 5), тогда if (1 <> p - 1) будет всегда "True" потому что 1<>5-1 всегда
Рабочий вариант программы
Код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids;
type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
Button2: TButton;
StringGrid2: TStringGrid;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const cou=5; //размерность массива
var
Form1: TForm1;
table:array [1..cou,1..cou] of integer; //таблица значений
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); //сортировка методом пузырька
var i,j:integer; //для прохождения массива
p:integer; //для метода пузырька
b:integer; //для обмена
a:integer; // для сортировки всего массива
begin
for a := 1 to cou do {сортировка методом пузырька всего массива}
begin
{сортировка методом пузырька только по столбцам}
for p := 1 to cou do
for i:=1 to cou do
for j:=1 to cou-1 do
if table[i,j]>table[i,j+1] then
begin {Обмен элементов}
b:=table[i,j];
table[i,j]:=table[i,j+1];
table[i,j+1]:=b;
end;
{}
{сортировка методом пузырька только по строкам}
for p := 1 to cou do
for i:=1 to cou-1 do
for j:=1 to cou do
if table[i+1,j]>table[i,j] then
begin {Обмен элементов}
b:=table[i,j];
table[i,j]:=table[i+1,j];
table[i+1,j]:=b;
end;
{}
end;
for i:= 1 to cou do for j:= 1 to cou do StringGrid2.Cells[i,j]:=inttostr(table[i,j]); //вывод массива до сортировки
end;
procedure TForm1.Button2Click(Sender: TObject); //заполнение и вывод до сортировки
var i,j:integer;
begin
StringGrid1.RowCount:=cou+1;
StringGrid1.ColCount:=cou+1;
StringGrid2.RowCount:=cou+1;
StringGrid2.ColCount:=cou+1;
randomize;
for i:= 1 to cou do for j:= 1 to cou do table[i,j]:=random(100); //заполнение случайными значениями
for i:= 1 to cou do for j:= 1 to cou do StringGrid1.Cells[i,j]:=inttostr(table[i,j]); //вывод массива до сортировки
end;
end.
Написано конечно на скорую руку. Но это работает и сортирует.
Еще не указано как будет сортироваться: только в пределах столбцов, только в пределах строк, сортировка всего массива. Также не указано по возрастанию или убыванию.