elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010  (Leído 2,552 veces)
arturoro

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010
« en: 14 Noviembre 2015, 07:10 am »

Hola a todos y buenas noches o dias:

Estuve leyendo acerca del Programa para hacer combinaciones de numeros, y vi que el usuario pkj, hizo y modifico un programa en vb 6.0, y lo puse en vb.net 2010, en donde podias poner el tamaño del grupo y la lista de numeros que querias formar, yo quiero calcular y grabar en un archivo todas las combinaciones de 8 grupos de 2, ya sea numero, letras o la combinacion, por ejemplo el grupo de 8 seria: "AA,BB,CC,15,EE,20,GG,01" y calcular todas las varibles que pueden salir, segun en el propio programa, el total de variables son 40320, y yo deseo grabar todas esas variables, claro, sin repetir.

Al momento de ejecutar el programa con las variables ya descritas, solo hace el primer calculo o mejor dicho, coge las primeras variables, hasta ahi, todo bien, pero, ya no hace los otros calculo, solo saca la primera linea y termina, estuve observando y si muevo el total de la matriz donde guarda los datos obtenidos, me manda error en la matriz de los numeros.

Les paso el link en donde el usuario PKJ (agradezco su valiosa aportacion, ya que es lo que deseo) pone su programa, esta en vb 6.0:

https://foro.elhacker.net/programacion_visual_basic/programa_para_hacer_combinaciones_de_numeros-t414603.10.html

Yo le hice pequeñas modificaciones, les paso el programa para que me puedan orientar o en su defecto ayudar, esta en vb.net 2010

