como obtengo el valor mas chico de un array

como obtengo el valor mas chico de un array

Postby goosfancito » Tue Aug 22, 2023 8:06 am

Hola.
Para no hacer un bucle, puedo usar un eval para obtener la posicion del valor mas chico de un array con respecto a un valor dado?
ejempo:
array:
8
7
10
12
5


valor dado: 3
valor que deberia de obtener: 4
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Postby Antonio Linares » Tue Aug 22, 2023 12:21 pm

Code: Select all  Expand view
function Main()

   local a := { 8, 7, 10, 12, 5 }
   
   ? BuscaPos( a, 3 )

return nil

function BuscaPos( a, nVal )

   local nResult
   
   AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < n, nResult := AScan( a, n ) - 1,), n > nVal } )
   
return nResult
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: como obtengo el valor mas chico de un array

Postby goosfancito » Tue Aug 22, 2023 1:01 pm

gracias

veo que me falta muchisimo para aprender a utilizar estas funciones. gracias.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Postby Willi Quintana » Tue Aug 22, 2023 2:41 pm

Buenos dias amigos, esto para obtener el valo minimo de una array
Code: Select all  Expand view

Function AMIN(aDats, lCero, nIni, nPos)
local nMin := 0
DEFAULT lCero := .t.
DEFAULT nINi  := 1
DEFAULT nPos  := 0
IF VALTYPE(aDats) <> "A"
  Return(0)
EndIf
nPos := If(nPos = 0, LEN(aDats), nPos)
nMin := aDats[nIni]
If lCero
   AEVAL(aDats, {|xEl| nMin := IF(VALTYPE(xEl) = "N", IF(xEl < nMin, xEl, nMin), nMin)}, nIni, nPos )
  Else
   AEVAL(aDats, {|xEl| nMin := IF(VALTYPE(xEl) = "N" .AND. xEl <> 0, IF(xEl < nMin, xEl, nMin), nMin)}, nIni, nPos )
EndIf
Return(nMin)
 
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: como obtengo el valor mas chico de un array

Postby goosfancito » Wed Aug 23, 2023 5:21 pm

Gracias a ambos.

tomo como ejemplo este:
AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < n, nResult := AScan( a, n ) - 1,), n > nVal } )

en mi caso "n" voy a usarlo asi: cToD(a:cargo["fecha"])


Mi consulta: para que el codigo no quede tan largo como:
Code: Select all  Expand view
AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < cToD(a:cargo["fecha"]), nResult := AScan( a, cToD(a:cargo["fecha"]) ) - 1,), cToD(a:cargo["fecha"]) > nVal } )


Hay alguna manera que cuando defina la variable, o sea en { |n, nPos |}, puda indicar que n es cToD(a:cargo["fecha"])?

gracias
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Postby Antonio Linares » Wed Aug 23, 2023 5:48 pm

AScan( ASort( AClone( a ) ), { | n, nPos | n := cToD(a:cargo["fecha"]), If( nVal < n, nResult := AScan( a, n) ) - 1,), cToD(n) > nVal } )

estás seguro de que ese código te funciona bien ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: como obtengo el valor mas chico de un array

Postby goosfancito » Thu Aug 24, 2023 7:49 am

Code: Select all  Expand view
METHOD BuscaPos( a, nVal ) CLASS TAbm

   LOCAL nResult:= 0
   LOCAL cMenor:= ""

   IF Len( a ) > 0

      AScan( ASort( AClone( a ) ), ;
             { | n, nPos | ;
               IF( nVal < CToD( n:cargo[ "fecha" ] ), ;
                   ( cMenor:= n:cargo["fecha"], nResult := AScan( a, {|o| o:cargo["fecha"] ==cMenor}) - 1 ) , ), ;
               CToD( n:cargo[ "fecha" ] ) > nVal } )
   ENDIF

   RETURN nResult
 

Asi si me funciona Antonio.
Last edited by goosfancito on Thu Aug 24, 2023 8:06 am, edited 1 time in total.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Postby Antonio Linares » Thu Aug 24, 2023 7:56 am

lo cual quiere decir que ascan(a, n:cargo["fecha"]) esta devolviendo cero

Por lo que veo, estas usando objetos en vez de números, por eso AScan() devuelve cero, no encuentra lo que buscas

Prueba con AScan( a, { | o | o:Cargo[ "fecha" ] == n:Cargo[ "fecha" ] } )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: como obtengo el valor mas chico de un array

Postby goosfancito » Thu Aug 24, 2023 8:07 am

Code: Select all  Expand view
METHOD BuscaPos( a, nVal ) CLASS TAbm

   LOCAL nResult:= 0
   LOCAL cMenor:= ""

   IF Len( a ) > 0

      AScan( ASort( AClone( a ) ), ;
             { | n, nPos | ;
               IF( nVal < CToD( n:cargo[ "fecha" ] ), ;
                   ( cMenor:= n:cargo["fecha"], nResult := AScan( a, {|o| o:cargo["fecha"] ==cMenor}) - 1 ) , ), ;
               CToD( n:cargo[ "fecha" ] ) > nVal } )
   ENDIF

   RETURN nResult


Asi me funciona Antonio.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Postby goosfancito » Thu Aug 24, 2023 8:09 am

Porque quiero hacer esto?
porque quiero insertar el nuevo item que se crea por sobre o debajo de la fecha inmediata (menor o mayor) entonces con esto
me livero estar "ordenando" el tree.

ya voy a postear el cambio en el github
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: como obtengo el valor mas chico de un array

Postby Antonio Linares » Thu Aug 24, 2023 8:55 am

me alegro que sigas avanzando :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 80 guests