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
    sabato 05 luglio 2025
    Bari
    25
    89
    22
    77
    56
    Cagliari
    05
    87
    46
    70
    49
    Firenze
    17
    85
    66
    59
    54
    Genova
    90
    65
    07
    44
    62
    Milano
    60
    84
    26
    78
    43
    Napoli
    71
    78
    86
    76
    84
    Palermo
    23
    42
    82
    60
    88
    Roma
    86
    60
    85
    19
    01
    Torino
    59
    30
    54
    29
    60
    Venezia
    90
    20
    71
    03
    81
    Nazionale
    70
    36
    74
    27
    38
    Estrazione Simbolotto
    Nazionale
    02
    32
    40
    16
    19
Indietro
Alto