Novità

Chi mi aiuta?

Cinzia27

Premium Member
Chi cortesemente può aiutarmi?

Sub main()

Dim n(3)
n(1)=1
n(2)=2
n(3)=3
For i=1 To 3

Scrivi n(i)

next

End Sub

Con questo script ho
1
2
3


Avrei necessità di ottenere
1
2

1
3

2
3

MA togliendo un elemento per volta.
 
Cinzia, vedi se può andar bene

Codice:
Sub Main
   Dim N(2)
   For n1 = 1 To 5
      For n2 = n1 + 1 To 5
         If n2 > n1 Then
            N(1) = n1 : N(2) = n2
            Scrivi N(1)
            Scrivi N(2)
            Scrivi
         End If
      Next
   Next
End Sub

1
2

1
3

1
4

1
5

2
3

2
4

2
5

3
4

3
5

4
5
 
Ciao Cinzia,

Se scomponi la terzina in ambi, per poterlo fare devi avere 2 indici.

Esattamente come creeresti degli Ambi di essi.

Come giustamente ti ha suggerito Ilegend ci sarebbero anche istruzioni specifiche di Spaziometria.

Degli esempi a corredo del programma ti ho adattato questo:

Codice:
Option Explicit
Sub Main
 
   Dim k,s
   Dim nClasse,nColonneTot
   ReDim aNumeri(3)
   Dim aCol
 
   nClasse = 2 ' sviluppo in ambi
   ' inizializzo i numeri da sviluppare in questo caso 90
   ' ma potrebbero essere anche di meno
   For k = 1 To 3
      aNumeri(k) = k
   Next
   'inizializza lo sviluppo
   nColonneTot = InitSviluppoIntegrale(aNumeri,nClasse)
   k = 0
 
   ' ciclo che continua fiono a quando le colonne non finiscono
   Do While GetCombSviluppo(aCol)
   
      k = k + 1 ' conteggio colonna corrente
   
      ' costruisco la stringa che contiene la colonna
      s = FormatSpace(k,10,True) & "- " & StringaNumeri(aCol)
      Call Scrivi(s)
   
      Call Messaggio("Colonna " & k)
      If ScriptInterrotto Then Exit Do

   Loop
End Sub

Ma se consideri una terzina trovo più semplice gestire lo sviluppo con il fai da te.

Dunque anziché 89 = 90 - 1 hai 2 = 3 - 1 come limite massimo del primo loop.
E poi, il classico i+1 to 3 per il secondo indice.

Il tuo codice che gestisce ed integra questo secondo puntatore potrebbe essere

Codice:
Option Explicit
Sub Main()
   Dim n(3)
   Dim i,f
   n(1) = 1
   n(2) = 2
   n(3) = 3
   For i = 1 To 2
      For f = i + 1 To 3
         Scrivi n(i) & "-" & n(f)
      Next
   Next
End Sub

Che produce :

Codice:
1-2
1-3
2-3

Un saluto anche a Mike altra sicura colonna portante degli script di spaziometria.

:)
 
Mike, io vorrei che in questo script fosse inserito un for che mi tolga un elemento per volta

Sub main()

Dim n(5)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5
For i=1 To 5

Scrivi n(i)

next

End Sub

Risultato che vorrei

02.03.04.05
01.03.04.05
01.02.04.05
01.02.03.05
01.02.03.04
 
Grazie, Joe, questo lo so fare ma io ho bisogno il contrario, cioè di togliere uno ( o due) elementi e di conservare il resto.
 
Ciao Cinzia, scusandomi con Mike.

Velocemente prima di andare a nanna.

Concettualmente è lo stesso ... ma con più indici ... si deve scrivere più codice

e diventa facile fare qualche errore.

Dunque per le quartine ed oltre è sicuramente meglio e molto più semplice modificare,

lo stesso script che ti ho proposto.

5 Numeri da sviluppare in classe 4.

Ho letto il tuo messaggio ... ma ad un controllo veloce non vedo differenze di sostanza

ma solo nell'ordine speculare con cui cui vengono esposti i risultati.

02.03.04.05
01.03.04.05
01.02.04.05
01.02.03.05
01.02.03.04

contro :

1- 1.2.3.4
2- 1.2.3.5
3- 1.2.4.5
4- 1.3.4.5
5- 2.3.4.5

:)
 
Mike, io vorrei che in questo script fosse inserito un for che mi tolga un elemento per volta

Sub main()

Dim n(5)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5
For i=1 To 5

Scrivi n(i)

next

End Sub

Risultato che vorrei

02.03.04.05
01.03.04.05
01.02.04.05
01.02.03.05
01.02.03.04
Ciao Cinzia, prova questa soluzione.

Enplein.
Codice:
Sub Main()

Dim n(5)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5
For i=1 To 2
For j=i+1 To 3
For y=j+1 To 4
For z=y+1 To 5
Scrivi n(i)&"."&n(j)&"."&n(y)&"."&n(z)
Next 
Next
Next 
Next

End Sub
 
Joe, non è la stessa cosa perché se io ho un vettore con 10 elementi e devo ridurlo ad 8, devo fare 8 cicli for, cosa che otterrei con 2 cicli for.
Grazie, Enplein ma si tratta dello stesso modo di risolvere finora proposto anche da Mike e Joe.
 
Buongiorno.
Adesso penso di aver capito...

Enplein.
Codice:
Dim n(5),nr(4)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5

For i=1 To 5
g=0
For x=1 To 5
If n(x)<>n(i) Then g=g+1 : nr(g)=n(x)
Next 
Scrivi StringaNumeri (nr),1
Next 


End Sub
 
non riesco a capire perche non vada bene lo sviluppo dell'array di base come hanno detto Joe e Legend.

se vuoi togliere un elemento alla volta devi sviluppare in classe -1 , se ne vuoi togliere 2 devi sviluppare in classe -2 , in tutti i casi tu passi
il tuo array ad una funzione e quella ti ritorna un certo numero di combinazioni che sono quelel necessarie per il sottoinsieme che hai deciso.
e tu devi ciclare su queto array che contiene le combinazioni


' non ti spaventare per la lunghezza , ci sono 3 esempi percio è lungo , tu devi copiare nel tuo script solo le ultime 2 fuunzioni.

Codice:
Option Explicit
Sub Main()
   Dim aTest
   Dim k
   Dim aColonne
   aTest = Array(0,1,2,3)
   ' esempio 1
   'riduce di 1
   aColonne = GetSottoInsieme(aTest,1)
   For k = 1 To UBound(aColonne)
      Scrivi(StringaNumeri(aColonne(k)))
   Next
   'esempio 2
   ' riduce di 2
   aColonne = GetSottoInsieme(aTest,2)
   For k = 1 To UBound(aColonne)
      Scrivi(StringaNumeri(aColonne(k)))
   Next
   ' esempio 3
   ' riduce di uno le quartien che si formano con 5 numeri , ogni quartina da luogo a 4 terni
   aTest = Array(0,1,2,3,4,5)
   Call InitSviluppoIntegrale(aTest,4)
   ReDim aCol(4)
   Do While GetCombSviluppo(aCol)
      Call Scrivi(StringaNumeri(aCol))
      aColonne = GetSottoInsieme(aCol,1) ' riduce di 1
      For k = 1 To UBound(aColonne)
         Scrivi(StringaNumeri(aColonne(k)))
      Next
   Loop
End Sub
' copiare le seguenti funzioni nel proprio script
Function GetSottoInsieme(aN,PassoRid)
   Dim Mot
   Dim Classe,ClasseRid
   Dim nComb,iCol
   Dim aColonne
   Set Mot = GetMotoreSviluppoIntegrale
   Classe = UBound(aN)
   ClasseRid = Classe - PassoRid
   nComb = Mot.InitSviluppoIntegrale(aN,ClasseRid)
   ReDim aColonne(nComb)
   If nComb > 0 Then
      iCol = 0
      Do
         iCol = iCol + 1
         Call Dimensiona(aColonne(iCol),ClasseRid)
         Call Mot.GetCombSviluppo(aColonne(iCol))
      Loop While iCol < nComb
   End If
   GetSottoInsieme = aColonne
End Function
Function Dimensiona(v,c)
   ReDim v(c)
End Function
 
Io ringrazio tutti voi per il vostro aiuto, da voi c'è sempre da imparare qualcosa.
Per Luigi: il motivo della richiesta di compilare in quel modo è che con pochi numeri non si vede la differenza di tempo
ma immettendo di più e se i numeri da togliere sono pochi si risparmia di mettere più for che allungano i tempi,
almeno credo.
 
Buongiorno.
Adesso penso di aver capito...

Enplein.
Codice:
Dim n(5),nr(4)
n(1)=1
n(2)=2
n(3)=3
n(4)=4
n(5)=5

For i=1 To 5
g=0
For x=1 To 5
If n(x)<>n(i) Then g=g+1 : nr(g)=n(x)
Next
Scrivi StringaNumeri (nr),1
Next


End Sub
Enplein possiamo aumentare i numeri ad es. da 5 a 10 e togliere 3 numeri?
 
Ultima modifica:
Ciao a tutti :)
X Cinzia
lo script di Luigi è molto più flessibile e più facile da gestire per fare le ricerche. Praticamente è sufficiente cambiare i numeri da combinare e scegliere la classe di riduzione, senza mai fare altre modifiche.
Hai fatto delle prove per notare differenza di tempo di esecuzione tra i due modi?
Sono curioso visto la potenza del tuo PC.
Se cambi classe di riduzione con i cicli for credo che siano necessari tanti script quanto le riduzioni da applicare.

X Luigi
Come sempre grazie . 🙂👍
 

Ultima estrazione Lotto

  • Estrazione del lotto
    venerdì 04 luglio 2025
    Bari
    08
    45
    67
    28
    03
    Cagliari
    70
    57
    26
    88
    80
    Firenze
    83
    77
    22
    86
    67
    Genova
    04
    20
    78
    36
    47
    Milano
    12
    53
    34
    18
    57
    Napoli
    07
    19
    35
    75
    10
    Palermo
    06
    65
    11
    07
    23
    Roma
    01
    53
    48
    80
    46
    Torino
    30
    44
    71
    05
    21
    Venezia
    45
    67
    14
    44
    40
    Nazionale
    22
    27
    05
    18
    67
    Estrazione Simbolotto
    Nazionale
    12
    31
    32
    04
    44
Indietro
Alto