REVELAR

Fórum procedure para deslocar elementos de uma array #333632

24/11/2006

0

Estou tentando fazer uma procedure que desloque os elementos de uma array para a esquerda de modo que todos os números diferentes de -1 fiquem na frente. O código está abaixo e no final eu explico o problema.

procedure TForm1.Button1Click(Sender: TObject);
var p:array[1..14] of integer;
    i,j:integer;
begin
   Memo1.Lines.Clear;
   //Preenche a array com valores padrão. Mais tarde esses
   //valores serão preenchidos via consulta do BD.
   p[1] := 35; p[2] := 36; p[3] := 37; p[4] := -1; p[5] := 2;
   p[6] := -1; p[7] := 41; p[8] := 42; p[9] := 43; p[10] := 93;
   p[11] := -1; p[12] := -1; p[13] := -1; p[14] := -1;
   //Ficou assim: p=(35,36,37,-1,2,-1,41,42,43,93,-1,-1,-1,-1);
   //Mostra na tela a variável
   Memo1.Lines.Add(IntToStr(p[1])+´,´+IntToStr(p[2])+´,´+IntToStr(p[3])+´,´+
     IntToStr(p[4])+´,´+IntToStr(p[5])+´,´+IntToStr(p[6])+´,´+
     IntToStr(p[7])+´,´+IntToStr(p[8])+´,´+IntToStr(p[9])+´,´+
     IntToStr(p[10])+´,´+IntToStr(p[11])+´,´+IntToStr(p[12])+´,´+
     IntToStr(p[13])+´,´+IntToStr(p[14]));
   //Agora eu tenho que deslocar os números na array para que
   //Todos os números diferentes de -1 fiquem juntos.
   for i:=1 to 13 do
   if p[i]=-1 then
   for j:=i+1 to 14 do
   p[j-1] := p[j];
   //Mostra na tela o resultado
   Memo1.Lines.Add(IntToStr(p[1])+´,´+IntToStr(p[2])+´,´+IntToStr(p[3])+´,´+
     IntToStr(p[4])+´,´+IntToStr(p[5])+´,´+IntToStr(p[6])+´,´+
     IntToStr(p[7])+´,´+IntToStr(p[8])+´,´+IntToStr(p[9])+´,´+
     IntToStr(p[10])+´,´+IntToStr(p[11])+´,´+IntToStr(p[12])+´,´+
     IntToStr(p[13])+´,´+IntToStr(p[14]));end;


Esse código funciona perfeitamente com exceção de uma condição. Se eu tiver dois elementos -1 juntos a rotina já não funciona. Isso porque ela puxa o -1 para trás e na próxima passada do for ela verifica o próximo elemento. Então eu estou tentando montar a procedure de modo que ela também funcione para a seguinte array:

   p[1] := 35; p[2] := 36; p[3] := 37; p[4] := -1; p[5] := -1;
   p[6] := -1; p[7] := 41; p[8] := 42; p[9] := 43; p[10] := 93;
   p[11] := -1; p[12] := -1; p[13] := -1; p[14] := -1;
   //Ficaria assim: p=(35,36,37,-1,-1,-1,41,42,43,93,-1,-1,-1,-1);
   //MUDEI O P[5] de 2 para -1.


Alguém pode me ajudar?


Djorius

Djorius

Responder

Posts

24/11/2006

Djorius

eu já sabia que o que eu estava fazendo era algo muito parecido com o método bubble sort. por via das dúvidas, fui num site e descobri que estava fazendo o algoritmo errado. agora já está funcionando. ficou assim:

//Adicionei uma variável t:integer na procedure
   for i:=High(p) downto Low(p) do
   for j := Low(p)+1 to i do
   if ((p[j-1]<>-1) or (p[j]<>-1)) and (p[j-1]=-1) then
   begin
      t := p[j-1];
      p[j-1] := p[j];
      p[j] := t;
   end;


a dúvida que resta é a seguinte: é possível implementar esse algoritmo dentro de uma stored procedure do firebird 1.5? qualquer ajuda é bem vinda.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar