Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Незаконченная сортировка


Автор: Kanes 4.12.2006, 22:15
Здравствуйте, у меня возникает проблема при сортировке двумерного массива (матрицы).
Сортирую строки по такому принципу: для каждой строки есть свой характеристика - сумма четных положительных элементов, вот и надо мне отсортировать строки по возрастанию этой характеристки, но сортировка происходит не до конца (PS компилятор никакой ошибки не выдает)
Вот кусок кода с сортировкой:
Код

for i:= 0 to n-1 do
   for j :=0 to (n-1)-i do
      if GetDescription(j) > GetDescription(j+1) then
        for k:= 0 to m do
           begin
              temp:= matrix[j+1, k];
              matrix[j+1, k]:= matrix[j, k];
              matrix[j, k]:= temp;
           end;

GetDescription - ф-ция получения хар-ки строки, ее код:
Код

function GetDescription (index: integer): integer;
var
   a: integer;
   Result: integer;
begin
   a:= 0;
   Result:= 0;
   for a := 0 to m do
     if a mod 2 = 0 then
       if matrix[index, a] > 0 then
        Result:= Result + matrix[index, a];
GetDescription:= Result;
end;

Уважаемые форумчане плиз помогите smile 

Автор: volvo877 4.12.2006, 22:37
Это у тебя, надо понимать, "пузырек"?

Что-то не то в нем... Вот так не лучше сделать?
Код
for i:= 0 to n-1 do
   for j := n-1 downto i + 1 do
      if GetDescription(j) > GetDescription(j+1) then
        for k:= 0 to m do
           begin
              temp:= matrix[j+1, k];
              matrix[j+1, k]:= matrix[j, k];
              matrix[j, k]:= temp;
           end;

Автор: Kanes 4.12.2006, 23:37
volvo877, проблема остается, я пробовал разные исполнения "пузырька", дело мне кажется в этой строке:
Код

if GetDescription(j) > GetDescription(j+1) then

Я для проверки вместо этой строки, как условие пробовал сортировать, например, относительно первого элемента строки, и все работает нормально smile 

Автор: Kanes 5.12.2006, 17:37
Народ, может быть у кого-нить есть другие идеи как решить эту задачу?

Автор: Zero 5.12.2006, 18:45
Цитата(Kanes @  5.12.2006,  00:37 Найти цитируемый пост)
дело мне кажется в этой строке

Дело, то может и в этой строке, т.к. судя повсему, в ней нету учёта, конца, т.е. учёта того когда в конце j+1 элемент будет браться из не существующего элемента матрицы.
Но тебе не легче было бы дать полный код программы как ты решал, чтобы нам не набирать и не выдумывать, то как он у тебя находиться. И более чётко написать само задание.

Автор: Kanes 5.12.2006, 21:32
 Задание было дано именно так, а полная программа от приведенного кода отличается только наличием вывода матрицы, и еще заполнения массива случайным образом.
 Проблема решена, спасибо всем, кто пытался помочь.
 Собственно 2 ошибки:
1) Используя код volvo877, обнаружил ошибку
Код

for i:= 0 to n-1 do
   for j := n-1 downto i + 1 do // имхо нужно писать i, а не (i+1), иначе индекс j+1 при макс i вылезет за границы массива
      if GetDescription(j) > GetDescription(j+1) then
        for k:= 0 to m do
           begin
              temp:= matrix[j+1, k];
              matrix[j+1, k]:= matrix[j, k];
              matrix[j, k]:= temp;
           end;

2) А самая главная ошибка в функции GetDescription(), в задании ф-ция ищет сумму четных положительных элементов, а на практике получается нечетных, все из-за того, что индекс массива у меня начинается с нуля, следовательно, надо в ф-ции считать сумму нечетных элементов, т.е.
Код

function GetDescription (index: integer): integer;
var
   a: integer;
   Result: integer;
begin
   a:= 0;
   Result:= 0;
   for a := 0 to m do
     if a mod 2 <> 0 then // вместо a mod 2 = 0
       if matrix[index, a] > 0 then
        Result:= Result + matrix[index, a];
GetDescription:= Result;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)