PDA

View Full Version : [VB.NET] Confronto per calendario calcio


Fabio7586
11-11-2009, 17:00
Ciao, ho un database in access con i seguenti campi: squadra1, squadra2, giornata.
Non riesco a capire come devo fare per creare le giornate; ad esempio ho tre squadre (ABC) devo dirgli che di scrivere nel database AB,AC,BC (BA,CA,CB sono la stessa cosa) ma non riesco a capire come fare! Qualcuno mi aiuti plz!:)

ramones1985
11-11-2009, 17:06
ehm....ma le squadre da dove le prendi?

e che valore vuoi che abbia il campo Giornata?

Deve essere una semplice somma del valore squadra1 + vs + squadra2 ad esempio?

Fabio7586
11-11-2009, 18:57
ehm....ma le squadre da dove le prendi?

e che valore vuoi che abbia il campo Giornata?

Deve essere una semplice somma del valore squadra1 + vs + squadra2 ad esempio?

ho cinque textbox su un form (quindi al massimo 5 squadre) dove scrivere le squadre all'interno (conseguentemente ho anche il database che le contiene tutte), il campo giornata si incrementerà in modo automatico(contatore) sino a quando le partite per la giornata non terminano (mi serve solo creare questo, poi eventuali altre aggiunte e/o modifiche le farò dopo)! e non so in che modo agire... :(

MarcoGG
12-11-2009, 08:45
Ciao, ho un database in access con i seguenti campi: squadra1, squadra2, giornata.
Non riesco a capire come devo fare per creare le giornate; ad esempio ho tre squadre (ABC) devo dirgli che di scrivere nel database AB,AC,BC (BA,CA,CB sono la stessa cosa) ma non riesco a capire come fare! Qualcuno mi aiuti plz!:)

Devi fare li calcolo di tutte le Combinazioni Semplici senza ripetizione su N elementi ( tutte le squadre del calendario ) a Gruppi di K ( nel tuo caso K=2 ).

Questa mia Function lo fa, a te il piacere di modificarla per il tuo scopo :

Public Function CombinazioniSemplici(ByVal arrayElementi() As String, ByVal dimensioneGruppo As Byte) As List(Of String)

Dim LC As New List(Of String)
If arrayElementi.Count = 0 Then Return LC
If dimensioneGruppo = 0 Or dimensioneGruppo > arrayElementi.Count Then Return LC

Dim aP(dimensioneGruppo - 1) As Integer
For i As Integer = 0 To aP.Count - 1
aP(i) = i
Next

Dim C As String = ""
Do
C = ""
For i As Integer = 0 To aP.Count - 1
C = C & arrayElementi(aP(i))
Next
LC.Add(C)

Dim cnt As Integer = 0
For i As Integer = aP.Count - 1 To 0 Step -1
If aP(i) = arrayElementi.Count - 1 - cnt Then
cnt += 1
If cnt = aP.Count Then Exit Do
Else
aP(i) += 1
For j = 0 To aP.Count - 1
If i < j Then aP(j) = aP(i) + (j - i)
Next
Exit For
End If
Next
Loop

Return LC

End Function

;)

Fabio7586
12-11-2009, 12:53
Devi fare li calcolo di tutte le Combinazioni Semplici senza ripetizione su N elementi ( tutte le squadre del calendario ) a Gruppi di K ( nel tuo caso K=2 ).

Questa mia Function lo fa, a te il piacere di modificarla per il tuo scopo :

Public Function CombinazioniSemplici(ByVal arrayElementi() As String, ByVal dimensioneGruppo As Byte) As List(Of String)

Dim LC As New List(Of String)
If arrayElementi.Count = 0 Then Return LC
If dimensioneGruppo = 0 Or dimensioneGruppo > arrayElementi.Count Then Return LC

Dim aP(dimensioneGruppo - 1) As Integer
For i As Integer = 0 To aP.Count - 1
aP(i) = i
Next

Dim C As String = ""
Do
C = ""
For i As Integer = 0 To aP.Count - 1
C = C & arrayElementi(aP(i))
Next
LC.Add(C)