Código
  1. Public Class Form1
  2.    Public TamGrupos As Integer = 8 ' Tamaño de los grupos
  3.    Public ListaDeNumeros As String = "AA,BB,CC,DD,EE,FF,GG,HH" ' lista de numeros separados por comas
  4.    Public Parar As Integer
  5.  
  6.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  7.        Parar = 1
  8.    End Sub
  9.    Private Function CalculaTotal(ByVal TamGrupos As Integer, ByVal MaximoValor As Integer) As Long
  10.        Dim C1 As Double
  11.        Dim C2 As Double
  12.        Dim F As Double
  13.  
  14.        C1 = 1
  15.        C2 = 1
  16.        For F = 1 To TamGrupos
  17.            C1 = C1 * F
  18.        Next F
  19.  
  20.        For F = MaximoValor To (MaximoValor - (TamGrupos - 1)) Step -1
  21.            C2 = C2 * F
  22.        Next F
  23.        CalculaTotal = C2 / C1
  24.  
  25.    End Function
  26.  
  27.  
  28.    Private Sub CreaGrupos(ByVal TamGrupos As Integer, ByVal TopeOListaDeNumerosSeparadosPorComas As String, ByRef ListaDevuelta() As String)
  29.        ' Busqueda de combinaciones.
  30.        ' Dados los numeros de TopeOListaDeNumerosSeparadosPorComas,
  31.        ' saca todos los grupos no repetidos de "TamGrupos" numeros
  32.        ' y los devuelve en la matriz Lista()
  33.        ' Por repetido se entiende que "1,2,3" es igual que "1,3,2", igual que "2,1,3", etc...
  34.        ' Ejm: 1,2,3,4 de 2 en 2 = 6 combinaciones
  35.        ' 1,2 - 1,3 - 1,4 - 2,3 - 2,4 - 3,4
  36.        ' Opcionalmente, en lugar de una lista de números puedes poner un solo número.
  37.        ' En ese caso la listadenumeros seran los números desde el 1 hasta el que pongas.
  38.  
  39.        Dim F As Double
  40.        Dim Linea As String
  41.        Dim Num As Double
  42.        Dim Total As Double
  43.        Dim Ap() As Double
  44.        Dim MaximoValor As Long
  45.  
  46.        Dim MatrizDeNumeros() As String
  47.        MatrizDeNumeros = Split(TopeOListaDeNumerosSeparadosPorComas, ",")
  48.        MaximoValor = UBound(MatrizDeNumeros) + 1
  49.  
  50.        If MaximoValor = 1 And Val(MatrizDeNumeros(0)) > 0 Then
  51.            MaximoValor = Val(MatrizDeNumeros(0))
  52.            ReDim MatrizDeNumeros(MaximoValor - 1)
  53.            For F = 1 To MaximoValor
  54.                MatrizDeNumeros(F - 1) = F
  55.            Next F
  56.        End If
  57.  
  58.        Total = CalculaTotal(TamGrupos, MaximoValor)
  59.  
  60.        ReDim Ap(TamGrupos)
  61.  
  62.        ReDim ListaDevuelta(Total - 1)
  63.        Dim Contador As Long
  64.        Contador = -1
  65.  
  66.        Parar = 0
  67.  
  68.        ' Cogemos las primeras
  69.        For F = 1 To TamGrupos
  70.            Ap(F) = F
  71.        Next F
  72.  
  73. OtraVez:
  74.        'Preparo la linea con la combinacion
  75.        Linea = ""
  76.        For F = 1 To TamGrupos - 1
  77.            Linea = Linea & MatrizDeNumeros(Ap(F) - 1) & " , "
  78.        Next F
  79.        Linea = Linea & MatrizDeNumeros(Ap(TamGrupos) - 1)
  80.  
  81.        ' Guardo la combiancion
  82.        Contador = Contador + 1
  83.        ListaDevuelta(Contador) = Linea
  84.  
  85.        'Label4.Caption = Contador + 1 ' Muestro el progreso
  86.  
  87.        Application.DoEvents()
  88.        If Parar = 1 Then GoTo Fin
  89.  
  90.        Num = TamGrupos + 1
  91.  
  92. Repetir1:
  93.        Num = Num - 1  ' Cogemos la apuesta(num) (en principio la ultima)
  94.  
  95.        'La aumentamos...
  96.        Ap(Num) = Ap(Num) + 1
  97.  
  98.        ' si es mayor de la cuenta...
  99.        If Ap(Num) > (MaximoValor - (TamGrupos - Num)) Then
  100.  
  101.            ' si es la ap(1) se acaba
  102.            If Num = 1 Then GoTo Fin
  103.  
  104.            ' ...aumentamos la anterior
  105.            GoTo Repetir1
  106.        End If
  107.  
  108.        ' Si no llega a su limite se mira si alguna ha llegado
  109.        ' a su maximo
  110.        ' Si NUM no apunta a la ultima AP() es que
  111.        ' alguna ap() ha llegado a su maximo
  112.        ' entonces reiniciamos todas las siguientes...
  113.        If Num <> TamGrupos Then
  114.            For F = Num + 1 To TamGrupos
  115.                '....dandoles el valor de la anterior + 1...
  116.                Ap(F) = Ap(F - 1) + 1
  117.            Next F
  118.        End If
  119.  
  120.        ' ... Y se da por valida
  121.        GoTo OtraVez
  122.  
  123. Fin:
  124.        Parar = 1
  125.  
  126.    End Sub
  127.  
  128.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  129.  
  130.        If Parar = 0 Then Parar = 1 : Exit Sub
  131.  
  132.        Dim Matriz() As String = Nothing ' matriz donde recibiremos la lista
  133.  
  134.        CreaGrupos(TamGrupos, ListaDeNumeros, Matriz)
  135.  
  136.        'Aqui manipulas la matriz como quieras
  137.        ' por ejemplo pasandola a un listbox
  138.  
  139.        ListBox1.Visible = False
  140.        Dim F As Long
  141.        For F = 0 To UBound(Matriz)
  142.            ListBox1.Items.Add(Matriz(F))
  143.        Next F
  144.        ListBox1.Visible = True
  145.  
  146.    End Sub
  147. End Class

De antemano Muchas GRACIAS!!!  ;-)


« Última modificación: 20 Diciembre 2015, 07:34 am por Eleкtro » En línea

pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Re: Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010
« Respuesta #1 en: 22 Noviembre 2015, 09:46 am »

Hola Arturoro.
No tengo muy claro lo que explicas ni como te ha salido el numero 40320.
Las combinaciones sin repetición de 8 elementos en grupos de 2 creo que serian algo como 7+6+5+4+3+2+1
En tu ejemplo:
7
AA,BB
AA,CC
AA,15
AA,EE
AA,20
AA,GG
AA,01
6
BB,CC
BB,15
BB,EE
BB,20
BB,GG
BB,01
5
CC,15
CC,EE
CC,20
CC,GG
CC,01
4
15,EE
15,20
15,GG
15,01
3
EE,20
EE,GG
EE,01
2
20,GG
20,01
1
GG,01

El problema que veo es que pones grupos de 8 donde deberias poner un 2
Public TamGrupos As Integer = 8 ' Tamaño de los grupos
De modo que solo te muestra 1 grupo con los 8 elementos

Saludos





« Última modificación: 22 Noviembre 2015, 09:49 am por pkj » En línea

arturoro

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010
« Respuesta #2 en: 24 Noviembre 2015, 03:09 am »

Hola PKJ y gracias por responder   ;-) :

Si, creo que no me explique bien, tu programa esta excelente, solo deseo que los 8 grupos con elementos de 2, haga las combinaciones, y debe de salir mas o menos asi:

