Newsgroup: it.comp.lang.visual-basic
Titolo: [vb6] combinare sequenza fissa di caratteri alfanumerici

Salve a tutti,
dal titolo in effetti non si capisce molto quello che vorrei fare... in 
pratica dovrei ciclare tutti i numeri e caratteri per ottenere delle 
stringhe di lunghezza 10 con tutte le combinazioni... mi sembrava una cosa 
abbastanza facile ma mi sono arenato e non ne vengo fuori... non capisco 
perch� ottengo molte stringhe ripetute...
riporto qui sotto il codice e ringrazio a tutti
dade
Dim sequenza As String
Dim p1, p2, p3, p4, p5, p6, p7, p8, p9, p10
Dim dizFilename As String
Dim tw1, tw2, tw3, tw4, tw5, tw6, tw7, tw8, tw9, tw10, tword As String
sequenza = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXZ"
Label1.Visible = True
ff = FreeFile
Open Text1.Text For Append As ff
For p1 = 1 To Len(sequenza)
    tw1 = Mid(sequenza, p1, 1)
    For p2 = 1 To Len(sequenza)
        tw2 = Mid(sequenza, p2, 1)
        For p3 = 1 To Len(sequenza)
            tw3 = Mid(sequenza, p3, 1)
            For p4 = 1 To Len(sequenza)
                tw4 = Mid(sequenza, p4, 1)
                For p5 = 1 To Len(sequenza)
                    tw5 = Mid(sequenza, p5, 1)
                    For p6 = 1 To Len(sequenza)
                        tw6 = Mid(sequenza, p6, 1)
                        For p7 = 1 To Len(sequenza)
                            tw7 = Mid(sequenza, p7, 1)
                            For p8 = 1 To Len(sequenza)
                                tw8 = Mid(sequenza, p8, 1)
                                For p9 = 1 To Len(sequenza)
                                    tw9 = Mid(sequenza, p9, 1)
                                    For p10 = 1 To Len(sequenza)
                                        tw9 = Mid(sequenza, p10, 1)
                                        tword = tw1 + tw2 + tw3 + tw4 + tw5 
+ tw6 + tw7 + tw8 + tw9 + tw10
                                        Label2.Caption = "Generating: " + 
tword
                                        DoEvents
                                        Write #1, word
                                    Next p10
                                Next p9
                            Next p8
                        Next p7
                    Next p6
                Next p5
            Next p4
        Next p3
    Next p2
Next p1
Close ff
MsgBox "Finito!"

                                    Next p10
ecco subito dopo aver postato mi sono accorto che nel ciclo piu' interno 
andavo a fare il mid nella variabile tw9 invece che tw10... sostituito e ora 
sembra funzionare tutto...
scusate per il disturbo!
dade 

 scusate per il disturbo!
S�, ma � comunque sbagliato!
Le stringhe si ripetono comunque.
http://it.wikipedia.org/wiki/Calcolo_combinatorio
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

 dade
A parte questo problema, la procedura è già di per se lenta, ma stai
peggiorando le cose facendo un sacco di operazioni sulle stringhe non
necessarie, e usando anche tipi di variabile non ottimali
- la dichiarazione "Dim pi, p2, ..." usa tutte variabili Variant,
quella "Dim tw1, tw2, ... , tword As String" genera di nuovo tutti
Variant tranne l'ultima, che è l'unica String; la forma corretta è
"Dim tw1 as string, tw2 as String, ecc..."
Questo ha un effetto modesto sulle prestazioni ma da non sottvalutare
comunque.
-Usare n-mila volte Len(xx) quando il valore è sempre lo stesso, è un
altra discreta perdita di tempo; trascurando che è una costante, anche
metterlo all'inizio in una variabile e poi usare direttamente quella è
un buon risparmio (vedi sotto)
-Il grosso impatto invece sono tutte quelle operazioni Mid() che non
servono in quanto la tua sequenza è sempre statica; anche il passaggio
attraverso tutte quelle tw1/2/3 prima di generare tword è superfluo.
Invece di usare una stringa, usa un array di caratteri e vedrai che
risulta di gran lunga più veloce.
Riassumendo il tutto, prova ad esempio così (le operazioni su file
restano uguali, le ho omesse):
Dim sequenza() As String
Dim seqLen As Long
Dim p1 As Long, p2 As Long, p3 As Long, <eccetera> , p10  As Long
Dim tword As String
'generiamo l'array con i caratteri che servono
seqLen = 36
ReDim sequenza(1 To seqLen)
For p1 = 1 To 10
    'numeri
    sequenza(p1) = Chr(47 + p1)
Next
For p1 = 11 To seqLen
    'lettere maiuscole
    sequenza(p1) = Chr(54 + p1)
Next
For p1 = 1 To seqLen
    For p2 = 1 To seqLen
        For p3 = 1 To seqLen
            For p4 = 1 To seqLen
                For p5 = 1 To seqLen
                    For p6 = 1 To seqLen
                        For p7 = 1 To seqLen
                            For p8 = 1 To seqLen
                                For p9 = 1 To seqLen
                                    For p10 = 1 To seqLen
                                        tword = sequenza(p1) _
                                                & sequenza(p2) _
                                                & sequenza(p3) _
                                                & sequenza(p4) _
                                                & sequenza(p5) _
                                                & sequenza(p6) _
                                                & sequenza(p7) _
                                                & sequenza(p8) _
                                                & sequenza(p9) _
                                                & sequenza(p10)


 ha scritto nel messaggio 
news:4a54c523$0$6832$5fc...@news.tiscali.it...

Grazie Fede, mi leggo la pagina che mi hai postato anche se onestamente non 
capisco perch� dici che si ripetono comunque...


Grazie Luca, in effetti il codice ottimizzato da te gira molto meglio!!! 
Tengo presente quanto mi hai detto sopra per i prossimi programmi!
Ciao
Dade

 fuori... non capisco perch� ottengo molte stringhe ripetute...
[cut]
Le combinazioni sono 36^10, le stringhe di lunghezza 10, ti viene fuori un 
file da 36 Terabyte e passa... sei sicuro di avere posto?
Bye
Raf