magicolotto (Normal User)
Expert
Messaggi: 338
Iscritto: 21/01/2008
|
ragazzi uso in questa grilia dei numeri prelevati in un archivio access
la griglia è 19 x 10
quindi 190 celle
uso dei contatori per effetture la ricerca nella griglia
pero' il codice che uso
è molto lento
ci impiega molto ad analizzare la griglia
vorrei sapere se cè un mdo piu veloce
esempio del codice che uso :
Codice sorgente - presumibilmente Delphi |
For row1 = 1 To caricaestraz For col1 = 2 To 11 For row2 = row1 + 1 To caricaestraz For col2 = 2 To 11 For row3 = row2 + 1 To caricaestraz For col3 = 2 To 11 For col4 = col3 + 1 To 11 DoEvents For row4 = row3 + 1 To caricaestraz For col5 = 2 To 11 For col6 = col5 + 1 To 11 ProgressBar1.Value = ProgressBar1.Value + 0.0001 If col2 - col1 = col5 - col3 And col4 - col3 = col6 - col5 Then If Abs(row2 - row1) = Abs(row4 - row3) Then ' And Abs(row3 - row2) = Abs(row5 - row3) Then num(1) = CInt(MSHFlexGrid1.TextMatrix(row1, col1)) num(2) = CInt(MSHFlexGrid1.TextMatrix(row2, col2)) num(3) = CInt(MSHFlexGrid1.TextMatrix(row3, col3)) num(4) = CInt(MSHFlexGrid1.TextMatrix(row3, col4)) num(5) = CInt(MSHFlexGrid1.TextMatrix(row4, col5)) num(6) = CInt(MSHFlexGrid1.TextMatrix(row4, col6)) If (num(1) = num(2)) And (num(3) = num(4)) And (num(5) = num(6)) Then MSHFlexGrid1.row = row1 MSHFlexGrid1.col = col1 MSHFlexGrid1.CellBackColor = vbRed MSHFlexGrid1.row = row2 MSHFlexGrid1.col = col2 MSHFlexGrid1.CellBackColor = vbRed MSHFlexGrid1.row = row3 MSHFlexGrid1.col = col3 MSHFlexGrid1.CellBackColor = vbGreen MSHFlexGrid1.row = row3 MSHFlexGrid1.col = col4 MSHFlexGrid1.CellBackColor = vbGreen MSHFlexGrid1.row = row4 MSHFlexGrid1.col = col5 MSHFlexGrid1.CellBackColor = vbYellow MSHFlexGrid1.row = row4 MSHFlexGrid1.col = col6 MSHFlexGrid1.CellBackColor = vbYellow End If End If End If Next col6 Next col5 Next row4 Next col4 Next col3 Next row3 Next col2 Next row2 Next col1 Next row1
|
|
|
P4p3r0g4 (Member)
Guru
Messaggi: 1319
Iscritto: 29/12/2006
|
Oh my GOD!
non è possibile una cosa del genere!
ci saranno 12 cicli annidati.
mi meraviglio che funzioni il tuo computer mentre gira il programma!!!
devi decisament sfrondare i cicli. ora ci do un occhiatina.
ok ammetto che non conosco il codice risolutivo a causa della mia aberrazione per i database access, quindi non ho mai neanche studiato le varie procedure di interazione tra questi e il vb.
tuttavia a quanto ho capito è una griglia pieni di dati che vanno confrontati tra loro.
per muoversi su una griglia servono due variabili contatore se lavori con 1 variabile per le righe e 1 per le colonne mentre 1 sola se lavori in resti (lasciamo perdere questo caso e lavoriamo in x e y)
anche mettendo che vuoi confrontare tutte le celle tra di loro ti serviranno al massimo 4 variabili x1,y1 ,x2,y2
for x1 = min to max
for y1= min to max
for x2 = min to max
for y2 = min to max
if cella(x1,y1) = cella(x2,y2) then
...
endif
next
next
next
next
il che sarebbe un calcolo computazionale di 19*10*19*10=36100
che non è piccolissimo ma reggibilissimo da un calcolatore.
Ultima modifica effettuata da P4p3r0g4 il 08/11/2008 alle 19:37 |
|
magicolotto (Normal User)
Expert
Messaggi: 338
Iscritto: 21/01/2008
|
ok grazie....
io ho cercato di mettere le condizioni di ricerca nei punti + appripriati
gira + veloce... ma è sempre lento
grazie infinite
cmq il pc non siblocca x fortuna
|
|
P4p3r0g4 (Member)
Guru
Messaggi: 1319
Iscritto: 29/12/2006
|
Aggiornato il post sopra. dimmi se ho capito bene.
|
|
magicolotto (Normal User)
Expert
Messaggi: 338
Iscritto: 21/01/2008
|
si hai capito ...
solo che il confronto che devo fare è tra 3 coppie di numeri
esempio
01-02 prima coppia
03-04 seconda coppia
05-06 terza coppia
queste tre coppie dinumeri
devono avere una particolare caratteristica
cioè essere uguali a due a due
o meglio ancora
non deve essere un numero che non sia uguale agli altri
quindi un numero solo diverso
capito che intendo?
|
|
P4p3r0g4 (Member)
Guru
Messaggi: 1319
Iscritto: 29/12/2006
|
ehm.. no.
non capisco.
a parte che un numero che non non e` uguale agli altri vuole dire che e` uguale agli altri
A = {a | Ogni b app B{} | not (not (a = b)) } => A = B
spiegati meglio
|
|
magicolotto (Normal User)
Expert
Messaggi: 338
Iscritto: 21/01/2008
|
esempio corretto :
26-28
30-26
28-30
in questo esempio
abbiamo 3 coppie
dove ogni numero risulta due volte
esempio sbagliato :
26-28
30-26
28-29
in questo caso la condizione esclude questa formazione di tre oppie xchè i numeri non sono a due a due
cio ci sono solo due coppie valide
26-26
28-28
oppure esempio ancora valido
26-28
26-28
26-28
tutti numeri uguali
non so se sono stato esauriente...
|
|
P4p3r0g4 (Member)
Guru
Messaggi: 1319
Iscritto: 29/12/2006
|
ti propongo questi processi.
a) indicizzare le coppie, quindi creare un vettore di oggetti collection contenenti gli indici del valore.
es
ind(3) sara` la collection che contiene gli indici(le coordinate) di tutti i punti contenenti il valore 3
il tempo di calcolo di questo processo e` lineare.
semplicemente
ind(val).add (indice)
a questo punto fai un ciclo per i valori(intesi come indice di ind(val)).
se il .count della collection e` uguale a 0 o a 1 allora quell'indice non avra` coppie associate, se e` maggiore di uno controlla che negli altri indici contenuti nella collection ci siano valori che si richiamano
es
ind(4) contine 65 49 93
allora se ind(val(65)) ind(val(49)) e ind(val(93)) contengono elementi in comune allora le coppie formate dai valori dell'elemento comune e le coppie i cui indici hanno dato un risulrtato positivo sono uguali due a due.
|
|
GrG (Member)
Guru^2
Messaggi: 3430
Iscritto: 21/08/2007
|
Ecco un esempio (nn è il massimo perchè l'ho ftt sul momento quindi ci sn dei difettucci...):
(Inserire in un form una textbox con le 3 coppie come esempio)
Codice sorgente - presumibilmente VB.NET |
Dim coppie() As String, conto As Integer, risultato As String, verifica() As String Private Sub Command1_Click() Text1.Text = Replace(Text1.Text, vbCrLf, "-") coppie = Split(Text1.Text, "-") Dim x As Integer, y As Integer conto = 0 For x = 0 To UBound(coppie) - 1 For y = 0 To UBound(coppie) - 1 If coppie(x) = coppie(y) Then conto = conto + 1 End If Next y If conto > 0 Then risultato = risultato & conto & "-" conto = 0 End If Next x verifica = Split(risultato, "-") If (verifica(0) <> verifica(1)) Or (verifica(0) <> verifica(2)) Or (verifica(1) <> verifica(2)) Then: Exit Sub MsgBox "coppia valida" End Sub
|
Poi te lo devi un pò aggiustare e adattare alle tue esigenze...
Spero di aver capito ciò che intendi...
Paperoga quanti anni fai?
|
|