GRUPO DE 8 CON 2 ELEMENTOS CADA UNO: AA,BB,CC,8E,Z1,X1,Y0,01     :rolleyes:

Las combinaciones serian mas o menos as1:

AA,BB,CC,8E,Z1,X1,Y0,01
BB,AA,CC,8E,Z1,X1,Y0,01
01,BB,AA,CC,8E,Z1,X1,Y0
CC,8E,Z1,X1,Y0,01,BB,AA

... Y asi sucesivamente hasta que ya no existan mas combinaciones, ya sea poner un listbox, o un archivo.

Gracias por todo y perdona mi ignorancia

SALUDOS!!!  :laugh:
En línea

pkj

Desconectado Desconectado

Mensajes: 59



Ver Perfil
Re: Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010
« Respuesta #3 en: 24 Noviembre 2015, 12:29 pm »

Entonces no es mi funcion lo que necesitas.

No se me ocurría por donde pillarlo, asi que he usado una sub recursiva muy chula que nos dejó seba123neo, con algunas modificaciones.

Aquí está la sub original:
http://foro.elhacker.net/programacion_vb/combinaciones_vb-t240009.0.html

Y esto es lo que he sacado:

Hace falta un command button y un listbox.

Código
  1. Option Explicit
  2. Private Sub Command1_Click()
  3.  Dim F As Long
  4.  Dim F2 As Long
  5.  Dim Matriz1() As String
  6.  Dim Matriz2() As String
  7.  Dim MatrizFinal() As String
  8.  Dim Linea As String
  9.  Dim Contador As Long
  10.  Dim ListaElementos As String
  11.  
  12.  List1.Clear
  13.  
  14.  ListaElementos = "AA,BB,CC,15,EE,20,GG,01" ' max. 10 elementos
  15.  
  16.  Matriz1 = Split(ListaElementos, ",") 'separamos los elementos
  17.  For F = 0 To UBound(Matriz1) ' creamos una linea con X numeros
  18.    Linea = Linea & CStr(F)
  19.  Next F
  20.  
  21.  ReDim Matriz2(0)
  22.  Call Combinaciones(Linea, Matriz2) ' creamos la matriz con las combinaciones de los X numeros
  23.  
  24.  ReDim MatrizFinal(0)
  25.  For F = 0 To UBound(Matriz2) - 1
  26.    Linea = ""
  27.    For F2 = 1 To UBound(Matriz1) + 1 ' reemplazamos los numeros por los elementos de la lista
  28.      Linea = Linea & Matriz1(Val(Mid$(Matriz2(F), F2, 1))) & ","
  29.    Next F2
  30.    ReDim Preserve MatrizFinal(Contador)
  31.    MatrizFinal(Contador) = Left(Linea, Len(Linea) - 1) 'guardamos quitando la ultima coma
  32.    Contador = Contador + 1
  33.  Next F
  34.  
  35.  ' mostramos el resultado
  36.  MsgBox "Total " & Contador & " grupos" ' mostramos la cantidad de grupos extraidos
  37.  For F = 0 To UBound(MatrizFinal)
  38.    List1.AddItem MatrizFinal(F) ' y los cargamos en el listbox
  39.  Next F
  40.  
  41.  
  42. End Sub
  43.  
  44. Private Sub Combinaciones(Palabra As String, ByRef Matriz() As String, Optional strFixed As String)
  45.  
  46.    Dim i As Integer
  47.  
  48.    If Len(Palabra) > 1 Then
  49.  
  50.        For i = 1 To Len(Palabra)
  51.  
  52.            Combinaciones Left$(Palabra, i - 1) & Mid$(Palabra, i + 1), Matriz, strFixed & Mid$(Palabra, i, 1)
  53.  
  54.        Next i
  55.  
  56.    Else
  57.        Matriz(UBound(Matriz)) = strFixed & Palabra
  58.        ReDim Preserve Matriz(UBound(Matriz) + 1)
  59.  
  60.    End If
  61.  
  62. End Sub

A la sub de seba123neo solo le he añadido una matriz donde ir dejando los grupos que luego convertiremos segun nuestra necesidad.
Es mejor usar matrices porque un listbox tiene más limitaciones de capacidad.

Espero que te sirva.
Saludos
En línea

arturoro

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010
« Respuesta #4 en: 25 Noviembre 2015, 22:39 pm »

Gracias PKJ, es exactamente lo que necesito  ;-)  , esta en vb 6.0, lo voy a convertir (jejeje!! si eso aplica) a vb.net 2010, y lo voy a subir, y tambien y como una pequeña aportacion y un gran gracias a PKJ, les pongo otro calculo de combinaciones en vb.net 2010, por si alguien le interesa y le saca provecho.

