|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Сортировка двумерного массива методом пузырька delphi 11
массив 5*5 заполнен рандомными числами заполнение неинтересно т.к сделал а вот сортировка не получается ошибка range cheсk error для циклов разные значения пробовал и 5 и 6 и 7 только с 4 работает но тогда сортирует не до конца, а и вывод нужен в стриггрид
вот код Код:
procedure TForm1.Button2Click(Sender: TObject); begin var i,j, k, x :integer; for k := 1 to 5*5 do for i := 1 to 5 do for j := 1 to 5 do begin if (i <> 5) and (j <> 5) then begin if table[i, j + 1] > table[i,j] then begin x := table[i, j + 1]; table[i, j + 1] := table[i,j]; table[i, j] := x; end; end else if (1 <> p - 1) and (table[i + 1, j] > table[i,j])then begin x := table[i + 1, j]; table[i + 1, j] := table[i,j]; table[i, j] := x; end; end; with stringgrid2 do begin colcount:= p + 1; rowcount := p + 1; for i := 1 to p do for j := 1 to p do begin cells[i,j]:= inttostr(table[i,j]); end; end; end; lmikle: пользуемся тегами для оформления Последний раз редактировалось lmikle, 29.11.2023 в 05:30. |
#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. |