Dim cnt As Integer = 0
For i As Integer = aP.Count - 1 To 0 Step -1
If aP(i) = arrayElementi.Count - 1 - cnt Then
cnt += 1
If cnt = aP.Count Then Exit Do
Else
aP(i) += 1
For j = 0 To aP.Count - 1
If i < j Then aP(j) = aP(i) + (j - i)
Next
Exit For
End If
Next
Loop

Return LC

End Function

;)

Ti ringrazio tanto per l'aiuto che mi dai, però io non l'ho capito tanto nel senso che non so come riadattarlo al mio codice. Io le squadre posso prelevarle da diverse textbox, oppure direttamente da database, poi una volta fatta la combinazione, deve andarla a scrivere in un tabella che ha i campi squadra1, squadra2.
cosa devo sostituire all'interno del codice affinche mi crei le coppie e le scriva nel database?
Quello che ho capito, è che si fanno scorrere i due indici(i,j) all'interno della matrice (solo questo ho capito)
mi aiuteresti ancora?

MarcoGG
13-11-2009, 08:45
Se vuoi tutte le partite possibili con N squadre, basta creare anzitutto una semplice classe "partita" :

Public Class partita

Public squadra1 As String
Public squadra2 As String

End Class

E con alcune piccole modifiche alla Function generica precedente ( ad esempio, dimensioneGruppo in questo caso è sempre 2, perciò inutile metterlo come parametro... ) :

Public Function CombinazioniSempliciPartite(ByVal arraySquadre() As String) As List(Of partita)

Dim LC As New List(Of partita)
If arraySquadre.Count = 0 Then Return LC

Dim aP() As Integer = {0, 1}
Do
Dim P As New partita
P.squadra1 = arraySquadre(aP(0))
P.squadra2 = arraySquadre(aP(1))
LC.Add(P)

Dim cnt As Integer = 0
For i As Integer = aP.Count - 1 To 0 Step -1
If aP(i) = arraySquadre.Count - 1 - cnt Then
cnt += 1
If cnt = aP.Count Then Exit Do
Else
aP(i) += 1
For j = 0 To aP.Count - 1
If i < j Then aP(j) = aP(i) + (j - i)
Next
Exit For
End If
Next
Loop

Return LC

End Function

A questo punto basta scorrere l'insieme delle partite restitito dalla Function per avere le coppie di squadre da inserire dove si vuole... ;)

Fabio7586
13-11-2009, 10:13
Se vuoi tutte le partite possibili con N squadre, basta creare anzitutto una semplice classe "partita" :

Public Class partita

Public squadra1 As String
Public squadra2 As String

End Class

E con alcune piccole modifiche alla Function generica precedente ( ad esempio, dimensioneGruppo in questo caso è sempre 2, perciò inutile metterlo come parametro... ) :

Public Function CombinazioniSempliciPartite(ByVal arraySquadre() As String) As List(Of partita)

Dim LC As New List(Of partita)
If arraySquadre.Count = 0 Then Return LC

Dim aP() As Integer = {0, 1}
Do
Dim P As New partita
P.squadra1 = arraySquadre(aP(0))
P.squadra2 = arraySquadre(aP(1))
LC.Add(P)

Dim cnt As Integer = 0
For i As Integer = aP.Count - 1 To 0 Step -1
If aP(i) = arraySquadre.Count - 1 - cnt Then
cnt += 1
If cnt = aP.Count Then Exit Do
Else
aP(i) += 1
For j = 0 To aP.Count - 1
If i < j Then aP(j) = aP(i) + (j - i)
Next
Exit For
End If
Next
Loop

Return LC

End Function

A questo punto basta scorrere l'insieme delle partite restitito dalla Function per avere le coppie di squadre da inserire dove si vuole... ;)

Ancora non riesco a capire come devo fare a passargli i valori delle squadre, come richiamare la function diciamo nel"main". Mi spiegheresti passo passo? sii paziente, l'ultima volta che ho sentito parlare di array stavo a scuola e studiavo pascal..

