Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.11.2023, 17:53
Kartem Kartem вне форума
Прохожий
 
Регистрация: 28.11.2023
Сообщения: 3
Версия Delphi: delphi 11
Репутация: 10
Восклицание Сортировка двумерного массива методом пузырька 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  
Старый 28.11.2023, 22:34
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 44
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ошибка "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 никак дальше не меняется.
Судя по
Код:
colcount:= p + 1;
Р это количество элементов (в данном случае 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.

Написано конечно на скорую руку. Но это работает и сортирует.
Еще не указано как будет сортироваться: только в пределах столбцов, только в пределах строк, сортировка всего массива. Также не указано по возрастанию или убыванию.

Последний раз редактировалось Vladimr, 28.11.2023 в 22:45.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter