Mis malas combinaciones :(

Iniciado por luis456, 9 Agosto 2014, 15:07 PM

0 Miembros y 6 Visitantes están viendo este tema.

luis456

Al ataque de nuevo jeje bueno ya ustedes saben como se frustra uno cuando no se logra hacer funcionar algo, vueltas y vueltas y nada tengo el siguiente programa que funciona bien hasta llegar a la función de combinar los numeros pero es un código de basic que quiero implementar pero no soy capaz ( como siempre)


Código (vbnet) [Seleccionar]
Public Class Form1
    Dim maximum As Short = 99
    Dim x As Integer = 0
    Dim Número As Double
    Private TextBoxes As TextBox() = {Nothing}
    Private Result1 As Int32(), Result2 As Int32(), Result3 As Int32()
    Private _textBox As Object
    Private Property ListBox1Count As Integer
    ReadOnly MAX As Integer = 99

    Dim auxiliar As Integer
    Dim auxiliar1 As Integer

    Dim auxiliar2 As String
    Dim auxiliar3 As String
    Dim anterior As String

    Dim recorrer As Integer
    Dim recorrer1 As Integer
    Dim recorrer2 As Integer
    Dim recorrer3 As Integer

    Private Property Calcular As Object

    Private Property TextBox(ByVal TextBoxCount As Short) As Object
        Get
            Return _textBox
        End Get
        Set(ByVal value As Object)
            _textBox = value
        End Set
    End Property

    Public Sub solonumeros(ByRef e As System.Windows.Forms.KeyPressEventArgs)
        ' evitar letras
        If Char.IsDigit(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsControl(e.KeyChar) Then
            e.Handled = False
        ElseIf Char.IsSeparator(e.KeyChar) Then
            e.Handled = False
        Else
            e.Handled = True
        End If

    End Sub


    ReadOnly Property Num1 As Int32
        Get
            Return CInt(TextBox1.Text)
        End Get
    End Property

    ReadOnly Property Num2 As Int32
        Get
            Return CInt(TextBox2.Text)
        End Get
    End Property
    ReadOnly Property Num3 As Int32
        Get
            Return CInt(TextBox3.Text)
        End Get
    End Property
   

    Private Sub Sumar(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click


        Result1 = {Num1 + 1, Num1 + 2, Num1 + 4, Num1 + 6, Num1 - 4, Num1 - 1} _
                  .Distinct().ToArray ' Elimino duplicados

        Result2 = {Num2 + 1, Num2 + 2, Num2 + 3, Num2 - 1, Num2 - 2, Num1 - 3} _
                  .Distinct().ToArray ' Elimino duplicados

        Result3 = {Num3 - 1, Num3 - 2, Num3 - 3, Num3 + 2, Num3 + 3, Num3 + 5} _
                  .Distinct().ToArray ' Elimino duplicados

       
        Dim Rand As New Random
        ' Concateno, y...
        ' Elimino duplicados, y...
        ' Selecciono los números inferiores a MAX, y...
        ' Convierto los números mayores a MAX a números aleatorios entre 0 y MAX.
        Dim Result As IEnumerable(Of Integer) =
            (Result1.Concat(Result2).Concat(Result3)).
            Distinct.
            Select(Function(Value As Integer)
                       Return If(Value < MAX, Value, Rand.Next(0, MAX))
                   End Function)


        ListBox1.Items.AddRange(Result.Cast(Of Object).ToArray)
       
        ' Result2---------------------------------------------------------
        Dim Rand2 As New Random
        ' Concateno, y...
        ' Elimino duplicados, y...
        ' Selecciono los números inferiores a MAX, y...
        ' Convierto los números mayores a MAX a números aleatorios entre 0 y MAX.
        Dim Result22 As IEnumerable(Of Integer) =
            (Result1).
            Distinct.
            Select(Function(Value As Integer)
                       Return If(Value < MAX, Value, Rand.Next(0, MAX))
                   End Function)



        ListBox2.Items.AddRange(Result22.Cast(Of Object).ToArray)



        Dim Rand22 As New Random
        ' Concateno, y...
        ' Elimino duplicados, y...
        ' Selecciono los números inferiores a MAX, y...
        ' Convierto los números mayores a MAX a números aleatorios entre 0 y MAX.
        Dim Result222 As IEnumerable(Of Integer) =
            (Result2).
            Distinct.
            Select(Function(Value As Integer)
                       Return If(Value < MAX, Value, Rand.Next(0, MAX))
                   End Function)

        ListBox3.Items.AddRange(Result222.Cast(Of Object).ToArray)


       
       
    End Sub
    ' funcion combinar la variable " resul " que contiene la cantidad de numeros a combinar (no funciona)
    ' esto es de basic pero es para cojer la idea :) no se como hacerlo en net

     For recorrer = 1 To Len(resul)
            auxiliar = Mid(palabra, recorrer, 1)
            For recorrer1 = 1 To Len(resul)
                auxiliar1 = Mid(palabra, recorrer1, 1)
                For recorrer2 = 1 To Len(resul)
                    auxiliar2 = Mid(palabra, recorrer2, 1)
                    For recorrer3 = 1 To Len(resul)
                        auxiliar3 = Mid(resul, recorrer3, 1)
                        If anterior <> auxiliar3 Then

                            Print(auxiliar & auxiliar1 & auxiliar2 & auxiliar3) <------------mostrar esto en un lixbox

                        End If
                        anterior = auxiliar3
                    Next
                Next
            Next
        Next
    End Sub



    '--------------------------- limpiar texboxes
    Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        For Each obj As Control In Me.Controls
            If (TypeOf obj Is TextBox) Then
                obj.Text = ""
            End If
            If (TypeOf obj Is GroupBox) Then
                For Each caja As Control In obj.Controls
                    If (TypeOf caja Is TextBox) Then
                        caja.Text = ""
                    End If
                Next
            End If

            ListBox1.Items.Clear()
            ListBox2.Items.Clear()
            ListBox3.Items.Clear()
           

        Next
    End Sub


End Class
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

Cita de: luis456 en  9 Agosto 2014, 15:07 PMfunciona bien hasta llegar a la función de combinar los numeros pero es un código de basic que quiero implementar pero no soy capaz ( como siempre)

¿Que es exactamente lo que "falla"?, y en caso de dar error, ¿cual es el error?.

saludos








luis456

#2
En la parte de las combinaciones me dice que se esperaba una declaración  ???

resul no esta declarado
palabra no declarado

de paso he visto un error que tenia y era que tenia que hacer un boton para introduce la funcion jejej

Código (vbnet) [Seleccionar]
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ' funcion combinar la variable " resul " que contiene la cantidad de numeros a combinar (no funciona)
        ' esto es de basic pero es para cojer la idea :) no se como hacerlo en net

        For recorrer = 1 To Len(resul)
            auxiliar = Mid(palabra, recorrer, 1)
            For recorrer1 = 1 To Len(resul)
                auxiliar1 = Mid(palabra, recorrer1, 1)
                For recorrer2 = 1 To Len(resul)
                    auxiliar2 = Mid(palabra, recorrer2, 1)
                    For recorrer3 = 1 To Len(resul)
                        auxiliar3 = Mid(resul, recorrer3, 1)
                        If anterior <> auxiliar3 Then

                            Print(auxiliar & auxiliar1 & auxiliar2 & auxiliar3)
                        End If
                        anterior = auxiliar3
                    Next
                Next
            Next
        Next
    End Sub
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#3
Cita de: luis456 en  9 Agosto 2014, 21:37 PM
En la parte de las combinaciones me dice que se esperaba una declaración  ???

resul no esta declarado
palabra no declarado

Luis, si te pido la información de un error no espero escuchar tu versión modificada del mensaje de error, sino el mensaje de error tal cual es, ¿sino como esperas que te ayudemos a depurarlo o encontremos información al respecto? (en este caso no hacia falta buscar nada, con tu explicación fue suficiente intuir el problema, pero la próxima vez quizás no sea tan intuitivo),
no creo que sea tan dificil darle click derecho al error y luego darle al botón de "Copiar" para pegarlo aquí de esta manera:
'resul' is not declared. It may be inaccessible due to its protection level.

Disulpa pero sabes que soy muy estricto con los detalles, proporcionar la información del error (el mensaje y el stacktrace, sin modificar) es el detalle más importante que se debería tener en cuenta cuando alguien tiene una duda.

Dicho esto, el error se debe a que no has declarado ninguna variable con el nombre 'resul' ni 'palabra', si quieres solucionar el error debes declararlas ...obviamente, jeje.
Código (vbnet) [Seleccionar]
Dim resul As ¿? = ¿?
Dim palabra As String = ""


Fuera de los Subs tienes declaradas las variables 'Result1', 'Result2' y 'Result3'.
Luego en el bloque del método 'Sumar' tienes una variable 'result' declarada, la 'vida' de esta variable se termina al finalizar el método.
Luego dentro del mismo bloque de 'Sumar' tienes una variable llamada 'Result22' y otra 'Result222'

¿Que lio es ese?, en serio, depeja todo ese lio de variables, colócalas al inicio del código (es decir, fuera de los subs), asígnales un nombre apropiado a cada variable para saber cual es su finalidad y así no dar lugar a equivocaciones, también podrías añadirle un pequeño comentario a cada una de las variables para dejarlo más claro incluso, y luego inizializa cada variable ahí mismo o cuando sea necesario si lo prefieres...

Creo que solo tú te puedes hacerte una idea de que variables deberían ir en 'resul' y 'palabra' para poder corregir esa parte del código que mostraste.

Saludos!








luis456

Bien te esplico mi proyecto :) jejej a ver si me hago entender, como siempre pasa uno sabe lo que quiere pero nunca logro hacerlo entender o explicar

input como tu dices :)

la variable result contiene x numeros que van desde 01 hasta el 99 pero según los resultados pueden ser menos.

supongamos que que la variable contenga estos números; ( pongo solo hasta el 30 para hacerlo corto )


input
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


con estos números hay que formar grupos o combinaciones de 10 números saltando de dos en dos:

salida...

01 04 07 10 13 16 19 22 25 28

02 05 08 11 14 17 20 23 26 29

03 06 09 12 15 18 21 24 27 30

04 07 10 13 16 19 22 24 28  ?  <- aca rellenar con un numero dentro del rango 01 al 99 y por supuesto no se repita en la conbinacion esto es cuando se agoten los números de que tenga la variable

05 08 11 14 17 20 23 26 29  ? < igual poner numero dentro del rango y que no repita y esto hasta que acabe con el ultimo numero que seria el numero 30


30 ? ? ? ? ? ? ? ? ? ?

Motrar de menor a mayor en un lisxbot



saludos


Luis


Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#5
Cita de: luis456 en 15 Agosto 2014, 21:16 PM04 07 10 13 16 19 22 24 28  ?  <- aca rellenar con un numero dentro del rango 01 al 99 y por supuesto no se repita en la conbinacion esto es cuando se agoten los números de que tenga la variable

1.
¿el número del 1 al 99 del interogante debe ser aleatorio? (ej: ¿daría igual si es 5 o 95?), o por lo contrario debería seguir un orden de incremento (primero el 1, luego en el siguiente interrogante el 2, y en otro interrogante el 3, etc...)

2.
¿el número del interogante debe ser un número del 1 al 99, pero ese número además debe existir dentro de la variable Result? (y, repito lo del punto .1, ¿debe ser aleatorio?)



En teoría supongo que con un For asignándole un Step de 2 e incrementando el valor de una variable que usariamos para especificar el índice del elemento inicial en cada repetición del búcle sería suficiente, pero lo de los interrogantes lo veo algo más complicado, quizás no lo sea tanto, aclárame eso y veré lo que puedo hacer.

Saludos!








luis456

Cita de: Eleкtro en 16 Agosto 2014, 03:29 AM
1.
¿el número del 1 al 99 del interogante debe ser aleatorio? (ej: ¿daría igual si es 5 o 95?), o por lo contrario debería seguir un orden de incremento (primero el 1, luego en el siguiente interrogante el 2, y en otro interrogante el 3, etc...)

2.
¿el número del interogante debe ser un número del 1 al 99, pero ese número además debe existir dentro de la variable Result? (y, repito lo del punto .1, ¿debe ser aleatorio?)




En teoría supongo que con un For asignándole un Step de 2 e incrementando el valor de una variable que usariamos para especificar el índice del elemento inicial en cada repetición del búcle sería suficiente, pero lo de los interrogantes lo veo algo más complicado, quizás no lo sea tanto, aclárame eso y veré lo que puedo hacer.

Saludos!



Diossssssss son las 4 y bastante de la madrugada  vengo de fiesta y estas aca jo descanza chico mañana te cuento :)

