Novità

x Luigi o joe chiarimenti funzione Spazioscript

i legend

Premium Member
ciao :)
ho dovuto utilizzare la funzione numeriripetutirilevatiV (aMioArray,aRipetuti,aQuanti)
non riesco a farle rintracciare i numeri superiori a 90
quindi o non vengono valutati alla base o sto sbagliando qualcosa.

se non lo fa provo a compilarla
grazie:)
 
Ciao Ilegend.

Se non ricordo male è come scrivi.

È semplice per te riscrivere questa funzione

eliminando il limite dei 90 estratti.

:)
 
Ciao Joe Immaginavo :)
ho provato a scrivere una funzione ma sicuramente è ottimizzabile

Ultimamente mi occupo a tempo pieno di mio padre e in piu per risolvere i miei problemucci di salute (ero diventato obeso, ora tutto rientrato) ,è da tanto che non faccio piu script e pertanto ho perso un po di smalto (se mai c'è ne stato:))

se perfavore ci potete dare un occhiata
p.s : ho usato ordina matrice turbo è temo che possa rallentare il tempo di elaborazione
nella realta devo scorrere solo 11 elementi.
ecco la sub con la funzione
che spero funzioni correttamente
Codice:
Option Explicit
'Lo scopo dello script è controllare il corretto funzionamento della funzione GetRipetuti
' non se ne assicura il funzionamento
' avevo anche pensato ad utilizzare do while partendo il conteggio dal fondo ma non credo possa essere piu veloce
' senza utilizzare OrdinaMatriceTurbo diventa tutto piu difficile 
Sub Main
    ReDim aV(101),aRip(UBound(aV))
    Dim i
    For i = 1 To UBound(aV)
        aV(i) = NumeroCasuale(1,100)
        If aV(i) > 90 Then Scrivi aV(i)
    Next
    ReDim aNum(0),aQ(0)
    aV(101) = MassimoV(aV) + 1
    Call NumeriRipetutiRilevatiV(aV,aNum,aQ)
    Scrivi StringaNumeri(aNum,,True)
    Scrivi StringaNumeri(aQ,,True)
    Call GetRipetuti(aV,aRip)
    Scrivi"------------------"
    Scrivi StringaNumeri(aRip,,True)
End Sub
Function GetRipetuti(aV,aRip)
    Dim N1,N2,N3,C
    Call OrdinaMatriceTurbo(aV,1)
    For N1 = 1 To UBound(aV) - 2
        N2 = N1 + 1
        If aV(N1) = aV(N2) Then
            N3 = N2 + 1

            If aV(N2) < aV(N3) Then
                C = C + 1

                aRip(C) = aV(N2)
            End If
        End If
    Next
    ReDim Preserve aRip(C)
End Function
 
Ciao Legend..qui dal cellulare non riesco a vedere bene il tuo codice e capire perche hai voluto usare l ordinamento..per lo scopo non e necessario..se sai il limite dei numeri possibili puoi creare in array e valorizzare a true il tale elemento solo se gia non e valorizzato al termine rileggi l array e prendi i numeri che identificano i elementi valorizzati. Un altra soluzione potrebbe essere l uso di una collection in cui onserisci l elemento con la chiave..dato che nella collection non possono esistere due elementi con uguale chiave al termine rileggendone il contenuto avrai solo elementi univoci..
 
Ciao luigi come credevo c'è molto da ottimizzare.
al volo ho preso la strada più che immediata.
avevo messo i valori in colonna dato un occhiata e compilato l algoritmo. Semplice semplice :)
ora provo a implementare una delle tue idee :)
sperando di riuscire :)
a dopo :)
 
Ciao Luigi ora ho provato ad elaborare l algoritmo senza utilizzare ordinamatrice

sono curioso di leggere il tuo se puoi o hai voglia di scriverlo per valutare le differenze dei tempi di elaborazione.

