Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - numeri sempre diversi in un array bidimensionale
Forum - C# / VB.NET - numeri sempre diversi in un array bidimensionale

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 15:18
Giovedì, 06/05/2010
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

grazie


Muzzy
PM Quote
Avatar
Federico_VbNet_Programmer (Normal User)
Expert


Messaggi: 222
Iscritto: 03/04/2010

Segnala al moderatore
Postato alle 16:47
Giovedì, 06/05/2010
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.:D


pierotofy fa merda
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:18
Venerdì, 07/05/2010
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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 1:37
Sabato, 08/05/2010
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

        Console.Write(NSest(0) & " ")
        Console.Write(NSest(1) & " ")
        Console.Write(NSest(2) & " ")
        Console.Write(NSest(3) & " ")
        Console.Write(NSest(4) & " ")
        Console.Write(NSest(5))
        Console.ReadLine()

    End Sub

End Module

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..8-| :rofl:
Un Grazie anticipato:k:

Ultima modifica effettuata da alimuzzy il 08/05/2010 alle 1:45


Muzzy
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:50
Lunedì, 10/05/2010
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...


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 14:18
Sabato, 15/05/2010
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


Muzzy
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:58
Domenica, 16/05/2010
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

  1. 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

  1. 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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
alimuzzy (Normal User)
Rookie


Messaggi: 28
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 20:59
Domenica, 16/05/2010
Ti ringrazio per la pasienza e per la disponibilità sei un grande..:k: 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 :asd:
un mille grazie...


Muzzy
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 21:04
Domenica, 16/05/2010
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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo