Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ciao
Sto cercando di capire come ottenere una serie di valori numerici di una matrice bidimensionale tipo:
dim estr (10, 4) as integer
diversi fra di loro come se fosse una estrazione del lotto dove su ogni ruota composta da 5 numeri non ci siano numeri estratti uguali.
For Me.i = 0 To 10
For Me.j = 0 To 4
estr(i, j) = CType(generetor.Next(1, 90), Byte)
Next
Next
Prova a usare un If dove tu calcoli se il numero estratto è già uscito.
Per farlo io ti consiglio di creare una listbox da codice,di aggiungerci gli elementi estratti e con un Contains sapere se tale numero è già contenuto nella Listbox.
Se esce true deve rifare tutto di nuovo fino a quando esce false.
Non avete ancora capito che la ListBox è un controllo VISUALE? Usarla da codice come via astrusa per contenere qualcosa non solo è un esempio di pessima programmazione, ma è anche inefficiente e ingombrante. Per questo esistono le liste generiche, List(Of Integer).
E poi queste discussioni sono già state postate centinaia di volte. Esiste la funzione "cerca", esiste google, e ci si può ragionare anche su un momento.
Ciao Totem
Voglio innanzi tutto complimentarmi con te per la passione che hai nella programmazione, e per la tua disponibilità ad aiutare quelli che come me cominciano ad avvicinarsi ad esso.
Sto studiando la tua guida un po alla volta accostandola ad altri manuali e libri di testo, purtroppo il tempo da dedicare avvolte e inesistente, cosi mi ritrovo a ritornare su appunti lasciati 6 7 8 mesi prima, questa volta cmq voglio dedicarmi piu seriamente..
Voglio scusarmi per non avere cercato prima sul forum argomenti correlati al mio post ma ti posso assicurare che su google ho trascorso parecchio tempo, trovando alla fine qualcosa di questo genere:
Module Module1
Dim NSest(0 To 5) As Byte 'Array rappresentante la sestina
Function diverso() As Boolean
Dim i1 As Byte
Dim j1 As Byte
diverso = True
For i1 = 0 To 4
For j1 = i1 + 1 To 5
If NSest(i1) = NSest(j1) Then
Return False
Exit Function
End If
Next
Next
End Function
Sub main()
Dim i, j As Byte
Dim r As New Random
For i = 0 To 5
NSest(i) = r.Next(1, 10)
Next
Do
For i = 0 To 4
For j = i + 1 To 5
If NSest(i) = NSest(j) Then
Do
NSest(j) = r.Next(1, 10)
Loop Until NSest(i) <> NSest(j)
End If
Next
Next
Loop Until diverso() = True
da come puoi vedere c'e l'utilizzo di una funzione, che fino a ieri per me era un po sconosciuta, ho cercato di adoperare lo stesso metodo con una matrice bidimensionale ma non riesco a fare granche.
Mi hanno suggerito di usare una matrice di appoggio, ma si vede che devo studiare ancora.:-)
A parte tutto sto poema spero di nn essere stato noioso volevo solo un aiutino piu consistente ma senza la soluzione, magari utilizzando proprio il listato sopra citato, il quale per essere sincero non riesco a capire ancora che caspita di lavoro fa la funzione,
cioe all'interno della sub dopo la verifica dei doppioni con il primo costrutto do (questo l'ho imparato sulla tua guida) fà una ulteriore verifica..
boo..
Un Grazie anticipato
Ultima modifica effettuata da alimuzzy il 08/05/2010 alle 1:45
diverso() controlla semplicemente che tutti i numeri estratti siano diversi (i for li hai fatti, sì?). E' evidente che per far uscire numeri diversi si debba controllare se quelli usciti sono ripetuti e, in questa eventualità, estrarne di nuovi o modificare quelli vecchi.
Posso dirti che quel codice è, detto onestamente, orribile, quindi ti sconsiglio di studiare su quello. Tuttavia, il concetto da usare è sempre lo stesso...
Ciao Totem
ho seguito il tuo consiglio e sono arrivato a questa soluzione che sembra funzionare:
For i = 0 To ArrA - 1
For j = 0 To ArrB - 1
arr(i, j) = rand.Next(1, 90)
Next
Next
Do
For i = arr.GetUpperBound(0) To arr.GetLowerBound(0)
For j = arr.GetUpperBound(1) To arr.GetLowerBound(1)
If arr(i, j) = arr(i, j) - 1 Then
arr(i, j) = CType(rand.Next(1, 90), Short)
End If
Next
Next
Loop Until arr(i, j) <> arr(i, j) - 1
Prendendo spunto da altri post, es. -ordinare un array di numeri- in cui è spiegato come ordinare un array unidimensionale con il metodo bubble sort, da questo avevo in mente di ordinare anche un array bidimensionale es. arr(9,5).
Cosa mi suggerisci?
grazie
Ultima modifica effettuata da alimuzzy il 15/05/2010 alle 20:26
Forse quel codice funzionava perchè è poco probabile che vengano due numeri uguali, ma è concettualmente sbagliato:
GetUpperBound(0) restituisce l'estremo superiore della prima dimensione di un array, mentre GetLowerBound(0) l'estremo inferiore. Quindi il tuo for va dall'ultimo al primo, senza specificare Step -1, con il risultato che si ferma subito. Potevi comunque usare ArrA e ArrB, il che era molto più chiaro e più semplice.
Inoltre la condizione
Codice sorgente - presumibilmente C# / VB.NET
If arr(i, j) = arr(i, j) - 1 Then
non risulta mai verifica, in quanto nessun numero è uguale al suo precedente: se A = arr(i,j), tu hai scritto "if a = a - 1", il che è evidentemente impossibile. Allo stesso modo:
Codice sorgente - presumibilmente C# / VB.NET
Loop Until arr(i, j) <> arr(i, j) - 1
risulta sempre verificata per lo stesso motivo di cui sopra.
In conclusione i cicli for non vengono mai eseguiti. Se venissero eseguiti non produrrebbero nessun cambiamente, e se anche producessero un risultato valido lo farebbero una sola volta in quanto il Do terminerebbe subito.
Pensaci su ancora un po'.
Per il secondo problema, puoi vedere una matrice come un array singolo dove l'elemento di posizione (i,j) occupa il posto i*numero_colonne+j.
Ti ringrazio per la pasienza e per la disponibilità sei un grande.. in effetti quel codice l'ho rivisto e come hai specificato tu nn serve a molto anzi a nulla :-) sia per lo step mancante che per che per If arr(i, j) = arr(i, j) - 1.
Sto impazzendo solo per capire come fare a dire al programma di verificare se i numeri precedenti sono usciti o no..
Non mollo, voglio sbatterci ancora la testa..
Certo che programmare e piu difficile di quello che pensassi
un mille grazie...
Programmare non è difficile. Si tratta solo di dire alla macchina cosa fare. E' difficile le prime volte mettere a fuoco le istruzioni elementari di cui si compone un algoritmo, le quali si è soliti compattare in un unico passaggio logico che, seppur palese, è un'istruzione complessa.
Ti suggerisco di schematizzare l'algoritmo con un flow chart.