sarei altrettanto curioso di leggere quella di joe
non per fare raffronti ovviamente ma sempre perchè mi piace imparare dai "Meglio" :)
Codice:
Option Explicit
'Lo scopo dello script è controllare il corretto funzionamento della funzione GetRipetuti
' non se ne assicura il funzionamento
' avevo anche pensato ad utilizzare do while partendo il conteggio dal fondo ma non credo possa essere piu veloce
' senza utilizzare OrdinaMatriceTurbo diventa tutto piu difficile 
Sub Main
    ReDim aV(101),aRip(UBound(aV))
    Dim i
    For i = 1 To UBound(aV)
        aV(i) = NumeroCasuale(1,100)
        If aV(i) > 90 Then Scrivi aV(i)
    Next
    ReDim aNum(0),aQ(0)
    aV(101) = MassimoV(aV) + 1
    Call NumeriRipetutiRilevatiV(aV,aNum,aQ)
    Scrivi StringaNumeri(aNum,,True)
    Scrivi StringaNumeri(aQ,,True)
    Call GetRipetuti(aV,aRip)
ReDim aTro (0)
Call GetRipMag90(aV,aTro)
Scrivi StringaNumeri(aTro,,True)


    Scrivi"------------------"
    Scrivi StringaNumeri(aRip,,True)
End Sub
' Algoritmo per Array Ordinato
Function GetRipetuti(aV,aRip)
    Dim N1,N2,N3,C
    Call OrdinaMatriceTurbo(aV,1)
    For N1 = 1 To UBound(aV) - 2
        N2 = N1 + 1
        If aV(N1) = aV(N2) Then
            N3 = N2 + 1

            If aV(N2) < aV(N3) Then
                C = C + 1

                aRip(C) = aV(N2)
            End If
        End If
    Next
    ReDim Preserve aRip(C)
End Function
'Algoritmo per Array NonOrdinato
Function GetRipMag90(aRip,aTro)
    Dim i,j,m,k
    For i = 1 To UBound(aRip) - 1
        m = 0
        For j = i + 1 To UBound(aRip)
            If aRip(j) > - 1 Then
                If aRip(i) = aRip(j) Then m = m + 1:aRip(j) = - 1
            End If
        Next
        If m > 0 Then
            k = k + 1
            ReDim Preserve aTro(k)
            aTro(k) = aRip(i)
        End If
    Next
End Function
spero che raccolga tutti i dati :)
 
ciao Legend , ecco qui l'implementazione di tutti e 3 i metodi

con ordinamatrice
con arrayflag
con collection

bada bene usare ordinamatrice va benissimo probabilmente è anche il piu veloce però introduce la complicazione dell'algoritomo per leggere l'array ordinato allla ricerca dei doppi...


Codice:
Option Explicit
Class clsNumConRpetizioni
    Dim Num
    Dim nPres
    Sub IncrementaPres
        nPres = nPres + 1
    End Sub
End Class
Sub Main
    Dim aV,aRetN,aRetQ
    Dim k

    ReDim aV(10)
    For k = 1 To UBound(aV)
        aV(k) = NumeroCasuale(91,100)
    Next

    Call EliminaRipetutiConOrdinaMatrice(aV,aRetN,aRetQ)
    Call GestioneOutput(aV,aRetN,aRetQ,"EliminaRipetutiConOrdinaMatrice")


    Call EliminaRipetutiConArrayFlag(aV,aRetN,aRetQ)
    Call GestioneOutput(aV,aRetN,aRetQ,"EliminaRipetutiConArrayFlag")

    Call EliminaRipetutiConCollection(aV,aRetN,aRetQ)
    Call GestioneOutput(aV,aRetN,aRetQ,"EliminaRipetutiConCollection")


