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.
 

Mike58

Advanced Member >PLATINUM PLUS<
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
 

joe

Advanced Member >PLATINUM PLUS<
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.

:)
 

Cinzia27

Premium Member
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
 

Cinzia27

Premium Member
Grazie, Joe, questo lo so fare ma io ho bisogno il contrario, cioè di togliere uno ( o due) elementi e di conservare il resto.
 

joe

Advanced Member >PLATINUM PLUS<
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

:)
 

Enplein

Super Member >PLATINUM<
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
 

Cinzia27

Premium Member
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.
 

Enplein

Super Member >PLATINUM<
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
 
L

LuigiB

Guest
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
 

Cinzia27

Premium Member
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.
 

Cinzia27

Premium Member
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:

i legend

Premium Member
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ì 17 maggio 2024
    Bari
    63
    35
    59
    12
    69
    Cagliari
    13
    07
    23
    24
    38
    Firenze
    35
    80
    90
    76
    73
    Genova
    11
    54
    27
    06
    20
    Milano
    07
    72
    48
    37
    15
    Napoli
    65
    87
    82
    50
    35
    Palermo
    13
    88
    44
    67
    24
    Roma
    31
    05
    47
    33
    46
    Torino
    39
    57
    84
    82
    09
    Venezia
    09
    23
    49
    53
    63
    Nazionale
    37
    43
    26
    48
    81
    Estrazione Simbolotto
    Milano
    26
    07
    17
    44
    39

Ultimi Messaggi

Alto