luis



Que tu sabiduria no sea motivo de Humillacion para los demas

luis456


Hola

no debe ser aleatorio, ya que siempre cuando se ejecute el programa siempre deben salir las mismas combinaciones salvo que cambie el imput o los numeros en la variable

los números a rellenar no importa estén o no en la variable siempre y cuando no repitan en la misma combinación y estén dentro del rango establecido .y termina cuando acabe el ultimo numero de la variable


Buen dia ;)

Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#8
Cita de: luis456 en 16 Agosto 2014, 11:40 AMlos números a rellenar no importa estén o no en la variable siempre y cuando no repitan en la misma combinación

Sinceramente, no se si es esto lo que andas buscando, pero es que con todo el material que se te ha ofrecido a lo largo del tiempo (incluyendo el siguiente código), creo que ya debería ser suficiente para que pudieras adaptar el código a tus necesidades haciendole los cambios que creas necesario.

Bueno, a ver si esta vez es la buena,
los números a rellenar no se repiten en la combinación actual, pero como siempre hay un "pero"... quizás te referías a que no se repitiera en ninguna de las combinaciones tampoco, pero eso sería imposible con un rango del 1 al 99 (ya que con los 30 números fijos de tu ejemplo y en combinaciones de 10 dígitos, sería necesario más de 99 números distintos aleatorios para rellenar los interrogantes, así que supongo que no lo habré entendido mal).

