![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#2
|
|||
|
|||
|
Ошибка "range cheсk error" возникает когда ты пытаешься обратиться к элементу массива за его пределами. Если у тебя массив 5*5, и при цикле
Код:
for i := 1 to 5 do for j := 1 to 5 do Код:
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 Судя по Код:
colcount:= p + 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.Написано конечно на скорую руку. Но это работает и сортирует. Еще не указано как будет сортироваться: только в пределах столбцов, только в пределах строк, сортировка всего массива. Также не указано по возрастанию или убыванию. Последний раз редактировалось Vladimr, 28.11.2023 в 22:45. |