Page 1 of 1

intercept repeated values in an array

PostPosted: Mon Oct 24, 2022 7:41 am
by Silvio.Falconi
I have a cicle :

Code: Select all  Expand view

local nvalore,ntotale,n.k
local nat
local aTmp:={}

nValore := 1
   For n= 1 to 90
        For k= 1 to 90
              nTotale  := EstrattoSumDist(n,k,1)      //sample n+k
                      If  nTotale==nvalore
                               [b] nAt := AScan( aTmp, { |a|  a[1]  = n  .or.  a[2]  = n} )[/b]
                                  if nAt == 0
                                          aadd(aTmp,{n,k})
                                  else
                                        HB_ADel( aTmp, nAt, .t. )
                                 Endif
                  Endif
            next
         next
 


why not run ok ?
it add repeated value into array

Re: intercept repeated values in an array

PostPosted: Mon Oct 24, 2022 3:41 pm
by karinha
Code: Select all  Expand view

// C:\FWH..\SAMPLES\CICLO.PRG

#include "FiveWin.ch"

FUNCTION Main()

   // LOCAL nvalore, ntotale, n.k // <- ERROR.
   LOCAL nvalore, ntotale, n, k
   LOCAL nat
   LOCAL aTmp := {}

   nValore := 0
   ntotale := 0

   FOR n = 1 TO 05 // 90 // Only test

      FOR k = 1 TO 05 //90 // Only test

         nTotale := EstrattoSumDist( n, k, 1 ) //sample n+k

         IF nTotale == nvalore

            nAt := AScan( aTmp, { |a| a[1] = n .OR. a[2] = n } )

            IF nAt == 0

               aAdd( aTmp, { n, k } )

            ELSE

               HB_ADel( aTmp, nAt, .T. )

            ENDIF

         ENDIF

      NEXT k

   NEXT n

RETURN NIL

FUNCTION EstrattoSumDist( n, k, nn )

   // ? n, k, nn

   ? n + k

RETURN NIL

// FIN / END
 


Regards, saludos.

Re: intercept repeated values in an array

PostPosted: Tue Oct 25, 2022 9:07 am
by Silvio.Falconi
karinha wrote:
Code: Select all  Expand view

// C:\FWH..\SAMPLES\CICLO.PRG

#include "FiveWin.ch"

FUNCTION Main()

   // LOCAL nvalore, ntotale, n.k // <- ERROR.
   LOCAL nvalore, ntotale, n, k
   LOCAL nat
   LOCAL aTmp := {}

   nValore := 0
   ntotale := 0

   FOR n = 1 TO 05 // 90 // Only test

      FOR k = 1 TO 05 //90 // Only test

         nTotale := EstrattoSumDist( n, k, 1 ) //sample n+k

         IF nTotale == nvalore

            nAt := AScan( aTmp, { |a| a[1] = n .OR. a[2] = n } )

            IF nAt == 0

               aAdd( aTmp, { n, k } )

            ELSE

               HB_ADel( aTmp, nAt, .T. )

            ENDIF

         ENDIF

      NEXT k

   NEXT n

RETURN NIL

FUNCTION EstrattoSumDist( n, k, nn )

   // ? n, k, nn

   ? n + k

RETURN NIL

// FIN / END
 


Regards, saludos.


your test not run
the array aTmp is Empty

my test

Image

With the sum the nvalore must be min. 3 and not 1 sample 1+2 = 3

as you can see on picture the number 1 and 2 are repeated


Code: Select all  Expand view

#include "fivewin.ch"


Function test()
    local aTmp:={}
    local nAt
    local nTotale
    local nValore := 3

     For n= 1 to 90
        For k= 1 to 90
              nTotale  :=   k+n
              If  nTotale=nvalore
                  /*  nAt := AScan( aTmp, { |a| a[1] = n .or. a[2] = n} )

                 if nAt == 0
                    */

                        aadd(aTmp,{n,k})
                     /* else
                       HB_ADel( aTmp, nAt, .t. )
                     Endif */

                  Endif
            next
         next

      xbrowser aTmp
   return nil
 

Re: intercept repeated values in an array

PostPosted: Tue Oct 25, 2022 9:14 am
by Silvio.Falconi
Now I make another test But I believe it is not correct

Code: Select all  Expand view

Function test()
    local aTmp:={}
    local nAt
    local nTotale
    local nValore := 3

     For n= 1 to 90
        For k= 1 to 90
              nTotale  :=   k+n
              If  nTotale=nvalore
                    nAt := AScan( aTmp, { |a| a[1] = n .or. a[2] = n} )
                                  aadd(aTmp,{n,k,nAt})
                  Endif
            next
         next

//erased repeated

         for t= 1 to len(aTmp)
                  If aTmp[t][3]=0
                       HB_ADel( aTmp, t, .t. )
                    Endif
           next


      xbrowser aTmp
   return nil

 

Re: intercept repeated values in an array

PostPosted: Tue Oct 25, 2022 10:01 am
by cmsoft
Silvio, y crear un nuevo arreglo no?
Code: Select all  Expand view
#include 'fivewin.ch'

Function test()
    local aTmp:={}, aResu := {}
    local nAt
    local nTotale
    local nValore := 9

     For n= 1 to 90
        For k= 1 to 90
              nTotale  :=   k+n
              If  nTotale=nvalore
                    nAt := AScan( aTmp, { |a| a[1] = n .or. a[2] = n} )
                                  aadd(aTmp,{n,k,nAt})
                  Endif
            next
         next