Nota: En la lista Combo se va generando la combinación actual, y una vez la combinación se completa ésta se añade a la colección Combos.

El código:

Código (vbnet) [Seleccionar]
Public Class LuisClass

   ReadOnly Randomizer As New Random

   ReadOnly FixedValues As Integer() =
       Enumerable.Range(1I, 30I).ToArray ' 1 to 30

   ReadOnly RandomValues As Integer() =
       Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30

   Private Sub Test() Handles MyBase.Shown

       Dim IndexCounter As Integer = FixedValues.First ' 1
       Dim LenCounter As Integer = 0I

       Const NumStep As Integer = 3I
       Const NumLen As Integer = 10I

       Dim Combo As New List(Of Integer)
       Dim Combos As New List(Of List(Of Integer))

       Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30

           For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3

               Combo.Add(Num)
               LenCounter += 1I

               If LenCounter >= NumLen Then ' Esto no es necesario en este ejemplo porque siempre dará Falso, pero lo dejo aquí.
                   Exit For
               End If

           Next ' Num

           If LenCounter < NumLen Then ' If LenCounter < 10

               For RandomNum As Integer = 1I To (NumLen - LenCounter)

                   Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last)

                   Do Until Not Combo.Contains(n)
                       n = Randomizer.Next(RandomValues.First, RandomValues.Last)
                   Loop

                   Combo.Add(n)

               Next ' RandomNum

           End If ' LenCounter < NumLen

