Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: luis456 en 18 Marzo 2016, 19:22 PM

Título: Combis :(
Publicado por: luis456 en 18 Marzo 2016, 19:22 PM
Hola estoy creando este codigo para combinar numeros de dos en dos pero me sale un error que no habia visto antes :)

" No se puede inferir el tipo de 'k' porque los límites del bucle y la cláusula step no se convierten en el mismo tipo "



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



   Dim NumElementos As IEnumerable(Of Integer) =
           {0, 3, 4, 5, 8}
       {01, 13, 34, 55, 84}


   Sub Combinaciones()

       For k = 2 To NumElementos

           i = i + 1

           For j = k To NumElementos


           Next j

       Next k

   End Sub

End Class



Luis
Título: Re: Combis :(
Publicado por: Lekim en 18 Marzo 2016, 19:44 PM
Hola

Podrías especificar un poco más. ¿Qué quieres hacer exactamente? ¿Combinar números de dos en dos aleatoriamente o de forma consecutiva a partir de un grupo de números?

En cualquier caso tu código tiene un montón de fallos, además no especificas tampoco cual es error que te marca (que hay muchos)


para empezar la declaración For/Next croe que debería ser:

  For k = 0 To NumElementos.Count -1
   
       Next k


por otro lado ¿Esto así?
 Dim NumElementos As IEnumerable(Of Integer) =
           {0, 3, 4, 5, 8}
       {01, 13, 34, 55, 84}


¿No será que lo quieres así?:

   Dim NumElementos As IEnumerable(Of Integer) = {0, 3, 4, 5, 8, 1, 13, 34, 55, 84}

En fin, explícate un poco

Podría ser algo así?

Código (vbnet) [Seleccionar]
Public Class Form1
   Dim NumElementos As New ArrayList({0, 3, 4, 5, 8, 1, 13, 34, 55, 84})
   Sub Combinaciones()
       Dim N As New Random
       Dim num As String = Nothing

       For k As Integer = 1 To (NumElementos.Count / 2)
           num = ""
           For j As Integer = 0 To 1
               Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
               NumElementos.Remove(NumAlt)
               num += NumAlt.ToString
           Next
           MessageBox.Show(num)
       Next

   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Combinaciones()
   End Sub
End Class




O podría ser esto...

Esto combina los números de NumElementos  con los de NumElementos2, de dos en dos y de forma aleatoria.

Código (vbnet) [Seleccionar]
Public Class Form1
   Dim NumElementos As New ArrayList({0, 3, 4, 5, 8})
   Dim NumElementos2 As New ArrayList({1, 13, 34, 55, 84})

   Sub Combinaciones()
       Dim N As New Random
       Dim num As String = Nothing

       For k As Integer = 1 To 5
           num = ""

           Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
           Dim NumAlt2 As Integer = NumElementos2(N.Next(NumElementos2.Count))
           NumElementos.Remove(NumAlt)
           NumElementos2.Remove(NumAlt2)
           num = NumAlt.ToString & "-" & NumAlt2.ToString

           MessageBox.Show(num)
       Next

   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Combinaciones()
   End Sub
End Class
Título: Re: Combis :(
Publicado por: luis456 en 19 Marzo 2016, 15:06 PM
Cita de: Lekim en 18 Marzo 2016, 19:44 PM
Hola

Podrías especificar un poco más. ¿Qué quieres hacer exactamente? ¿Combinar números de dos en dos aleatoriamente o de forma consecutiva a partir de un grupo de números?

En cualquier caso tu código tiene un montón de fallos, además no especificas tampoco cual es error que te marca (que hay muchos)


para empezar la declaración For/Next croe que debería ser:

  For k = 0 To NumElementos.Count -1
   
       Next k


por otro lado ¿Esto así?
 Dim NumElementos As IEnumerable(Of Integer) =
           {0, 3, 4, 5, 8}
       {01, 13, 34, 55, 84}


¿No será que lo quieres así?:

   Dim NumElementos As IEnumerable(Of Integer) = {0, 3, 4, 5, 8, 1, 13, 34, 55, 84}

En fin, explícate un poco

Podría ser algo así?

Código (vbnet) [Seleccionar]
Public Class Form1
   Dim NumElementos As New ArrayList({0, 3, 4, 5, 8, 1, 13, 34, 55, 84})
   Sub Combinaciones()
       Dim N As New Random
       Dim num As String = Nothing

       For k As Integer = 1 To (NumElementos.Count / 2)
           num = ""
           For j As Integer = 0 To 1
               Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
               NumElementos.Remove(NumAlt)
               num += NumAlt.ToString
           Next
           MessageBox.Show(num)
       Next

   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Combinaciones()
   End Sub
End Class




O podría ser esto...

Esto combina los números de NumElementos  con los de NumElementos2, de dos en dos y de forma aleatoria.

Código (vbnet) [Seleccionar]
Public Class Form1
   Dim NumElementos As New ArrayList({0, 3, 4, 5, 8})
   Dim NumElementos2 As New ArrayList({1, 13, 34, 55, 84})

   Sub Combinaciones()
       Dim N As New Random
       Dim num As String = Nothing

       For k As Integer = 1 To 5
           num = ""

           Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
           Dim NumAlt2 As Integer = NumElementos2(N.Next(NumElementos2.Count))
           NumElementos.Remove(NumAlt)
           NumElementos2.Remove(NumAlt2)
           num = NumAlt.ToString & "-" & NumAlt2.ToString

           MessageBox.Show(num)
       Next

   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Combinaciones()
   End Sub
End Class



Gracias por tu atención y disculpa que haya tardado en responder

LO que estoy tratando de hacer es que de una serie de números contenidos en la variable se combinen de dos en dos y  perdón que no puse que son de esta manera son números de dos dígitos

entrada
01. 03, 04, 05, 08,  13, 34, 55, 84

salida

01, 03
01, 04
01, 05
01, 08
01, 13
01, 34
01, 55
01, 84

03,04
03,05
03,08
03,13  ............................... asi con todos hasta acabar la secuencia

Y de nuevo gracias :)

Luis


















Título: Re: Combis :(
Publicado por: Eleкtro en 19 Marzo 2016, 19:40 PM
Cita de: luis456 en 18 Marzo 2016, 19:22 PM" No se puede inferir el tipo de 'k' porque los límites del bucle y la cláusula step no se convierten en el mismo tipo "

Hola!

Te está diciendo que no se puede inferir el tipo (sin asignar) de K, por que difiere del tipo de NumElementos.

Ese problema que se ve reflejado en la excepción es por que estás usando malas prácticas de las que ya te advertí en el pasado, debes intentar especificar explicitamente SIEMPRE el tipo de un objeto en lugar de dejar que el compiler lo intente inferir y así evitar ese tipo de errores.

Ejemplo:
CitarFor K As Integer = 2 ...

El segundo problema es que NumElementos no es un tipo Integer, sino una colección, así que lo que debes usar es la propiedad Count de dicha colección.




Puedes hacerlo de la siguiente manera:

Código (vbnet) [Seleccionar]
Dim intCol As IEnumerable(Of Integer) =
   {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}

Dim sb As New StringBuilder(capacity:=100)
For x As Integer = 0 To (intCol.Count - 1) Step 2

   If (x < (intCol.Count - 1)) Then
       sb.Append(String.Format("{0:00}, {1:00}", intCol(x), intCol(x + 1)))
   Else
       sb.Append(String.Format("{0:00}", intCol(x)))
   End If

   sb.AppendLine()

Next

Console.WriteLine(sb.ToString)


Resultado de ejecución:
Citar01, 03
04, 05
08, 13
34, 55
84, 99

PD: ¿Algún "pero" esta vez? :P.
Título: Re: Combis :(
Publicado por: Lekim en 20 Marzo 2016, 14:13 PM
Hola

Jaja, ahora queda más claro, gracias  ;-)

Código (vbnet) [Seleccionar]

       Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
       For Each N As Integer In NumElementos
           For I As Integer = 0 To NumElementos.Count - 1
               Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
           Next
       Next
       MessageBox.Show(Secuencia)



S2s




Explicación para añadir ceros delante de un número:
String.Format("{0}", 5) ---> devuelve "5"  

String.Format("{0} {1}", 5, 25) ---> devuelve "5 25"  

String.Format("{0}, {1}", 5, 25) ---> devuelve "5, 25"  

String.Format("{0:00}", 5) ---> devuelve "05"  

String.Format("{0:00}", 25) ---> devuelve "25"  

String.Format("{0:00} {1:00}", 5, 25) ---> devuelve "05 25"  

String.Format("{0:00} {1:00} {2:00}" , 5, 25, 8) ---> devuelve "05 25 08"  

String.Format("{0:00}, {1:00}, {2:00}" , 5, 25, 8) ---> devuelve "05, 25, 08"  



Título: Re: Combis :(
Publicado por: luis456 en 20 Marzo 2016, 14:23 PM
PD: ¿Algún "pero" esta vez? :P.


Jejejje luche hasta el final para que no hubiera " PERO " :)


Probando el codigo de elektro ahora me muestra esto (el codigo que me mostro Lekim le consegui otro uso me vino de perlas )

coleccion de numeros ( 1, 3, 4, 5, 8, 13, 34, 55, 84, 99 )

01 03
04 05
08 13
34 55
84 99


Pero jejje Yo nesecito me nuestre

01, 03
01, 04
01, 05
01, 08
01, 13
01, 34
01, 55
01, 84

despues se toma el seiguiente numero en este caso el tres y se combina haci hasta acabar con todos los numeros

03,04
03,05
03,08
03,13

Código (vbnet) [Seleccionar]
Dim intCol As IEnumerable(Of Integer) =
    {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}

Dim sb As New StringBuilder(capacity:=100)
For x As Integer = 0 To (intCol.Count - 1) Step 2

    If (x < (intCol.Count - 1)) Then
        sb.Append(String.Format("{0:00}, {1:00}", intCol(x), intCol(x + 1)))
    Else
        sb.Append(String.Format("{0:00}", intCol(x)))
    End If

    sb.AppendLine()

Next

MessageBox.Show(sb.ToString) 


Luis


Título: Re: Combis :(
Publicado por: luis456 en 20 Marzo 2016, 14:28 PM
Cita de: Lekim en 20 Marzo 2016, 14:13 PM
Hola

Jaja, ahora queda más claro, gracias  ;-)

Código (vbnet) [Seleccionar]

       Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
       For Each N As Integer In NumElementos
           For I = 0 To NumElementos.Count - 1
               Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
           Next
       Next
       MessageBox.Show(Secuencia)



S2s




Explicación para añadir ceros delante de un número:
String.Format("{0}", 5) ---> devuelve "5"  

String.Format("{0} {1}", 5, 25) ---> devuelve "5 25"  

String.Format("{0}, {1}", 5, 25) ---> devuelve "5, 25"  

String.Format("{0:00}", 5) ---> devuelve "05"  

String.Format("{0:00}", 25) ---> devuelve "25"  

String.Format("{0:00} {1:00}", 5, 25) ---> devuelve "05 25"  

String.Format("{0:00} {1:00} {2:00}" , 5, 25, 8) ---> devuelve "05 25 08"  

String.Format("{0:00}, {1:00}, {2:00}" , 5, 25, 8) ---> devuelve "05, 25, 08"  



Mientras escribia hacias lo mismo :) lo pruebo

gracias
Luis

Título: Re: Combis :(
Publicado por: Lekim en 20 Marzo 2016, 15:00 PM
Si lo prefieres puedes meter la lista en un Array.

Código (vbnet) [Seleccionar]
       Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As New List(Of String)
       For Each N As Integer In NumElementos
           For I As Integer = 0 To NumElementos.Count - 1
               Secuencia.Add(String.Format("{0:00}, {1:00}", N, NumElementos(I)))
           Next
       Next

       '//Mete los elementos del Array (List) en una Variable String y la muestra
       Dim lista As String = Nothing
       For Each S As String In Secuencia : lista += S + Environment.NewLine : Next
       MessageBox.Show(lista)
Título: Re: Combis :(
Publicado por: Eleкtro en 20 Marzo 2016, 15:01 PM
Cita de: luis456 en 20 Marzo 2016, 14:23 PMProbando el codigo de elektro ahora me muestra esto (el codigo que me mostro Lekim le consegui otro uso me vino de perlas )

coleccion de numeros ( 1, 3, 4, 5, 8, 13, 34, 55, 84, 99 )

01 03
04 05
08 13
34 55
84 99

Pero jejje Yo nesecito me nuestre

01, 03
01, 04
01, 05
01, 08
01, 13
01, 34
01, 55
01, 84

Tienes razón, culpa mia, no entendí bien el problema que querías resolver al leerlo deprisa, y simplemente tomé los valores en grupos de dos en dos, que es lo que creí que querías hacer.

Entonces lo que realmente quieres hacer es esto:
Código (vbnet) [Seleccionar]
Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}

Dim count As Integer
Dim pairsCol As IEnumerable(Of String) =
   From value1 As Integer In intCol
   Select String.Join(Environment.NewLine, (
                      From value2 As Integer In intCol.Skip(Interlocked.Increment(count))
                      Select String.Format("{0:00}, {1:00}", value1, value2)))

For Each pairs As String In pairsCol
   Console.WriteLine(pairs)
    Console.WriteLine("------")
Next


Resultado de ejecución:
Citar01, 03
01, 04
01, 05
01, 08
01, 13
01, 34
01, 55
01, 84
01, 99
------
03, 04
03, 05
03, 08
03, 13
03, 34
03, 55
03, 84
03, 99
------
04, 05
04, 08
04, 13
04, 34
04, 55
04, 84
04, 99
------
05, 08
05, 13
05, 34
05, 55
05, 84
05, 99
------
08, 13
08, 34
08, 55
08, 84
08, 99
------
13, 34
13, 55
13, 84
13, 99
------
34, 55
34, 84
34, 99
------
55, 84
55, 99
------
84, 99

O sino, debe ser esto otro:
Código (vbnet) [Seleccionar]
Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}

Dim pairsCol As IEnumerable(Of String) =
   From value1 As Integer In intCol
   Select String.Join(Environment.NewLine, (
                      From value2 As Integer In intCol
                      Where (value2 <> value1)
                      Select String.Format("{0:00}, {1:00}", value1, value2)))

For Each pairs As String In pairsCol
   Console.WriteLine(pairs)
   Console.WriteLine("------")
Next


Resultado de ejecución:
Citar01, 03
01, 04
01, 05
01, 08
01, 13
01, 34
01, 55
01, 84
01, 99
------
03, 01
03, 04
03, 05
03, 08
03, 13
03, 34
03, 55
03, 84
03, 99
------
04, 01
04, 03
04, 05
04, 08
04, 13
04, 34
04, 55
04, 84
04, 99
------
05, 01
05, 03
05, 04
05, 08
05, 13
05, 34
05, 55
05, 84
05, 99
------
08, 01
08, 03
08, 04
08, 05
08, 13
08, 34
08, 55
08, 84
08, 99
------
13, 01
13, 03
13, 04
13, 05
13, 08
13, 34
13, 55
13, 84
13, 99
------
34, 01
34, 03
34, 04
34, 05
34, 08
34, 13
34, 55
34, 84
34, 99
------
55, 01
55, 03
55, 04
55, 05
55, 08
55, 13
55, 34
55, 84
55, 99
------
84, 01
84, 03
84, 04
84, 05
84, 08
84, 13
84, 34
84, 55
84, 99
------
99, 01
99, 03
99, 04
99, 05
99, 08
99, 13
99, 34
99, 55
99, 84
------
Título: Re: Combis :(
Publicado por: Lekim en 20 Marzo 2016, 16:05 PM
hola de nuevo...

Bueno, creo que la pregunta está mas que respondida, pero tras revisar los comentarios me di cuenta que la secuencia de mi código, aunque lógica no era la que demandabas, así que pongo la rectificación y fiel a mi estilo ya que hay códigos que se entienden mejor que otros.

Código (vbnet) [Seleccionar]

      Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
        Dim nu As Integer = 0
        For Each N As Integer In NumElementos : nu += 1
            For I As Integer = nu To NumElementos.Count - 1
                If N <> NumElementos(I) Then _
                    Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
            Next
        Next
        MessageBox.Show(Secuencia)


Devuelve
01, 03
01, 84
01, 99
03, 84
03, 99
84, 99

( he reducido la secuencia pero puedes poner tantos números como quieras)


O bien:

Código (vbnet) [Seleccionar]

     Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
       For Each N As Integer In NumElementos
           For I As Integer = 0 To NumElementos.Count - 1
               If N <> NumElementos(I) Then _
                   Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
           Next
       Next
       MessageBox.Show(Secuencia)


Devuelve:
01, 03
01, 84
01, 99
03, 01
03, 84
03, 99
84, 01
84, 03
84, 99
99, 01
99, 03
99, 84



S2s



Título: Re: Combis :(
Publicado por: luis456 en 20 Marzo 2016, 16:17 PM
Cita de: Lekim en 20 Marzo 2016, 16:05 PM
hola de nuevo...

Bueno, creo que la pregunta está mas que respondida, pero tras revisar los comentarios me di cuenta que la secuencia de mi código, aunque lógica no era la que demandabas, así que pongo la rectificación y fiel a mi estilo ya que hay códigos que se entienden mejor que otros.

Código (vbnet) [Seleccionar]

      Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99, 868}, Secuencia As String = Nothing
       Dim nu As Integer = 0
       For Each N As Integer In NumElementos : nu += 1
           For I As Integer = nu To NumElementos.Count - 1
               If N <> NumElementos(I) Then _
                   Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
           Next
       Next
       MessageBox.Show(Secuencia)


Devuelve
01, 03
01, 84
01, 99
03, 84
03, 99
84, 99

( he reducido la secuencia pero puedes poner tantos números como quieras)


O bien:

Código (vbnet) [Seleccionar]

     Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
       For Each N As Integer In NumElementos
           For I As Integer = 0 To NumElementos.Count - 1
               If N <> NumElementos(I) Then _
                   Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
           Next
       Next
       MessageBox.Show(Secuencia)


Devuelve:
01, 03
01, 84
01, 99
03, 01
03, 84
03, 99
84, 01
84, 03
84, 99
99, 01
99, 03
99, 84



S2s


Perfecto y gracias por tu ayuda, ya que sin querer me ayudaste con el primer código que me pusiste con otra duda que tenia diferente a la planteada, super agradecido a ti ya a elektro por tan valiosa colaboración aunque siempre con elektro da miedo preguntar jejejje es muy regañón  (el sabe que es con aprecio jejej )

Dare por solucionado este post y espero que le valga a otros muchos estos códigos ya que realmente son combinatorias y suelen ser útiles sobre todo para los que trabajan con Claves  ::)


Saludos
Luis







Título: Re: Combis :(
Publicado por: Lekim en 20 Marzo 2016, 16:23 PM
De nada,

bueno en el código que has citado se me coló un 868,  :P porque estaba haciendo pruebas, por si acaso. En cuyo caso devolvería..

01, 03
01, 84
01, 99
01, 868
03, 84
03, 99
03, 868
84, 99
84, 868
99, 868

S2s




Además... que sobra la comparación  If N <> NumElementos ... en la secuencia del primer ejemplo. (Esto me ha ocurrido porque el primer ejemplo lo obtuve a partir del segundo, jeje)

Código (vbnet) [Seleccionar]
        Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
        Dim nu As Integer = 0
        For Each N As Integer In NumElementos : nu += 1
            For I As Integer = nu To NumElementos.Count - 1
                Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
            Next
        Next
        MessageBox.Show(Secuencia)