PDA

View Full Version : [Visual Basic 6] Estrarre numeri da un array


© Rocky
06-07-2010, 00:47
Ciao a tutti :D
Sarà semplice, sarà il caldo o forse la vecchiaia ma, è un po' che ci sto provando
senza venire a capo di questo problema semplicissimo. :mc:
Ho un'Array con sei numeri, (ma potrebbero essere molti di più) esempio:

Array 1
9.13.14.15.16.17

vorrei trasferire nel secondo Array solo i numeri mancanti del primo, esempio:

Array 2
10.11.12

Un grosso grazie a chi mi vorrà aiutare :)

key2710
06-07-2010, 09:44
Qualora gli array siano variant e sorted (come appare dal tuo esempio)

...
Dim IndexArrayFrom as integer
...
For IndexArrayFrom = 0 to UBound(vArrayFrom)
sbLoadMissedValue(vArrayFrom(IndexArrayFrom),vArrayFrom(IndexArrayFrom+1),vArrayTo
Next
...

private sub sbLoadMissedValue(byval myStart as integer, byval myEnd as integer, byref myArrayTo as variant)
dim myTempValue as integer
myTempValue = myStart + 1

while myTempValue < myEnd
myArrayTo.add myTempValue
myTempValue = myTempValue + 1
wend
end sub


In tutti i casi il concetto è riapplicabile anche su tipi di dato diversi.
Ciao.

© Rocky
06-07-2010, 13:52
@ Key2710

anzitutto grazie per avermi risposto e proposto una soluzione :D

Veramente la pensavo più semplice, ora proverò e ti farò sapere.
Attualmente l'Array è Integer ma, ho provato anche con Variant senza risultati attendibili.

Il mio procedimento:
Avevo creato un ciclo For-Next dal 9 al 17 e confrontato ogni numero dell'Array 1 con il numero del ciclo For scartando i numeri uguali e aggiungendo i numeri differenti all'Array 2.

L'idea poteva anche essere giusta ma, chissà perchè i conti non mi tornavano !!! :rolleyes:

Ciao e ancora grazie :D

key2710
06-07-2010, 14:19
@ Key2710

anzitutto grazie per avermi risposto e proposto una soluzione :D

Veramente la pensavo più semplice, ora proverò e ti farò sapere.
Attualmente l'Array è Integer ma, ho provato anche con Variant senza risultati attendibili.

Il mio procedimento:
Avevo creato un ciclo For-Next dal 9 al 17 e confrontato ogni numero dell'Array 1 con il numero del ciclo For scartando i numeri uguali e aggiungendo i numeri differenti all'Array 2.

L'idea poteva anche essere giusta ma, chissà perchè i conti non mi tornavano !!! :rolleyes:

Ciao e ancora grazie :D

Solo per il fatto che parli ci ciclo da 9 a 17 ... già va male. Le procedure si devono scrivere ottimizzate per usi multipli. Meno costanti infili, meglio è.

Inoltre a giudicare da quello che dici forse ho capito male io il problema.

Quello che ho scritto io esamina i numeri presenti dentro un array1, attendendosi l'array1 già sorted ed infila dentro un array2 i buchi presenti dentro l'array1.

Posta il codice da te sviluppato.

© Rocky
06-07-2010, 16:43
Ciao Key,

In modulo.bas
Public Numeri(6, 90) As Integer
Public Pri(6) As Integer
Public Ult(6) As Integer
Public A(6) As Integer
Public Ci1(6) As Integer
Public Ci2(6) As Integer
Public Fram(6) As Variant
Public Cot(6) As Integer
Public Ava(6) As Integer


Routine Numeri mancanti

Pri(1) = Memo(1, 1) ' Primo numero dell'array Memo(1, 1), "9"
Ult(1) = Memo(1, Con(1)) ' Ultimo numero dell'array Memo(1, 6), "17"
' Array Memo = 9.13.14.15.16.17
Lista(1).Clear: Erase Cot()

For Ci1(1) = Pri(1) To Ult(1) ' da 9 a 17
Fram(1) = Ci1(1)
Cot(1) = Cot(1) + 1
A(1) = Memo(1, Cot(1))

For Ci2(1) = Pri(1) To Ult(1)
If A(1) <> Ci2(1) Then ' confronta i numeri dell'Array con il ciclo For
Ava(1) = Ava(1) + 1 ' Se differente incrementa Ava(1)
Numeri(1, Ava(1)) = Ci2(1) ' e lo salva in Numeri()
Lista(1).AddItem Numeri(1, Ava(1)) ' Visualizza in una ListBox
Else
End If
Next Ci2(1)
Next Ci1(1)


La variabile Con(1) posta in "Ult(1) = Memo(1, Con(1)) "è 6, proviene da un'altra routine precedente e può assumere altri valori (1>90)

L'output è: 10.11.12.13.14.15.16.17.9.10.11.12.13.14.15.16.17.9.10 ecc.

Spero si possa capire il funzionamento :O in ogni caso se servono altri dettagli chiedi pure :)

Grazie Key http://img148.imageshack.us/img148/4627/coolq.gif (http://img148.imageshack.us/i/coolq.gif/)

© Rocky
06-07-2010, 19:04
A forza di tentarle tutte credo di averlo risolto così: :D

Dopo averlo ottimizzato un pochino, comunque l'output è:
10.11.12 come desideravo. :)

'Numeri mancanti

' Dichiarazioni nel modulo bas
Public Memo2(6, 90) As Integer
Public MyArray(90) As Variant

' Nel Form
Lista(1).Clear
Pri(1) = Memo(1, 1) ' Primo numero della lista 1, "9"
Ult(1) = Memo(1, Con(1)) ' Ultimo numero della lista 1, "17"

Found = False: Erase Cont()
For B1 = 1 To Con(1) ' La variabile Con() contiene il totale di numeri provenienti da una routine precedentemente elaborata.
MyArray(B1) = Val(Memo(1, B1)) ' Trasferisce in MyArray() i dati di Memo()
Next B1
'
For B2 = Pri(1) To Ult(1)
Cerca = B2
Found = InStr(1, vbNullChar & Join(MyArray, vbNullChar) & vbNullChar, _
vbNullChar & Cerca & vbNullChar) > 0
If Found = True Then
Found = False
Else
Cont(1) = Cont(1) + 1
Memo2(1, Cont(1)) = Cerca ' Popola Memo2() con i numeri mancanti
Lista(1).AddItem Memo2(1, Cont(1)) ' Visualizza i numeri mancanti
End If
Next B2

Che te ne pare Key ? http://img41.imageshack.us/img41/6379/confusedt.gif (http://img41.imageshack.us/i/confusedt.gif/)