Solo necesitan 2 textbox, 1 listbox y 1 boton.

Código
  1. Public Class Form1
  2.  
  3.    Sub Permutaciones(ByVal a() As String, ByVal j As Integer, ByVal k As Integer, ByVal lista As ListBox)
  4.        Dim i As Integer
  5.        Dim s As String = ""
  6.        Dim sTemp As String
  7.        If j = 1 Then
  8.            For i = 1 To k
  9.                s = s & a(i)
  10.            Next i
  11.            lista.Items.Add(s)
  12.        Else
  13.            For i = 1 To j
  14.                sTemp = a(i)
  15.                a(i) = a(j)
  16.                a(j) = sTemp
  17.                Permutaciones(a, j - 1, k, lista)
  18.                sTemp = a(j)
  19.                a(j) = a(i)
  20.                a(i) = sTemp
  21.            Next i
  22.        End If
  23.    End Sub
  24.  
  25.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  26.        lbResultados.Items.Clear()
  27.        If txtVariables.Text.Trim.Length >= 2 Then
  28.            Dim x As Integer
  29.            Dim i As Integer
  30.            Dim a() As String
  31.            x = Len(txtVariables.Text)
  32.            ReDim a(x)
  33.            For i = 1 To Len(txtVariables.Text)
  34.                a(i) = Mid(txtVariables.Text, i, 1)
  35.            Next i
  36.            Permutaciones(a, x, x, lbResultados)
  37.            txtTotal.Text = lbResultados.Items.Count.ToString
  38.        Else
  39.            MsgBox("Introduzca un cadena valida")
  40.        End If
  41.    End Sub
  42. End Class

GRACIAS POR TODO!!!   ;-) :rolleyes: ;-) :rolleyes:
« Última modificación: 20 Diciembre 2015, 07:34 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.701



Ver Perfil
Re: Duda acerca del calculo de combinaciones de numeros y letras en vb.net 2010
« Respuesta #5 en: 20 Diciembre 2015, 07:33 am »

Lo siento, llego tarde al tema (es lo que sucede si publicas en la sección incorrecta).

Ya lo has solucionado de una manera, pero si por casualidad lees esto quiero preguntarte si el rendimiento es un factor importante para tu algoritmo, ya que en caso afirmativo entonces estás desaprovechando todo el potencial que .Net nos ofrece.

Para cálculos de complejidad computacional cómo son las permutaciones y combinaciones, puedes utilizar el paralelismo para ganar una elevada velocidad de procesamiento al utilizar todos los nucleos disponibles, y evitar todos esos wrappers de Vb6 que utilizaste reemplazándolos por el uso de LINQ (o al menos utilizar un For pero con los métodos de manipulación de string equivalentes y el método Array.Copy en lugar de ReDim), ganando así velocidad, mucho más estabilidad del algoritmo y reducción/legibilidad del código, a costa de perder una cantidad ínfima de rendimiento que ya habrías ganado al reemplazar el código vb6-estilizado.

Si lo necesitas dímelo y desarrollo una solución, pero trata de explicame mostrando un ejemplo con las expectativas del resultado de ejecución, ya que no me ha quedado del todo claro que quieres hacer con esos ocho grupos, como quieres calcular las permutaciones;
¿quieres intercambiar las posiciones de cada grupo preservando los 2 caracteres de cada grupo?, ¿o quieres sustituir de forma incrementativa cada caracter de cada grupo?.

Saludos!
« Última modificación: 20 Diciembre 2015, 07:37 am por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa que entretege todas las combinaciones posibles de letras de una palabra
Programación C/C++
freakx 0 4,604 Último mensaje 23 Enero 2012, 04:55 am
por freakx
Como saber todas las combinaciones posibles de letras y numeros?
Programación C/C++
peterfly 8 25,816 Último mensaje 15 Julio 2012, 18:26 pm
por DickGumshoe
Combinaciones letras o numeros « 1 2 »
.NET (C#, VB.NET, ASP)
luis456 11 5,964 Último mensaje 8 Febrero 2014, 11:43 am
por luis456
formar combinaciones de 7 y 8 numeros con 25 numeros « 1 2 ... 5 6 »
.NET (C#, VB.NET, ASP)
luis456 51 22,604 Último mensaje 31 Octubre 2014, 17:48 pm
por luis456
Duda verificacion solo letras y numeros!
Programación C/C++
LucasNahuel 1 917 Último mensaje 13 Mayo 2016, 15:59 pm
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines