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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Combis :(
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Combis :(  (Leído 3,256 veces)
luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Combis :(
« 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
  1. Public Class Form1
  2.  
  3.  
  4.  
  5.    Dim NumElementos As IEnumerable(Of Integer) =
  6.            {0, 3, 4, 5, 8}
  7.        {01, 13, 34, 55, 84}
  8.  
  9.  
  10.    Sub Combinaciones()
  11.  
  12.        For k = 2 To NumElementos
  13.  
  14.            i = i + 1
  15.  
  16.            For j = k To NumElementos
  17.  
  18.  
  19.            Next j
  20.  
  21.        Next k
  22.  
  23.    End Sub
  24.  
  25. End Class


Luis


« Última modificación: 20 Marzo 2016, 16:18 pm por luis456 » En línea

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

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Combis :(
« Respuesta #1 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:

Código:
  For k = 0 To NumElementos.Count -1
    
        Next k

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

¿No será que lo quieres así?:

Código:
   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
  1. Public Class Form1
  2.    Dim NumElementos As New ArrayList({0, 3, 4, 5, 8, 1, 13, 34, 55, 84})
  3.    Sub Combinaciones()
  4.        Dim N As New Random
  5.        Dim num As String = Nothing
  6.  
  7.        For k As Integer = 1 To (NumElementos.Count / 2)
  8.            num = ""
  9.            For j As Integer = 0 To 1
  10.                Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
  11.                NumElementos.Remove(NumAlt)
  12.                num += NumAlt.ToString
  13.            Next
  14.            MessageBox.Show(num)
  15.        Next
  16.  
  17.    End Sub
  18.  
  19.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  20.        Combinaciones()
  21.    End Sub
  22. 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
  1. Public Class Form1
  2.    Dim NumElementos As New ArrayList({0, 3, 4, 5, 8})
  3.    Dim NumElementos2 As New ArrayList({1, 13, 34, 55, 84})
  4.  
  5.    Sub Combinaciones()
  6.        Dim N As New Random
  7.        Dim num As String = Nothing
  8.  
  9.        For k As Integer = 1 To 5
  10.            num = ""
  11.  
  12.            Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
  13.            Dim NumAlt2 As Integer = NumElementos2(N.Next(NumElementos2.Count))
  14.            NumElementos.Remove(NumAlt)
  15.            NumElementos2.Remove(NumAlt2)
  16.            num = NumAlt.ToString & "-" & NumAlt2.ToString
  17.  
  18.            MessageBox.Show(num)
  19.        Next
  20.  
  21.    End Sub
  22.  
  23.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  24.        Combinaciones()
  25.    End Sub
  26. End Class
  27.  


« Última modificación: 18 Marzo 2016, 22:02 pm por Lekim » En línea

luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Re: Combis :(
« Respuesta #2 en: 19 Marzo 2016, 15:06 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:

Código:
  For k = 0 To NumElementos.Count -1
    
        Next k

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

¿No será que lo quieres así?:

Código:
   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
  1. Public Class Form1
  2.    Dim NumElementos As New ArrayList({0, 3, 4, 5, 8, 1, 13, 34, 55, 84})
  3.    Sub Combinaciones()
  4.        Dim N As New Random
  5.        Dim num As String = Nothing
  6.  
  7.        For k As Integer = 1 To (NumElementos.Count / 2)
  8.            num = ""
  9.            For j As Integer = 0 To 1
  10.                Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
  11.                NumElementos.Remove(NumAlt)
  12.                num += NumAlt.ToString
  13.            Next
  14.            MessageBox.Show(num)
  15.        Next
  16.  
  17.    End Sub
  18.  
  19.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  20.        Combinaciones()
  21.    End Sub
  22. 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
  1. Public Class Form1
  2.    Dim NumElementos As New ArrayList({0, 3, 4, 5, 8})
  3.    Dim NumElementos2 As New ArrayList({1, 13, 34, 55, 84})
  4.  
  5.    Sub Combinaciones()
  6.        Dim N As New Random
  7.        Dim num As String = Nothing
  8.  
  9.        For k As Integer = 1 To 5
  10.            num = ""
  11.  
  12.            Dim NumAlt As Integer = NumElementos(N.Next(NumElementos.Count))
  13.            Dim NumAlt2 As Integer = NumElementos2(N.Next(NumElementos2.Count))
  14.            NumElementos.Remove(NumAlt)
  15.            NumElementos2.Remove(NumAlt2)
  16.            num = NumAlt.ToString & "-" & NumAlt2.ToString
  17.  
  18.            MessageBox.Show(num)
  19.        Next
  20.  
  21.    End Sub
  22.  
  23.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  24.        Combinaciones()
  25.    End Sub
  26. End Class
  27.  


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


















En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Combis :(
« Respuesta #3 en: 19 Marzo 2016, 19:40 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:
Citar
For 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
  1. Dim intCol As IEnumerable(Of Integer) =
  2.    {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
  3.  
  4. Dim sb As New StringBuilder(capacity:=100)
  5. For x As Integer = 0 To (intCol.Count - 1) Step 2
  6.  
  7.    If (x < (intCol.Count - 1)) Then
  8.        sb.Append(String.Format("{0:00}, {1:00}", intCol(x), intCol(x + 1)))
  9.    Else
  10.        sb.Append(String.Format("{0:00}", intCol(x)))
  11.    End If
  12.  
  13.    sb.AppendLine()
  14.  
  15. Next
  16.  
  17. Console.WriteLine(sb.ToString)

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

PD: ¿Algún "pero" esta vez? :P.
« Última modificación: 19 Marzo 2016, 19:48 pm por Eleкtro » En línea


Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Combis :(
« Respuesta #4 en: 20 Marzo 2016, 14:13 pm »

Hola

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

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


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"  

 

« Última modificación: 20 Marzo 2016, 14:42 pm por Lekim » En línea

luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Re: Combis :(
« Respuesta #5 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
  1. Dim intCol As IEnumerable(Of Integer) =
  2.    {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
  3.  
  4. Dim sb As New StringBuilder(capacity:=100)
  5. For x As Integer = 0 To (intCol.Count - 1) Step 2
  6.  
  7.    If (x < (intCol.Count - 1)) Then
  8.        sb.Append(String.Format("{0:00}, {1:00}", intCol(x), intCol(x + 1)))
  9.    Else
  10.        sb.Append(String.Format("{0:00}", intCol(x)))
  11.    End If
  12.  
  13.    sb.AppendLine()
  14.  
  15. Next
  16.  
  17. MessageBox.Show(sb.ToString)  

Luis


En línea

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


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Re: Combis :(
« Respuesta #6 en: 20 Marzo 2016, 14:28 pm »

Hola

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

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


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

En línea

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

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Combis :(
« Respuesta #7 en: 20 Marzo 2016, 15:00 pm »

Si lo prefieres puedes meter la lista en un Array.

Código
  1.        Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As New List(Of String)
  2.        For Each N As Integer In NumElementos
  3.            For I As Integer = 0 To NumElementos.Count - 1
  4.                Secuencia.Add(String.Format("{0:00}, {1:00}", N, NumElementos(I)))
  5.            Next
  6.        Next
  7.  
  8.        '//Mete los elementos del Array (List) en una Variable String y la muestra
  9.        Dim lista As String = Nothing
  10.        For Each S As String In Secuencia : lista += S + Environment.NewLine : Next
  11.        MessageBox.Show(lista)
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Combis :(
« Respuesta #8 en: 20 Marzo 2016, 15:01 pm »

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

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
  1. Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
  2.  
  3. Dim count As Integer
  4. Dim pairsCol As IEnumerable(Of String) =
  5.    From value1 As Integer In intCol
  6.    Select String.Join(Environment.NewLine, (
  7.                       From value2 As Integer In intCol.Skip(Interlocked.Increment(count))
  8.                       Select String.Format("{0:00}, {1:00}", value1, value2)))
  9.  
  10. For Each pairs As String In pairsCol
  11.    Console.WriteLine(pairs)
  12.    Console.WriteLine("------")
  13. Next

Resultado de ejecución:
Citar
01, 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
  1. Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 34, 55, 84, 99}
  2.  
  3. Dim pairsCol As IEnumerable(Of String) =
  4.    From value1 As Integer In intCol
  5.    Select String.Join(Environment.NewLine, (
  6.                       From value2 As Integer In intCol
  7.                       Where (value2 <> value1)
  8.                       Select String.Format("{0:00}, {1:00}", value1, value2)))
  9.  
  10. For Each pairs As String In pairsCol
  11.    Console.WriteLine(pairs)
  12.    Console.WriteLine("------")
  13. Next

Resultado de ejecución:
Citar
01, 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
------
« Última modificación: 20 Marzo 2016, 15:13 pm por Eleкtro » En línea


Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Combis :(
« Respuesta #9 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
  1.  
  2.       Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
  3.        Dim nu As Integer = 0
  4.        For Each N As Integer In NumElementos : nu += 1
  5.            For I As Integer = nu To NumElementos.Count - 1
  6.                If N <> NumElementos(I) Then _
  7.                    Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
  8.            Next
  9.        Next
  10.        MessageBox.Show(Secuencia)
  11.  

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
  1.  
  2.      Dim NumElementos As IEnumerable(Of Integer) = {1, 3, 84, 99}, Secuencia As String = Nothing
  3.        For Each N As Integer In NumElementos
  4.            For I As Integer = 0 To NumElementos.Count - 1
  5.                If N <> NumElementos(I) Then _
  6.                    Secuencia += String.Format("{0:00}, {1:00}{2}", N, NumElementos(I), Environment.NewLine)
  7.            Next
  8.        Next
  9.        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



« Última modificación: 20 Marzo 2016, 16:10 pm por Lekim » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines