Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2008, 02:27   #1
sergey31
Пользователь
 
Аватар для sergey31
 
Регистрация: 27.04.2008
Сообщений: 24
По умолчанию Сортировка[Delphi]

Здравствуйте. Помогите понять в чем ошибка, смысл программы - это иллюстрация процесса сортировки 2-d массива. Программа должна упорядочивать массив по возрастанию элементов строк(по нажатию на кнопку попарно меняет 2 элемента в массиве, расположенные рядом, когда строка отсортирована, переходит на следующую и т.д).
Код:
procedure TForm1.Button2Click(Sender: TObject);
  begin
  if k=0 then i:=i+1;{если кол-во обменов = 0, переходим на сл. строку}
    j:=j+1;{обходим все элементы строки}
    if j=n then j:=1;{n-длина строки}
    if p[i,j]>p[i,j+1] then{непосредственно сама сортировка}
      begin
        t := p[i,j];
        p[i,j]:= p[i,j+1];
        p[i,j+1]:= t;
        k:=k+1;{кол-во обменов выполняемых при сортировке}
      end;
    StringGrid1.Cells[j,i]:=inttostr(p[i,j]);
    StringGrid1.Cells[j+1,i]:=inttostr(p[i,j+1]);
  end;
sergey31 вне форума Ответить с цитированием
Старый 27.05.2008, 05:45   #2
yourself
Пользователь
 
Аватар для yourself
 
Регистрация: 10.11.2007
Сообщений: 38
По умолчанию

Вообще-то, сортировка массивов - избитая тема. Специально для Вас программа сортировки 2d-массива:
Код:
~~~
var
  Form1: TForm1;
  b:integer; a:array [0..4,0..4] of integer; ab:array[0..4] of integer;


procedure TForm1.FormCreate(Sender: TObject);
var x,y:integer;
begin
randomize;
StringGrid1.FixedRows:=0;
StringGrid1.FixedCols:=0;
button1.Caption:='Sort';
//заливаем числа в массив
for x:=0 to 4 do
for y:=0 to 4 do
a[x,y]:=random(10);
//выводим массив в таблицу
for x:=0 to 4 do
for y:=0 to 4 do
StringGrid1.Cells[x,y]:=inttostr(a[y,x]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,j,x,y:integer;
begin
//сортируем числа в столбцах массива
for y:=0 to length(a)-1 do
for i:=0 to length(a)-2 do
for j:=i+1 to length(a)-1 do
if a[y,i]>a[y,j] then
begin
b:=a[y,j];
a[y,j]:=a[y,i];
a[y,i]:=b;
end;
//сортируем сами столбцы по первому числу
for i:=0 to length(a)-2 do
for j:= i+1 to length(a)-1 do
if a[i,0]>a[j,0] then
begin
for y:=0 to length(a)-1 do
ab[y]:=a[j,y];
for y:=0 to length(a)-1 do
a[j,y]:=a[i,y];
for y:=0 to length(a)-1 do
a[i,y]:=ab[y];
end;
//выводим результат
for x:=0 to 4 do
for y:=0 to 4 do
StringGrid1.Cells[x,y]:=inttostr(a[y,x]);
end;

end.
Следует обратить внимание, что в данной программе массив выводится в строку таким образом, что первый столбец массива является последней строкой таблицы, второй - предпоследней и т.д. Если нужно вывести массив как есть, то строку
Цитата:
StringGrid1.Cells[x,y]:=inttostr(a[y,x]);
следует везде заменить на
Код:
StringGrid1.Cells[x,y]:=inttostr(a[x,y]);
yourself вне форума Ответить с цитированием
Старый 27.05.2008, 16:27   #3
sergey31
Пользователь
 
Аватар для sergey31
 
Регистрация: 27.04.2008
Сообщений: 24
По умолчанию

yourself
Спасибо конечно, но я не просил Вас писать мне готовый код, а попросил указать на ошибку.
Цитата:
смысл программы - это иллюстрация процесса сортировки 2-d массива.
- а то что написали Вы - это вывод конечного результата.
sergey31 вне форума Ответить с цитированием
Старый 27.05.2008, 16:46   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Sergey31, у Вас k рано проверяется. Нужно проверять его когда закончен проход по строке.
alexBlack вне форума Ответить с цитированием
Старый 27.05.2008, 17:13   #5
sergey31
Пользователь
 
Аватар для sergey31
 
Регистрация: 27.04.2008
Сообщений: 24
По умолчанию

Исправил, но все равно обмен элементов не происходит...
Код:
begin
  j:=j+1;
if j=b then
    begin
      if k=0 then i:=i+1;
      j:=1;
    end;
if p[i,j]>p[i,j+1] then
  begin
    t:=p[i,j];
    p[i,j]:=p[i,j+1];
    p[i,j+1]:=t;
    k:=k+1;
  end;
  StringGrid1.Cells[j,i]:=inttostr(p[i,j]);
  StringGrid1.Cells[j+1,i]:=inttostr(p[i,j+1]);
end;
С самого начала переменные j,k=0, i=1;

Последний раз редактировалось sergey31; 27.05.2008 в 17:14. Причина: Очепятки
sergey31 вне форума Ответить с цитированием
Старый 27.05.2008, 17:39   #6
yourself
Пользователь
 
Аватар для yourself
 
Регистрация: 10.11.2007
Сообщений: 38
По умолчанию

Позвольте задать некоторые дополнительные вопросы
1)что такое b?
2)с какого индекса начинается массив?
3)сколько строк и столбцов в массиве?
yourself вне форума Ответить с цитированием
Старый 27.05.2008, 17:46   #7
sergey31
Пользователь
 
Аватар для sergey31
 
Регистрация: 27.04.2008
Сообщений: 24
По умолчанию

Пожалуйста:
1. b - размерность массива по строкам.(длина строки).
2. И по строкам, и по столбцам индекс массива начинается с единицы.
3. 6 строк, 6 столбцов.
sergey31 вне форума Ответить с цитированием
Старый 27.05.2008, 18:15   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Признак перестановок нужно обнулять в конце строки:

Код:
  j:=j+1;
  if j = b then begin
     if k = 0 then i := i+1;
     j:=1; k := 0;
  end;
по-моему для демонстрации неплохо было-бы на каждом шаге выделять ячейки, между которыми сделан обмен. Иначе трудно отследить что изменилось.

и еще не проверяется выход i за границы массива.
alexBlack вне форума Ответить с цитированием
Старый 27.05.2008, 18:20   #9
yourself
Пользователь
 
Аватар для yourself
 
Регистрация: 10.11.2007
Сообщений: 38
По умолчанию

Если b>2, то Ваш код не подходит по причине того, что при каждом нажатии кнопки меняются местами только два элемента в одной строке. При следующем нажатии кнопки местами будут меняться следующие 2 элемента в следующей строке. Чтобы сразу отсортировать весь массив, следует использовать циклы с параметрами.
yourself вне форума Ответить с цитированием
Старый 27.05.2008, 18:35   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от yourself Посмотреть сообщение
Если b>2, то Ваш код не подходит по причине того, что при каждом нажатии кнопки меняются местами только два элемента в одной строке. При следующем нажатии кнопки местами будут меняться следующие 2 элемента в следующей строке. Чтобы сразу отсортировать весь массив, следует использовать циклы с параметрами.
Не в следующей, а в этой же, т.к. i мы меняем только когда j=b, да еще и k = 0 (т.е. перестановок в текущей строке не было).

А что автор вопроса скажет ?
Кстати, в моем тестовом примере код отлично работает.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка в STL xz121 Общие вопросы C/C++ 3 09.06.2008 19:30
Delphi: Сортировка строк в StringGrid, критерий - элемент ячейки Andris Помощь студентам 9 09.03.2008 23:04
Сортировка fedya Помощь студентам 3 26.11.2007 18:24
1. Сортировка Шелла по убыванию 2. Сортировка вставками по убыванию Arkuz Помощь студентам 1 25.09.2007 17:16