#If DEBUG Then ' #Debug
           Debug.WriteLine(String.Join(", ", Combo))
           ' Stop
#End If

           Combos.Add(Combo)
           Combo.Clear()

           IndexCounter += 1I
           LenCounter = 0I

       Loop ' IndexCounter >= FixedValues.Last

   End Sub ' Test

End Class





Output (lo he formateado manualmente en el editor de texto con un RegEx para añadirle los "0"):

01, 04, 07, 10, 13, 16, 19, 22, 25, 28
02, 05, 08, 11, 14, 17, 20, 23, 26, 29
03, 06, 09, 12, 15, 18, 21, 24, 27, 30
04, 07, 10, 13, 16, 19, 22, 25, 28, 08
05, 08, 11, 14, 17, 20, 23, 26, 29, 09
06, 09, 12, 15, 18, 21, 24, 27, 30, 22
07, 10, 13, 16, 19, 22, 25, 28, 03, 23
08, 11, 14, 17, 20, 23, 26, 29, 18, 19
09, 12, 15, 18, 21, 24, 27, 30, 14, 22
10, 13, 16, 19, 22, 25, 28, 17, 08, 14
11, 14, 17, 20, 23, 26, 29, 02, 24, 07
12, 15, 18, 21, 24, 27, 30, 04, 22, 13
13, 16, 19, 22, 25, 28, 20, 27, 04, 01
14, 17, 20, 23, 26, 29, 21, 09, 02, 10
15, 18, 21, 24, 27, 30, 29, 26, 08, 13
16, 19, 22, 25, 28, 11, 20, 03, 04, 10
17, 20, 23, 26, 29, 28, 02, 03, 21, 09
18, 21, 24, 27, 30, 01, 26, 13, 17, 25
19, 22, 25, 28, 20, 16, 29, 08, 21, 15
20, 23, 26, 29, 10, 09, 01, 08, 07, 05
21, 24, 27, 30, 03, 28, 23, 22, 18, 17
22, 25, 28, 14, 15, 18, 13, 29, 24, 10
23, 26, 29, 21, 13, 18, 05, 07, 22, 14
24, 27, 30, 04, 29, 17, 23, 02, 28, 25
25, 28, 24, 11, 19, 07, 21, 08, 02, 03
26, 29, 15, 09, 25, 18, 11, 28, 20, 06
27, 30, 18, 19, 03, 06, 24, 16, 21, 23
28, 14, 04, 19, 21, 18, 26, 24, 01, 03
29, 09, 08, 14, 02, 19, 28, 07, 17, 27
30, 04, 05, 01, 18, 21, 16, 11, 14, 02








luis456

#9
Gracias elektro

Como creo no saber nada :) algunas cosas ya que me da este error


Error   1   No se puede encontrar el evento 'Shown'.   ( edito ya lo resolví)

otra cosa " leyendo el codigo donde pones

Código (vbnet) [Seleccionar]
Enumerable.Range(1I, 30I).ToArray ' 1 to 30

asumo que el programa lee que son números desde el 01 al 30 correlativamente ? si es así, no es la idea jejej ya que sabes que yo extraigo en el viejo programa unos resultados que varían y pueden ser 01 05 19 22 34 55 66 88 99 por ejemplo,y como no logro entender donde pongo mi variable para probarlo a ver

también perdona mi ignorancia pero donde muestro los resultados  estoy poniendo esto pero solo me sale  " colección "
Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(combos.Cast(Of Object).ToArray)

gracias por tu infinita paciencia

luis
Que tu sabiduria no sea motivo de Humillacion para los demas