MarcoGG
13-11-2009, 11:33
Ancora non riesco a capire come devo fare a passargli i valori delle squadre, come richiamare la function diciamo nel"main". Mi spiegheresti passo passo? sii paziente, l'ultima volta che ho sentito parlare di array stavo a scuola e studiavo pascal..

Beh, ma gli array sono usatissimi in molti linguaggi...
Comunque sia, è semplicissimo. Se ad esempio voglio ricevere tutti gli incontri possibili, senza ripetizioni, su N squadre e immettere le partite in una ListBox di debug :

Dim N() As String = {"Roma", "Milan", "Inter", "Juventus", "Parma"}

Dim partite As List(Of partita) = CombinazioniSempliciPartite(N)
For i As Integer = 0 To partite.Count - 1
ListBox1.Items.Add(partite(i).squadra1 & " Vs " & partite(i).squadra2)
Next

Fabio7586
13-11-2009, 11:58
Grazie mille! intendevo dire che gli array non li uso da tanto tempo, anche perchè non ho continuato gli studi in questo tipo di campo e non vi lavoro nemmeno!
Ho un errore:
nullreference exception non è stata gestita
Riferimento a un oggetto non impostato su un'istanza di oggetto.
n() non l'ho dichiarat con valori statici, ma volevo che ogni volta facesse il controllo delle textbox se erano piene od erano vuote così da non generare errori nell'allocazione dei valori nell'array
Dim N() As String
For i = 0 To Nuovocam.nsquad - 1
If i = 0 Then
N(i) = Nuovocam.TextBox1.Text
End If
If i = 1 Then
N(i) = Nuovocam.TextBox2.Text
End If
If i = 2 And Nuovocam.TextBox3.Text <> "" Then
N(i) = Nuovocam.TextBox3.Text
End If
If i = 3 And Nuovocam.TextBox4.Text <> "" Then
N(i) = Nuovocam.TextBox4.Text
End If
If i = 4 And Nuovocam.TextBox5.Text <> "" Then
N(i) = Nuovocam.TextBox5.Text
End If
Next

MarcoGG
13-11-2009, 12:51
...
nullreference exception non è stata gestita
Riferimento a un oggetto non impostato su un'istanza di oggetto.
...


Per forza. Dichiari un array senza specificare la dimensione e poi tenti di fare riferimento agli elementi N-esimi...

A questo punto, se è previsto che qualche TextBox possa essere vuota, procedi così :

1. Individua tutte le textbox sulla Form destinate a contenere il nome di una squadra, e nella proprietà Tag inserisci squadra.

2. Modifichiamo il metodo CombinazioniSempliciPartite in modo che riceva in input un parametro di tipo List(Of String) :

Public Function CombinazioniSempliciPartite(ByVal squadre As List(Of String)) As List(Of partita)

Dim LC As New List(Of partita)
If squadre.Count = 0 Then Return LC

Dim aP() As Integer = {0, 1}
Do
Dim P As New partita
P.squadra1 = squadre(aP(0))
P.squadra2 = squadre(aP(1))
LC.Add(P)

Dim cnt As Integer = 0
For i As Integer = aP.Count - 1 To 0 Step -1
If aP(i) = squadre.Count - 1 - cnt Then
cnt += 1
If cnt = aP.Count Then Exit Do
Else
aP(i) += 1
For j = 0 To aP.Count - 1
If i < j Then aP(j) = aP(i) + (j - i)
Next
Exit For
End If
Next
Loop

Return LC

End Function

3. L'aggiunta delle squadre adesso è semplice, e inoltre nessun bisogno di fare ReDim Preserve sull'array :

Dim N As New List(Of String)
For Each C As Control In Me.Controls
If TypeOf C Is TextBox And C.Tag = "squadra" Then
If C.Text <> "" Then N.Add(C.Text)
End If
Next

E il gioco è fatto. ;)

Fabio7586
13-11-2009, 13:55
Grazie ancora! é stupendo imparare vb.net, si possono fare milioni di cose in poche righe di codice :)