End Sub
Sub EliminaRipetutiConOrdinaMatrice(aV,aRetN,aRetQ)
    Dim k,i,nUpper
    nUpper = UBound(aV)
    ReDim aRetN(nUpper)
    ReDim aRetQ(nUpper)
    Call OrdinaMatriceTurbo(aV,1)
    i = 0
    For k = 1 To UBound(aV)
        i = i + 1
        aRetN(i) = aV(k)
        Do While aV(k + aRetQ(i)) = aRetN(i)
            aRetQ(i) = aRetQ(i) + 1
            If k + aRetQ(i) > nUpper Then Exit Do
        Loop
        k = k +(aRetQ(i) - 1)

    Next
    ReDim Preserve aRetN(i)
    ReDim Preserve aRetQ(i)


End Sub

Sub EliminaRipetutiConArrayFlag(aV,aRetN,aRetQ)

    Dim k,i,nUpper

    nUpper = MassimoV(aV)
    ReDim aRetN(nUpper)
    ReDim aRetQtmp(nUpper)
    ReDim aRetQ(nUpper)

    ReDim aFlag(nUpper)

    For k = 1 To UBound(aV)
        If Not aFlag(aV(k)) Then
            i = i + 1
            aRetN(i) = aV(k)
            aFlag(aV(k)) = True
            aRetQtmp(aV(k)) = aRetQtmp(aV(k)) + 1

        Else
            aRetQtmp(aV(k)) = aRetQtmp(aV(k)) + 1

        End If
    Next
    ReDim Preserve aRetN(i)
    ReDim Preserve aRetQ(i)

    For k = 1 To UBound(aRetN)
        aRetQ(k) = aRetQtmp(aRetN(k))
    Next

End Sub

Sub EliminaRipetutiConCollection(aV,aRetN,aRetQ)

    Dim k,i,nUpper,sKey
    Dim coll,cNum
    Set coll = GetNewCollection





    For k = 1 To UBound(aV)

        sKey = "k" & aV(k)
        If GetItemCollection(coll,sKey,cNum) Then
            cNum.IncrementaPres
        Else
            Set cNum = New clsNumConRpetizioni
            cNum.Num = aV(k)
            cNum.nPres = 1
            coll.Add cNum,sKey
        End If


    Next

    nUpper = coll.count
    ReDim aRetN(nUpper)
    ReDim aRetQ(nUpper)

    For k = 1 To coll.count
        Set cNum = coll(k)
        aRetN(k) = cNum.Num
        aRetQ(k) = cNum.nPres

    Next

End Sub


Sub GestioneOutput(aInput,aNumUnivoci,aQuantRip,sFunzione)

    Dim k
    Dim aV

    Call Scrivi(sFunzione)
    Call Scrivi(StringaNumeri(aInput))
    aV = Array("","Numero","Ripetizioni")
    Call InitTabella(aV)
    For k = 1 To UBound(aNumUnivoci)
        aV(1) = aNumUnivoci(k)
        aV(2) = aQuantRip(k)
        Call AddRigaTabella(aV)

    Next
    Call CreaTabella(1 ,1)
End Sub
 
Ringrazio anch'io per la "Stele di Luigi"

che permette un rapido confronto tra i 3 modelli-stili di programmazione.

:)
 
Come la famosa stele di rosetta che permise la comprensione dei grroglifici....grazie Joe
 

Ultima estrazione Lotto

  • Estrazione del lotto
    venerdì 17 gennaio 2025
    Bari
    10
    87
    77
    23
    60
    Cagliari
    75
    33
    60
    24
    15
    Firenze
    45
    34
    66
    41
    17
    Genova
    05
    65
    15
    53
    86
    Milano
    20
    84
    74
    76
    01
    Napoli
    90
    29
    38
    52
    68
    Palermo
    33
    36
    02
    20
    68
    Roma
    68
    12
    59
    07
    74
    Torino
    03
    22
    29
    90
    28
    Venezia
    81
    24
    35
    18
    03
    Nazionale
    06
    31
    35
    89
    74
    Estrazione Simbolotto
    Bari
    14
    24
    17
    13
    08
Indietro
Alto