BlackTDN Search

quarta-feira, 21 de janeiro de 2009

Protheus :: Programação Básica em Advpl “Combo XL”

Classificando um Array Unidimensional e Bidimensional:

Da mesma forma que podemos passar um bloco para aScan(), também podemos passar um bloco para aSort(). A função aSort() classifica o Array passada por parâmetro, na ordem ascendente, mas, em substituição, podemos passar para ela um bloco de codificação para fazer a comparação. Quando fizermos isso, em vez de aSort() comparar os elementos internamente, ela passará para o Bloco de Codificação os dois elementos necessários para a comparação. A avaliação do Bloco, então, retornará verdadeiro se os dois elementos estiverem classificados em ordem; caso contrário, retornará falso. Quando o Bloco retornar falso, aSort() trocará os dois elementos.

É importante observar que aSort() passa o elemento com o número mais baixo do Array como primeiro parâmetro do bloco; desta forma, saberemos quem é quem! É igualmente importante notar que não teremos conhecimento dos dois elementos que estaremos comparando; só saberemos que o primeiro parâmetro é um elemento com número menor do que o segundo. aSort() assegura a classificação do Array, determina os elementos a comparar e sabe quando a classificação termina.

Para classificar um Array Unidimensional em ordem ascendente a passagem do bloco é opcional. Mas, para ordená-lo em ordem descendente, teremos passar o bloco informado a regra para a classificação:

Exemplos de classificação de Array unidimensional

Local aNomes := {;
“Vinicius”,;
“Aline”,;
“Marinaldo”,;
“Michele”,;
“Camara”,;
“Andre”,;
“Valeria”,;
“João”,;
“Adriana”;
}
Local aSvNomes := aClone( aNomes ) //Efetua a cópia do array
Local bSort

//Mostrando as informações do Array no Console
ConOut( “Lista de Nomes nao ordenados” )
ConOut( “” )
aEval( aNomes , { |cNome| ConOut( cNOme ) } )
ConOut( “” )

//Ordenando o Array Unidimensional em ordem ascendente sem
//utilizar o Bloco de Codificação:
aSort( aNomes )

//Mostrando as informações do Array no Console
ConOut( “Lista de Nomes ordenados sem Bloco” )
ConOut( “” )
aEval( aNomes , { |cNome| ConOut( cNOme ) } )
ConOut( “” )

aNomes := aClone( aSvNomes ) //Restaurando aNomes

//Mostrando as informações do Array no Console
ConOut( “Lista de Nomes nao ordenados” )
ConOut( “” )
aEval( aNomes , { |cNome| ConOut( cNOme ) } )
ConOut( “” )

//Monta Bloco para Classificação em Ordem Ascendente
bSort := { |x,y| x < y }
aSort( aNomes , NIL , NIL , bSort )

//Mostrando as informações do Array no Console
ConOut( “Lista de Nomes ordenados ( asc ) utilizando Bloco” )
ConOut( “” )
aEval( aNomes , { |cNome| ConOut( cNOme ) } )
ConOut( “” )

//Monta Bloco para Classificação em Ordem Descendente
bSort := { |x,y| x > y }
aSort( aNomes , NIL , NIL , bSort )

//Mostrando as informações do Array no Console
ConOut( “Lista de Nomes ordenados ( desc ) utilizando Bloco” )
ConOut( “” )
aEval( aNomes , { |cNome| ConOut( cNOme ) } )
ConOut( “” )

aNomes := aClone( aSvNomes ) //Restaurando a Nomes

//Mostrando as informações do Array no Console
ConOut( “Lista de Nomes nao ordenados” )
ConOut( “” )
aEval( aNomes , { |cNome| ConOut( cNOme ) } )
ConOut( “” )

//Ordenando o Array em ordem Ascendente considerando apenas //alguns elementos
aSort( aNomes , 1 , 3 , { |x,y| x < y } )
//Mostrando as informações do Array no Console
ConOut( “Lista de Nomes Ordenados. Elem 1 a 3” )
ConOut( “” )
aEval( aNomes , { |cNome| ConOut( cNOme ) } )
ConOut( “” )

Exemplos de classificação de Array Bidimensional:

Local aStru := {;
{ "SNome" , "C" , 10 , 0 },;
{ "PNome" , "C" , 10 , 0 },;
{ "Ender1" , "C" , 30 , 0 },;
{ "Ender2" , "C" , 40 , 0 } ;
}
Local aSvStru := aClone( aStru ) //Efetua a cópia do array
Local bSort

/Mostrando as informações do Array no Console
ConOut( "Lista nao ordenada" )
ConOut( “” )
aEval( aStru , { |aElem| ConOut( aElem[1] ) } )
ConOut( “’ )

//Definindo bloco para ordenacao ascendente
bSort := { |x,y| x[1] < y[1] }

//Ordenando Array
aSort( aStru , NIL , NIL , bSort )

//Mostrando as informações do Array no Console
ConOut( "Lista ordenada ascendente" )
ConOut( "" )
aEval( aStru , { |aElem| ConOut( aElem[1] ) } )
ConOut( "" )

//Definindo bloco para ordenacao descendente
bSort := { |x,y| x[1] > y[1] }

//Ordenando Array
aSort( aStru , NIL , NIL , bSort )

//Mostrando as informações do Array no Console
ConOut( "Lista ordenada descendente" )
ConOut( “” )
aEval( aStru , { |aElem| ConOut( aElem[1] ) } )
ConOut( “” )

Nenhum comentário:

Postar um comentário