Autor
|
Tema: Problema de array (Leído 1,678 veces)
|
corlo
Desconectado
Mensajes: 120
|
Hola estoy haciendo una aplicacion de loteria que en el array solo me acepta 19 numeros ¿como puedo hacer que el array me acepte 20 numeros o mas? en el text1.text hay el total de las apuestas el tect5.text esta la fecha actual en el list1 estan todas las apuestas del text1.text Option Explicit
Private Sub MakeUniqueCombinationOfSix(AryOfWhat() As Variant)
On Error GoTo MakeUniqueCombinationOfSixError
Dim NCnt1 As Integer, NCnt2 As Integer, NCnt3 As Integer Dim NCnt4 As Integer, NCnt5 As Integer, NCnt6 As Integer Dim UpperBoundsOfArray As Integer, LowerBoundsOfArray As Integer List1.Clear UpperBoundsOfArray = UBound(AryOfWhat) LowerBoundsOfArray = LBound(AryOfWhat)
For NCnt1 = LowerBoundsOfArray To UpperBoundsOfArray For NCnt2 = NCnt1 + 1 To UpperBoundsOfArray For NCnt3 = NCnt2 + 1 To UpperBoundsOfArray For NCnt4 = NCnt3 + 1 To UpperBoundsOfArray For NCnt5 = NCnt4 + 1 To UpperBoundsOfArray For NCnt6 = NCnt5 + 1 To UpperBoundsOfArray List1.AddItem AryOfWhat(NCnt1) & "," & AryOfWhat(NCnt2) & "," & _ AryOfWhat(NCnt3) & "," & AryOfWhat(NCnt4) & "," & _ AryOfWhat(NCnt5) & "," & AryOfWhat(NCnt6) Text1.Text = List1.ListCount Next NCnt6 Next NCnt5 Next NCnt4 Next NCnt3 Next NCnt2 Next NCnt1
Exit Sub MakeUniqueCombinationOfSixError:
MsgBox "MakeUniqueCombinationOfSix " & Err.Number & ":" & Err.Description
End Sub
Private Sub Form_Load() Text5.Text = Date Randomize Dim A() As Variant A = Array(4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49) MakeUniqueCombinationOfSix A End Sub
gracias
|
|
|
En línea
|
|
|
|
Serapis
|
el array solo me acepta 19 numeros ¿como puedo hacer que el array me acepte 20 numeros o mas? ... Private Sub Form_Load() Text5.Text = Date Randomize Dim A() As Variant A = Array(4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49) MakeUniqueCombinationOfSix A End Sub
Es broma, no?. Tratas de decir que usas un lenguaje pero que no conoces siquiera como dimensionar arrays?. En fin... La forma en que está declarado es un array estático, tendrá tantos elementos como aquellos que se han contenido. Esa no es la forma adecuada para inicializar arrays que se pretende tengan capacidades más dinámicas. En un caso como el presente donde pudiera ser el caso de que tuviere diferentes cantidades y valores es preferible meter en una función la creación de cada caso, que además inicialice el array con los valores deseados. Tampoco es muy util operar el array como de tipo variant, el variant es para otras cosas, como cuando deben contener cosas heterogéneas, si son todas del mismo tipo (numérico, string, fechas, etc...), entonces es preferible hacer que sea de ese tipo... private SizeArray as interger private Valores() as byte private function GetArrayDeValores(byval Cantidad as byte) as byte() dim V() as byte, v18() as string const Val18 as string = "4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49" const Val19 as string = 33 const Val20 as string = 11 if ((Cantidad< 18) or (cantidad > 20)) then case else: msgbox "No se ha contemplado el caso de un array con " & cstr(cantidad) & " de ítems... " & vbcrlf & "Valores aceptados actualmente: 18-20" SizeArray = 0 else v18 = split(Val18, ", ") ' pasamos la constante a un array de strings redim v(0 to cantidad-1) ' dimsnesionamos el array en la cantidad deseada for k= 0 to 18 ' pasamos los 18 valores del array de strings al array de bytes v(k) = cbyte(v18(k)) next if (cantidad >= 19) then v(18)= Val19 ' Si se solicitó 19 o 20 valores, pasamos el 19º if (cantidad = 20) then v(19)= Val20 ' ídem para el 20º SizeArray = Cantidad GetArrayDeValores = v ' devolvemos el array al tamaño solicitado y con los valores asignados. end if end function
finalmente puedes hacer con el array devuelto lo que precises.... Private Sub CombinacionesDe6(byval Cantidad as byte) dim Max as integer, combinacion as as string dim i as integer, j as integer, k as integer, l as integer, m as integer, n as integer valores = GetArrayDeValores(cantidad) if (SizeArray >0) then list1.clear list1.visible = false ' Esto hará que el añadido sea mucho más rápido max = ubound(valores) for i = 0 to max-5 for j= i+1 to max-4 for k= j+1 to max-3 for l = k+1 to max-2 for m= l+1 to max-1 for n= m+1 to max '.... lo que sea que vayas a hacer... por ejemplo añadirlos al listbox combinacion =ConcatValues(cstr(valores(i)), cstr(valores(j)), cstr(valores(k)), cstr(valores(l)), cstr(valores(m)), cstr(valores(n))) list1.additem combinacion next next next next next next list1.visible = true Text1.Text = List1.ListCount ' el añadido es bastante rápido, no hace falta ponerlo más que al final, o en todo caso en un bucle previo (si fueran a meterse muchos miles) end if end function
Unas funciones adicionales simplifican modificar el código en adelante... para que tenga otra apariencia en el listado, sin necesidad de tocar la función previa, solo las de formato. private function ConcatValues(i as string,j as string,k as string, l as string, m as string, n as string) as string ConcatValues= Format2Digitos(i) & Format2Digitos(j) & Format2Digitos(k) & Format2Digitos(l) & Format2Digitos(m) & Format2Digitos(n) end function ' Formato: 2espacios + valor(2 dígitos) + espacio(s) + separador private function Format2Digitos(byref Valor as string, optional byval Size as byte = 8, optional byref Separador as string = "|") as string dim Salida as string, k as integer if (len(valor) = 1) then salida = (" 0" & valor) else salida = (" " & valor) end if k= (len(salida) + len(separador) - Size) if (k > 0) then salida = salida & Space$(k) ConcatValues = (Salida & separador) end function
Puedes modificarlo para más valores que solo 18, 19 y 20... siguiendo el patrón o más complejo si es más ambicioso. Nota que no se deben repetir valores entre las constantes de la función 'GetArrayDeValores'... al mismo tiempo, podrías disponer diferentes valores constantes cuando sean diferentes cantidades (yo en el ejemplo he optado por aceptar los previos e incrementar en uno cada vez). No creo que haya que explicar nada más, es bastante simple y cualquiera que sepa un mímino de programación debería entenderlo todo sin más problemas. No obstante si tienes alguna laguna siéntente libre de preguntar.
|
|
« Última modificación: 12 Junio 2024, 16:59 pm por Serapis »
|
En línea
|
|
|
|
Serapis
|
La verdad es que usar valores fijos, puede ser útil cuando uno considera que esos valores 'tienen algo especial', pero como esa idea suele resultar falsa, puede ser más interesante considerar utilizar valores aleatorios (no repetidos)... ...de paso variamos el rango de cantidad entre 15 y 25... solo por ilustrar el ejemplo. private function GetArrayDeValores(byval Cantidad as byte) as byte() dim V() as byte, v49(0 to 49) as byte dim k as integer, j as integer, n as byte if ((Cantidad< 15) or (cantidad > 25)) then case else: msgbox "No se ha contemplado el caso de un array con " & cstr(cantidad) & " de ítems... " & vbcrlf & "Valores aceptados actualmente: 15-25" SizeArray = 0 else for k= 0 to 49 v49(k)= k next redim V(0 to cantidad-1) ' dimensionamos el array en la cantidad deseada for k= 0 to cantidad -1 j = (49-k) n = Int(j * Rnd + 1) ' el +1 impide elegir el índice y valor 0 de v49 pues no se contempla en las loterías (creo). V(k) = v49(n) v49(n) = v49(j): v49(j)= V(k) ' el tomado se aparta al final, y ya no será elegible (su puesto es ocupado por el último elegible actualmente). next SizeArray = Cantidad GetArrayDeValores = V ' devolvemos el array al tamaño solicitado y con los valores asignados. end if end function
|
|
« Última modificación: 12 Junio 2024, 17:28 pm por Serapis »
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
Hola Serapis He hecho tu codigo y pongo 20 en el form load me sale valor negativo y no sale el valor que tiene que salir 38760 y si pongo 19 entonces sale 27132 y sale bien en el text1.terxt y en el list1 no salen las combinaciones de 6 numeros Option Explicit Private SizeArray As Integer Private Valores() As Byte Private Function GetArrayDeValores(ByVal Cantidad As Byte) As Byte() Dim V() As Byte, v18() As String Const Val18 As String = "4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49" Const Val19 As String = 33 Const Val20 As String = 11 Dim i As Integer Dim k As Integer If ((Cantidad < 18) Or (Cantidad > 20)) Then MsgBox "No se ha contemplado el caso de un array con " & CStr(Cantidad) & " de ítems... " & vbCrLf & "Valores aceptados actualmente: 18-20" SizeArray = 0 Else v18 = Split(Val18, ", ") ' pasamos la constante a un array de strings ReDim V(0 To Cantidad - 1) ' dimsnesionamos el array en la cantidad deseada For k = 0 To 18 ' pasamos los 18 valores del array de strings al array de bytes V(k) = CByte(v18(k)) Next If (Cantidad >= 19) Then V(18) = Val19 ' Si se solicitó 19 o 20 valores, pasamos el 19º If (Cantidad = 20) Then V(19) = Val20 ' ídem para el 20º SizeArray = Cantidad GetArrayDeValores = V ' devolvemos el array al tamaño solicitado y con los valores asignados. End If End Function
Private Sub CombinacionesDe6(ByVal Cantidad As Byte) Dim Max As Integer, combinacion As String Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer Valores = GetArrayDeValores(Cantidad) If (SizeArray > 0) Then List1.Clear List1.Visible = False ' Esto hará que el añadido sea mucho más rápido Max = UBound(Valores) For i = 0 To Max - 5 For j = i + 1 To Max - 4 For k = j + 1 To Max - 3 For l = k + 1 To Max - 2 For m = l + 1 To Max - 1 For n = m + 1 To Max '.... lo que sea que vayas a hacer... por ejemplo añadirlos al listbox combinacion = ConcatValues(CStr(Valores(i)), CStr(Valores(j)), CStr(Valores(k)), CStr(Valores(l)), CStr(Valores(m)), CStr(Valores(n))) List1.AddItem combinacion Next Next Next Next Next Next List1.Visible = True Text1.Text = List1.ListCount ' el añadido es bastante rápido, no hace falta ponerlo más que al final, o en todo caso en un bucle previo (si fueran a meterse muchos miles) End If End Sub Private Function ConcatValues(i As String, j As String, k As String, l As String, m As String, n As String) As String ConcatValues = Format2Digitos(i) & Format2Digitos(j) & Format2Digitos(k) & Format2Digitos(l) & Format2Digitos(m) & Format2Digitos(n) End Function ' Formato: 2espacios + valor(2 dígitos) + espacio(s) + separador Private Function Format2Digitos(ByRef Valor As String, Optional ByVal Size As Byte = 8, Optional ByRef Separador As String = "|") As String Dim Salida As String, k As Integer Dim ConcatValues As String If (Len(Valor) = 1) Then Salida = (" 0" & Valor) Else Salida = (" " & Valor) End If k = (Len(Salida) + Len(Separador) - Size) If (k > 0) Then Salida = Salida & Space$(k) ConcatValues = (Salida & Separador) End Function
Private Sub Form_Load() CombinacionesDe6 20 End Sub
|
|
|
En línea
|
|
|
|
Serapis
|
Rl código lo escribí al vuelo, hay que repasarlo a medida que se transcribe.
No obstante, mañana lo reviso y lo pruebo y haré las correcciones que precisare.
|
|
|
En línea
|
|
|
|
Serapis
|
...eran 4 tonterías que deberías ser capaz de corregir... En cualquier caso aquí el código corregido... El control de la interfaz... Private Sub Form_Load() With HScroll1 .Min = 18 ' 15 .Max = 20 ' 25 .Value = 19 End With End Sub Private Sub HScroll1_Change() Label2.Caption = CStr(HScroll1.Value) & " Elementos en juego" End Sub Private Sub Command1_Click() Me.MousePointer = vbHourglass Call CombinacionesDe6(HScroll1.Value) Me.MousePointer = vbDefault End Sub
El código previo y corregido... Private Sub CombinacionesDe6(ByVal Cantidad As Byte) Dim Max As Integer, Total As Long, combinacion As String Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer Dim ci As String, cj As String, ck As String, cl As String, cm As String, cn As String Valores = GetArrayDeValores(Cantidad) If (SizeArray > 0) Then List1.Clear List1.Visible = False ' Esto hará que el añadido sea mucho más rápido Max = UBound(Valores) For i = 0 To Max - 5 ci = Format2Digitos(CStr(Valores(i))) For j = i + 1 To Max - 4 cj = ci & Format2Digitos(CStr(Valores(j))) For k = j + 1 To Max - 3 ck = cj & Format2Digitos(CStr(Valores(k))) For l = k + 1 To Max - 2 cl = ck & Format2Digitos(CStr(Valores(l))) For m = l + 1 To Max - 1 cm = cl & Format2Digitos(CStr(Valores(m))) For n = m + 1 To Max '.... lo que sea que vayas a hacer... por ejemplo añadirlos al listbox combinacion = cm & Format2Digitos(CStr(Valores(n))) 'combinacion = ConcatValues(CStr(Valores(i)), CStr(Valores(j)), CStr(Valores(k)), CStr(Valores(l)), CStr(Valores(m)), CStr(Valores(n))) List1.AddItem combinacion Total = (Total + 1) Next Next Next Next Next Next List1.Visible = True Label1.Caption = "Total Combinaciones: " & CStr(Total) ' el añadido es bastante rápido, no hace falta ponerlo más que al final, o en todo caso en un bucle previo (si fueran a meterse muchos miles) End If End Sub Private Function GetArrayDeValores(ByVal Cantidad As Byte) As Byte() Dim V() As Byte, v18() As String Const Val18 As String = "4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49" Const Val19 As String = "33", Val20 As String = "11" If ((Cantidad < 18) Or (Cantidad > 20)) Then MsgBox "No se ha contemplado el caso de un array con " & CStr(Cantidad) & " de ítems... " & vbCrLf & "Valores aceptados actualmente: 18-20" SizeArray = 0 Else v18 = Split(Val18, ", ") ' pasamos la constante a un array de strings ReDim V(0 To Cantidad) ' dimensionamos el array en la cantidad deseada For k = 0 To 18 ' pasamos los 18 valores del array de strings al array de bytes V(k) = CByte(v18(k)) Next If (Cantidad >= 19) Then V(19) = CByte(Val19) ' Si se solicitó 19 o 20 valores, pasamos el 19º If (Cantidad = 20) Then V(20) = CByte(Val20) ' ídem para el 20º End If SizeArray = Cantidad GetArrayDeValores = V ' devolvemos el array al tamaño solicitado y con los valores asignados. End If End Function 'Private Function ConcatValues(i As String, j As String, k As String, l As String, m As String, n As String) As String ' ConcatValues = Format2Digitos(i) & Format2Digitos(j) & Format2Digitos(k) & Format2Digitos(l) & Format2Digitos(m) & Format2Digitos(n) 'End Function ' Formato: 2espacios + valor(2 dígitos) + espacio(s) + separador Private Function Format2Digitos(ByRef Valor As String, Optional ByVal Size As Byte = 8, Optional ByRef Separador As String = "|") As String Dim Salida As String, k As Integer If (Len(Valor) = 1) Then Salida = (" 0" & Valor) Else Salida = (" " & Valor) End If k = (Size - (Len(Salida) + Len(Separador))) If (k > 0) Then Salida = (Salida & Space$(k)) Format2Digitos = (Salida & Separador) End Function
Y así se ve el resultado... (primera y yltima combinaciones para 20, usando los valores consiganos para 19 y 20. p.d.: Nota que he cambiado el textbox por un label... (el valor de un resultado no debe poderse editar). Los valores negativos de cuenta, sucede cuando superan el valor del tipo integer. Ya que es un tipo con signo, solo alcanza hasta los 32768 (0-32767). entonces cuando la lista añade más elementos, sigue sumando para ahora aparecen como negativos. Puedes hacer los cálculos, pero si superas luego los 65536, seguirá cometiendo errores (culpa de utilizar como contador un tipo entero de 15 bits, pero permitir más añadidos que esa cantidad). El mejor modo de obviar ese problema es llevar tu propio contador.
|
|
« Última modificación: 14 Junio 2024, 16:22 pm por Serapis »
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
Hola Serapis No se que hago mal que no hace la lista de las combinaciones en el list1 Private Sub Command1_Click() Me.MousePointer = vbHourglass Call CombinacionesDe6(HScroll1.Value) Me.MousePointer = vbDefault End Sub
Private Sub Form_Load() With HScroll1 .Min = 18 ' 15 .Max = 20 ' 25 .Value = 19 End With End Sub
Private Sub HScroll1_Change()
Label1.Caption = CStr(HScroll1.Value) & " Elementos en juego" End Sub
Private Sub CombinacionesDe6(ByVal Cantidad As Byte) Dim Max As Integer, Total As Long, combinacion As String Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer Dim ci As String, cj As String, ck As String, cl As String, cm As String, cn As String
Valores = GetArrayDeValores(Cantidad) If (SizeArray > 0) Then List1.Clear List1.Visible = False ' Esto hará que el añadido sea mucho más rápido Max = UBound(Valores) For i = 0 To Max - 5 ci = Format2Digitos(CStr(Valores(i))) For j = i + 1 To Max - 4 cj = ci & Format2Digitos(CStr(Valores(j))) For k = j + 1 To Max - 3 ck = cj & Format2Digitos(CStr(Valores(k))) For l = k + 1 To Max - 2 cl = ck & Format2Digitos(CStr(Valores(l))) For m = l + 1 To Max - 1 cm = cl & Format2Digitos(CStr(Valores(m))) For n = m + 1 To Max '.... lo que sea que vayas a hacer... por ejemplo añadirlos al listbox combinacion = cm & Format2Digitos(CStr(Valores(n))) 'combinacion = ConcatValues(CStr(Valores(i)), CStr(Valores(j)), CStr(Valores(k)), CStr(Valores(l)), CStr(Valores(m)), CStr(Valores(n))) List1.AddItem combinacion Total = (Total + 1) Next Next Next Next Next Next List1.Visible = True Label2.Caption = "Total Combinaciones: " & CStr(Total) ' el añadido es bastante rápido, no hace falta ponerlo más que al final, o en todo caso en un bucle previo (si fueran a meterse muchos miles) End If End Sub Private Function GetArrayDeValores(ByVal Cantidad As Byte) As Byte() Dim V() As Byte, v18() As String Const Val18 As String = "4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49" Const Val19 As String = "33", Val20 As String = "11" If ((Cantidad < 18) Or (Cantidad > 20)) Then MsgBox "No se ha contemplado el caso de un array con " & CStr(Cantidad) & " de ítems... " & vbCrLf & "Valores aceptados actualmente: 18-20" SizeArray = 0 Else v18 = Split(Val18, ", ") ' pasamos la constante a un array de strings ReDim V(0 To Cantidad) ' dimensionamos el array en la cantidad deseada For k = 0 To 18 ' pasamos los 18 valores del array de strings al array de bytes V(k) = CByte(v18(k)) Next If (Cantidad >= 19) Then V(19) = CByte(Val19) ' Si se solicitó 19 o 20 valores, pasamos el 19º If (Cantidad = 20) Then V(20) = CByte(Val20) ' ídem para el 20º End If SizeArray = Cantidad GetArrayDeValores = V ' devolvemos el array al tamaño solicitado y con los valores asignados. End If End Function 'Private Function ConcatValues(i As String, j As String, k As String, l As String, m As String, n As String) As String ' ConcatValues = Format2Digitos(i) & Format2Digitos(j) & Format2Digitos(k) & Format2Digitos(l) & Format2Digitos(m) & Format2Digitos(n) 'End Function ' Formato: 2espacios + valor(2 dígitos) + espacio(s) + separador Private Function Format2Digitos(ByRef Valor As String, Optional ByVal Size As Byte = 8, Optional ByRef Separador As String = "|") As String Dim Salida As String, k As Integer If (Len(Valor) = 1) Then Salida = (" 0" & Valor) Else Salida = (" " & Valor) End If k = (Size - (Len(Salida) + Len(Separador))) If (k > 0) Then Salida = (Salida & Space$(k)) Format2Digitos = (Salida & Separador) End Function
gracias
|
|
|
En línea
|
|
|
|
Serapis
|
Hola Serapis No se que hago mal que no hace la lista de las combinaciones en el list1
No entiendo por qué no va a rellenar el listado. Las instrucciones están ahí: 'Listi1.addItem combinacion'. Si a mi me funciona perfectamente y no has cambiado código, también debe funcionarte, no hay opción para que no funcione. Lo único que se me ocurre es que tengas más de un listbox, y el que es el 'list1', esté oculto, fuera de la vista, entonces se llena, pero no ves el resultado en el list2-3-4, que tuvieres en la vista. 1 Comenta la línea 'List1.Visible = False 2 Antes de añadir el item al listbox, añade la siguiente línea: msgbox combinacion 3 Si añadiste o cambiaste código, ejecuta paso a paso el código (tecla F8), de la función 'CombinacionesDe6'.
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
Hola Serapis He añadido el mensaje msgbox combinacion y no sale nada en el mensaje de msgbox combinacion solo tengo un list1 si puedes enviar tu archivo, seguro que es un error tonto de mi archivo gracias
|
|
|
En línea
|
|
|
|
Serapis
|
8 kb. contraseña (para evitar que sea manipulado y cuelen virus): ' foroelhacker' (sin las comillas simples). https://workupload.com/file/8qxjAGgFQ7Yp.d.: Debajo de las líneas: Valores = GetArrayDeValores(Cantidad) If (SizeArray > 0) Then
puedes colocar lo siguiente: Label1.Caption = "Generando combinaciones..." Label1.Refresh
|
|
« Última modificación: 15 Junio 2024, 15:49 pm por Serapis »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
problema con array
Programación Visual Basic
|
Free-Knowledgend
|
4
|
2,140
|
3 Julio 2006, 23:33 pm
por <--v1c1ous-->
|
|
|
Problema con Array
PHP
|
Riki_89D
|
5
|
2,946
|
12 Marzo 2009, 15:39 pm
por Riki_89D
|
|
|
Problema con for y array de cadenas.
Programación C/C++
|
jomag
|
3
|
2,237
|
7 Febrero 2014, 02:18 am
por jomag
|
|
|
Problema con Array
Programación C/C++
|
Ja_90
|
5
|
8,593
|
20 Octubre 2015, 19:29 pm
por Ja_90
|
|
|
Problema con Array
Java
|
Fryuio
|
0
|
1,675
|
5 Enero 2017, 17:53 pm
por Fryuio
|
|