PDA

View Full Version : [vb.net]plz salvatemi dalla pazzia totale!


RaouL_BennetH
13-07-2008, 21:23
dim s1 as string = griglia1.CurrentRow.Cells(1).Value
dim s2 as string = griglia1.CurrentRow.Cells(2).Value


If griglia2.RowCount = 0 Then

griglia2.Rows.Add(New String() {s1, s2})

else '(e qui per me significa: se il numero di righe NON E' ZERO!!)

for i as integer = 0 to griglia2.rows.count - 1
if griglia2(0, i).value = s1 then
msgbox("Valore già presente")
else ('e qui per me significa: se sto cacchio di valore NON C'E'!)
griglia2.Rows.Add(New String() {s1, s2})
end if
next
end if



Succede questo:

la griglia2 non ha righe: funziona, mi aggiunge una riga
la griglia2 ha una riga: funziona, se il valore già c'è me lo dice e nn lo aggiunge
la griglia2 ha 2 righe: in assenza di valori uguali mi aggiunge due volte la riga proveniente dalla griglia1

la griglia2 ha più di 4 righe: mi dice che i valori già esistono, non solo, me li aggiunge anche, non solo, me li triplica per ogni riga :muro: :mc: :cry: :nera: :help:

DanieleC88
13-07-2008, 21:46
Be', se hai 4 elementi ed uno è quello che già avevi in partenza, gli altri tre non sono uguali a lui, e soddisfano la condizione dell'else... se trovi già inserito quel valore dovresti fermare il ciclo e non fare niente: solo alla fine di tutto il ciclo, se non avrai mai trovato quanto stai cercando, aggiungerai il valore alla griglia. :)

RaouL_BennetH
13-07-2008, 21:56
Be', se hai 4 elementi ed uno è quello che già avevi in partenza, gli altri tre non sono uguali a lui, e soddisfano la condizione dell'else... se trovi già inserito quel valore dovresti fermare il ciclo e non fare niente: solo alla fine di tutto il ciclo, se non avrai mai trovato quanto stai cercando, aggiungerai il valore alla griglia. :)

ma se fermo il ciclo per non fare niente, e aggiungo il codice dopo, lui mi aggiunge la riga a prescindere, cioè, mi segnala che il valore già esiste e poi lo aggiunge lo stesso... oppure non ci sto capendo più niente :(

DanieleC88
13-07-2008, 22:01
No no, se quell'elemento esiste già, tu non hai bisogno di fare più nulla: puoi proprio uscire dal quel ciclo per sempre e provare l'inserimento con un nuovo valore.

RaouL_BennetH
13-07-2008, 22:07
uhm, scusami Daniele ma non riesco a capire :



Dim s1 as string
Dim s2 as string

s1 = griglia1.RigaCorrente.Cella(1).Valore
s2 = griglia1.RigaCorrente.Cella(2).Valore

for i as integer = 0 to griglia2.Rows.Count - 1
if griglia2.Riga(i).Cella(0).Valore = s1 then
'non aggiungere, valore già presente
next

'ora, se metto qui :

griglia2.Rows.Add(New String() {s1, s2})

'dopo aver controllato lui me le aggiunge lo stesso

DanieleC88
13-07-2008, 22:13
L'inserimento lo devi fare dopo aver completato la ricerca, non dopo il controllo.

Te lo scrivo in pseudocodice:
Trovato = Falso
Valore = /* elemento cercato */

Per ogni elemento X in Griglia
{
Se (X è uguale a Valore)
{
Trovato = Vero
Interrompi ciclo
}
}

Se (Trovato == Falso)
{
Aggiungi(Valore, Griglia);
}

:)

RaouL_BennetH
13-07-2008, 22:19
L'inserimento lo devi fare dopo aver completato la ricerca, non dopo il controllo.

Te lo scrivo in pseudocodice:
Trovato = Falso
Valore = /* elemento cercato */

Per ogni elemento X in Griglia
{
Se (X è uguale a Valore)
{
Trovato = Vero
Interrompi ciclo
}
}

Se (Trovato == Falso)
{
Aggiungi(Valore, Griglia);
}

:)

Daniele!! ma grazie!! mi hai aiutato a superare la nottata !!! :ave:

E, a ben ragionarlo, era più o meno lo stesso esempio che mi aveva fatto l'ottimo TigerShark sull'altro 3d ma che io ottusamente non avevo capito!!

Che dire, siete grandi e vi ringrazio!!!

^TiGeRShArK^
14-07-2008, 02:04
ma se usi quest'algoritmo hai una complessità pari ad O(n * m), se non sbaglio, con n pari al numero di elementi della prima griglia ed m pari al numero di elementi diversi, che in caso di elementi tutti diversi, e nel caso peggiore, diventa o(n^2).
Con quello che ti avevo suggerito invece dovresti cavartela con una complessità O(n).
Visto che la complessità implementativa è perfettamente equivalente io userei quello con l'array di controllo, anche se, a meno di non avere centinaia di migliaia di righe, non dovresti avere grosse differenze... o meglio il tuo processore è talmente veloce che non noterai le abissali differenze di tempo di calcolo tra i due algoritmi :p