//erased repeated

         for t= 1 to len(aTmp)
                  If aTmp[t][3]=0
                       Aadd( aResu, aTmp[t] )
                    Endif
           next


      xbrowser aResu
   return nil

Re: intercept repeated values in an array

PostPosted: Wed Oct 26, 2022 8:04 am
by Silvio.Falconi
cmsoft wrote:Silvio, y crear un nuevo arreglo no?
Code: Select all  Expand view
#include 'fivewin.ch'

Function test()
    local aTmp:={}, aResu := {}
    local nAt
    local nTotale
    local nValore := 9

     For n= 1 to 90
        For k= 1 to 90
              nTotale  :=   k+n
              If  nTotale=nvalore
                    nAt := AScan( aTmp, { |a| a[1] = n .or. a[2] = n} )
                                  aadd(aTmp,{n,k,nAt})
                  Endif
            next
         next

//erased repeated

         for t= 1 to len(aTmp)
                  If aTmp[t][3]=0
                       Aadd( aResu, aTmp[t] )
                    Endif
           next


      xbrowser aResu
   return nil



As I wrote on private mail the problem is another
for the two dimensional array i solved


Code: Select all  Expand view
For n= 1 to 90
        For k= 1 to 90
              nTotale  := Calc_Ambi_Sum_dist(n,k,ntipo)
              If  nTotale=nvalore
                    nAt := AScan( aTmp, { |a| a[1] = n .or. a[2] = n} )
                    If nAt == 0
                       aadd(aTmp,{n,k})
                    Endif
                  Endif
            next
         next


Code: Select all  Expand view
Function Calc_Ambi_Sum_dist(n1,n2,nTipo)
//---------------------------------------
   local nNum:=0
   local nTemp:=0
   Do case
      case nTipo= 1 // suma ciclométrica      ok
          nTemp:= n1+n2
          If nTemp > 90
            nTemp:= ntemp-90      //el exterior 90
          Endif
       case nTipo= 2 //distancia ciclométrica    ok
          IF n2>n1
             nTemp:= n2-n1
          else
             nTemp:= n1-n2
          Endif
          If nTemp > 45          //   el exterior 45
             nTemp:= 90-nTemp
          Endif
       Case nTipo= 3  //suma matemática        ok
          nTemp:= n1+n2

       case ntipo = 4 // distancia matemática     ok
            IF n2>n1
             nTemp:= n2-n1
          else
             nTemp:= n1-n2
          Endif

     Endcase
     nNum := ntemp
     return nNum


 



for the three-dimensional array I find it difficult to find the numbers to associate

I explain you

1) I speak of two numbers because in the Italian lottery two numbers are equal to both
2) I speak of three numbers because in the Italian lottery three numbers are equal to three

the calculations are:
1) cyclometric sum
2) cyclometric distance
3) math addition
4) mathematical distance

for the cyclometric sum it is always necessary to subtract 90 if the sum exceeds 90

The cyclometric distance between two numbers is obtained by calculating the arithmetic difference (major minus minor); if the result exceeds "the limit" 45, the latter is subtracted from the 90 set.

The mathematical distance between two numbers is obtained by calculating the arithmetic difference (major minus minor); if the result exceeds "the limit" 90, the latter is subtracted from the 90 set.



for l'array with three numbers to create this cycle


Code: Select all  Expand view
For n= 1 to 90
         For k= 1 to 90
            For j= 1 to 90
              nTotale  :=      Calc_Terni_Sum_dist(n,k,j,ntipo)
              If  nTotale=nvalore
                 nAt := AScan( aTmp, { |a| a[1] = n .and. a[2] = n .or.;
                                           a[2] = n .and. a[3] = n} )
                    If nAt == 0
                       aadd(aTmp,{n,k,j})
                    Endif
                  Endif
            next
         next
      next


and created this other function for the calculation but it is wrong

Code: Select all  Expand view
Function Calc_Terni_Sum_dist(n1,n2,n3,nTipo)
//---------------------------------------
   local nNum:=0
   local nTemp:=0
   Do case
      case nTipo= 1 // suma ciclométrica      ok
         nTemp:= n1+n2+n3

          If nTemp > 90
            nTemp:= ntemp-90      //el exterior 90
         Endif

       case nTipo= 2 //distancia ciclométrica    ok

          IF n1 > n2  .or. n1 >n3
            nTemp:= n1-n2-n3
          elseif n2 > n1  .or. n2 >n3
            nTemp:= n2-n3-n1
          elseif n3 > n1  .or. n3 > n2
            nTemp:= n3-n1-n2
          Endif



          If nTemp > 45          //   el exterior 45
             nTemp:= 90-nTemp
          Endif

       Case nTipo= 3  //suma matemática        ok
          nTemp:= n1+n2

       case ntipo = 4 // distancia matemática     ok
             IF n1 > n2  .or. n1 >n3
            nTemp:= n1-n2-n3
          elseif n2 > n1  .or. n2 >n3
            nTemp:= n2-n3-n1
          elseif n3 > n1  .or. n3 > n2
            nTemp:= n3-n1-n2
          Endif

     Endcase
     nNum := ntemp
 return nNum


how could i solve?