procedure para deslocar elementos de uma array
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.
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:
Alguém pode me ajudar?
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
Curtidas 0
Respostas
Djorius
24/11/2006
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:
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.
//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.
GOSTEI 0