** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Numeración en líneas de un cuadro de texto
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoNumeración en líneas de un cuadro de texto

 Responder Responder
Autor
Mensaje
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Tema: Numeración en líneas de un cuadro de texto
    Enviado: 12/Septiembre/2022 a las 12:36
Hola amigos del foro.

Hoy vengo a trasladarles un pequeño problema que me ha surgido en el código de un programa de números que tengo entre manos.
He intentado cambiar varias veces los bucles pero no coge bien la numeración de los "i", cogiendo el 1 como primero y terminando en el último elemento del array.

Comentar que desde mi último post, he estado estudiando la utilización de matrices o arrays, y practicando con diversos ejemplos (sobre todo del tema de "juegos con números"), y he comprobado, como decían fcoval y Mihura que son muy interesantes y prácticos para solucionar ciertos problemas con valores generados dinámicamente....

en fin paso a pegar estas líneas, donde expongo las líneas de código que utilizo y el formato del formulario que empleo, ...

EXTRAER PRIMOS Y NO PRIMOS DE UNA LISTA DE 10 NUMEROS CONSECUTIVOS.

 Option Compare Database

Dim i As Integer, j As Integer, cont As Integer

Dim xnum As Integer

Dim listanum(10) As Integer

Dim Primos(10) As Integer

Dim NoPrimos(10) As Integer

Dim primernumero As Integer

 

Private Sub cmdInsertar_Click()

primernumero = InputBox("Introduce el primer número de la lista...")

 

 For i = 0 To 10 - 1

     listanum(i) = primernumero + i

     TxtNumeros.Value = TxtNumeros.Value & i + 1 & "- " & listanum(i) & vbCrLf

 Next i

End Sub

 '------------------------------------------- 

Private Sub cmdCalcular_Click()

Dim listanum2(10) As Integer

 

  For i = 0 To 10 - 1

     listanum2(i) = listanum(i)

  Next i

 

 For i = 0 To 10 - 1

    cont = 0

    xnum = listanum2(i)

       

    For j = 1 To xnum

        If (listanum2(i) Mod j = 0) Then

            cont = cont + 1

        End If

    Next j

   

    If cont = 2 Then

       Primos(i) = listanum2(i)

    Else

       NoPrimos(i) = listanum2(i)

    End If

   

 Next i

 

 For i = 0 To 10 - 1

   If Primos(i) <> 0 Then

      TxtPrimos.Value = TxtPrimos.Value & i + 1 & "- " & Primos(i) & vbCrLf

   End If

   If NoPrimos(i) <> 0 Then

      TxtNoPrimos.Value = TxtNoPrimos.Value & i + 1 & "- " & NoPrimos(i) & vbCrLf

   End If

 Next i

 End Sub

 

‘**********************************

Botones

INSERTAR             CALCULAR

 Cuadros de texto:

 Numeros:       Primos:     NoPrimos:

1-      10      2-  11           1-  10

2-      11      4- 13            3- 12

3-      12      8-  17           5- 14

4-      13      10- 19          6- 15

5-      14                            7- 16

6-      15                            9- 18

7-      16

8-      17

9-      18

10-   19

 

‘***********************************************

 

No consigo que numere bien los cuadros de texto de los primos y noPrimos:

 Primos:    1- 11            NoPrimos:  1- 10

               2- 13                             2- 12

               3- 17                             3- 14

               4- 19                             4- 15

                                                    5- 16

                                                    6- 18

 

He tratado de aplicar estas líneas, … pero tampoco funciona, sigue haciendo lo de antes, ..

 

p2 = UBound(Primos())

 np2 = UBound(NoPrimos())

 

 For i = 0 To p2

   If Primos(i) <> 0 Then

      TxtPrimos.Value = TxtPrimos.Value & i + 1 & "- " & Primos(i) & vbCrLf

   End If

 Next i

  For i = 0 To np2

   If NoPrimos(i) <> 0 Then

      TxtNoPrimos.Value = TxtNoPrimos.Value & i + 1 & "- " & NoPrimos(i) & vbCrLf

   End If

 Next i

'--------------

Puede ser que el error o falta de código sea elemental, pero no consigo encotrarlo.
Agradecería su ayuda, 

Saludos a todos.
Adrián.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14734
Enlace directo a este mensaje Enviado: 12/Septiembre/2022 a las 18:26
Como decía -Marta-, un código no es más que un montón de líneas con instrucciones colocadas con cierta gracia para que nuestra máquina haga lo que queremos. 

Pero en realidad no es así: las instrucciones harán lo que le DIGAMOS que haga, que no siempre coincide con lo que QUEREMOS que haga.

En este caso hace exactamente lo que pides. Los valores de i siempre iran desde el límite inferior(LBound) del array hasta el límite superior (UBound).

Creo que estás complicando en exceso el código. Yo lo plantearía así:
- Solicitar el primer numero
- Bucle de 0 a 9
- En cada iteración:
  + actualizar la lista de numeros
  + mirar si el número es primo (una función externa)
  + si lo es, actualizar la lista de primos; si no lo és, la de No-primos

El código seria parecido a esto:

    Dim lngNumero As Long
    Dim i As Integer
    
    Dim strNumeros As String
    Dim strPrimos  As String
    Dim strNoPrimos As String
    
    lngNumero = CLng(InputBox("Dame primer numero"))
    
    For i = 0 To 9
        strNumeros = strNumeros & i + 1 & "-" & lngNumero + i & vbCrLf
        If EsPrimo(lngNumero + i) Then
            strPrimos = strPrimos & i + 1 & "-" & lngNumero + i & vbCrLf
        Else
            strNoPrimos = strNoPrimos & i + 1 & "-" & lngNumero + i & vbCrLf
        End If
    Next i

Editado: ese código almacena el contenido en variables de texto. Deberás traspasar (o cambiar) las variables a los cuadros de texto adecuados.

Por otro lado tenemos la función que devuelve si es primo o no un número pasado como argumento:

Function EsPrimo(lngNumero As Long) As Boolean
    Dim l As Long
    Dim lngCuentaCeros As Long
    
    For l = 1 To lngNumero
        If lngNumero Mod l = 0 Then
            lngCuentaCeros = lngCuentaCeros + 1
        End If
    Next l
    
    EsPrimo = (lngCuentaCeros = 2)
End Function

Escrito del tirón.

Un saludo





Editado por xavi - 12/Septiembre/2022 a las 18:28
Xavi, un minyó de Terrassa

Mi web
Arriba
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 10:31
Hola Xavi, gracias por responder.

Tu repuesta es sencillamente genial, simple y directa.

Nosotros, los aprendices, le damos mil vueltas al asunto, y llenamos la hoja con líneas de código para conseguir un resultado (muchas veces imperfecto); en cambio vosotros, los maestros, nos asombráis con vuestra sencilla manera de resolver las cosas. 

Ya he probado tu código para mi ejemplo, y funciona genial.
La cuestión de la numeración en los dos cuadros de texto (para los primos y para los no primos) no se puede conseguir, pero no importa demasiado, ya que es esta un cuestión más estética, de presentación en pantalla, que otra cosa.
En tu código sólo utilizas un array para recoger y presentar los 10 números, y el resto de acciones se resuelven sin necesidad de ellos. En cambio yo utilizaba cuatro.

En fin, tu respuesta me ha aportado una lección de perspectiva y resolución. Gracias.

Por mi parte, nada más que añadir, quedando totalmente resuelto el asunto de este post.

Saludos a todos.
Adrián.







Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: La Gloria
Estado: Sin conexión
Puntos: 3859
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 11:06
Publicado originalmente por Adrianet Adrianet escribió:


La cuestión de la numeración en los dos cuadros de texto (para los primos y para los no primos) no se puede conseguir, 

¿Qué parte es la que no se puede conseguir?

Igual si es posible si nos dices donde te falla... o donde no es exactamente como quieres.

Un saludo.

Luis
El Búho es un pajarraco
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14734
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 11:26
Creo que mi código devuelve, para cada cadena de primos/no-primos tanto el número como su posición dentro de la secuencia inicial.

Pero si te vale, perfecto.

Por cierto: no utilizo ningún array ;-)

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 12:36
Hola Ibuluz,

A continuación pego el código final que estoy usando en el ejemplo ( que es de Xavi, adaptado con los nombres de mis variables)

Extraer primos y no primos de una lista de 10 números consecutivos.

 

Option Compare Database

Dim i As Integer, j As Integer, cont As Integer

Dim xnum As Integer

Dim listanum(10) As Integer

Dim Primos(10) As Integer

Dim NoPrimos(10) As Integer

Dim numero As Integer

 

Private Sub cmdInsertar_Click()

Numero = InputBox("Introduce el primer número de la lista...")

 

 For i = 0 To 9

     listanum(i) = Numero + i

     TxtNumeros.Value = TxtNumeros.Value & i + 1 & "- " & listanum(i) & vbCrLf

 

        If Esprimo(Numero + i) Then

              TxtPrimos.Value = TxtPrimos.Value & i + 1 & "- " & Numero + I  & vbCrLf

        Else

 TxtNoPrimos.Value = TxtNoPrimos.Value & i + 1 & "- " & Numero + I  & vbCrLf

        End If

 Next i

 

End Sub

 

Function EsPrimo(Numero As Integer) As Boolean

    Dim l As Integer

    Dim lngCuentaCeros As Integer

        For l = 1 To Numero

        If Numero Mod l = 0 Then

            lngCuentaCeros = lngCuentaCeros + 1

        End If

    Next l

        EsPrimo = (lngCuentaCeros = 2)

End Function

'----------------

Y ahora pego la parte resultante, donde no pone la numeración de líneas:

esto es lo que ofrece el código:

Cuadros de texto:

 Numeros:       Primos:     NoPrimos:

1-      10      2-  11           1-  10

2-      11      4- 13            3- 12

3-      12      8-  17           5- 14

4-      13      10- 19          6- 15

5-      14                            7- 16

6-      15                            9- 18

7-      16

8-      17

9-      18

10-   19

 ‘***********************************************

 No consigo que numere bien los cuadros de texto de los primos y noPrimos:

 Esto es lo que me gustaría que el código hiciera, numerando la líneas resultantes de la extracción de numeros primos y no primos

Primos: 1- 11               NoPrimos:  1- 10

               2- 13                                   2- 12

               3- 17                                   3- 14

               4- 19                                   4- 15

                                                           5- 16

                                                           6- 18

 

 Saludos

Adrián.



Arriba
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 12:43
Hola Xavi,..

Tienes toda la razón, no usas ningún array, ... tal y como está tu línea de código:

strNumeros = strNumeros & i + 1 & "-" & lngNumero + i & vbCrLf

He sido yo quien ha reutilizado esa línea usando el array, al poner esto que aparece en rojo:

  For i = 0 To 9

     listanum(i) = Numero + i

     TxtNumeros.Value = TxtNumeros.Value & i + 1 & "- " & listanum(i) & vbCrLf

 

Disculpa por mi error de apreciación y gracias de nuevo.

Saludos


 


Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14734
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 13:41
Vale. Yo entendí que querías mostrar la posición de cada numero en el conjunto "completo" cuando, simplemente, quieres ordenarlos de 1 a n dentro de cada lista.

Yo crearía 2 contadores y los incrementaría en cada evaluación de primo/no-primo. Ese contador es el que utilizaria en lugar del "& i + 1" que aparece antes de mostrar el numero.

Además, en tu código, podrías eliminar todos los Array sin problemas.
Xavi, un minyó de Terrassa

Mi web
Arriba
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 13:54
Muy cierto, lo que dices

en efecto, puedo hacer
For i = 0 To 9
  TxtNumeros.Value = TxtNumeros.Value & i + 1 & "- " & Numero + i & vbCrLf
Next i

y no uso el array.

Voy a ver como aplico tu consejo de los dos contadores, y resuelvo lo de la numeración de los numeros obtenidos como resultado en primos y no primos.

Un saludo
Adrián


Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: La Gloria
Estado: Sin conexión
Puntos: 3859
Enlace directo a este mensaje Enviado: 13/Septiembre/2022 a las 15:27
La misma función de Xavi pero con las numeraciones que quieres

 Dim i As Integer
    
    Dim iNopri As Integer
    Dim iSiPri As Integer
    
    Dim strNumeros As String
    Dim strPrimos  As String
    Dim strNoPrimos As String
    
    lngNumero = CLng(InputBox("Dame primer numero"))
    
    iNopri = 0
    iSiPri = 0
    
    
    For i = 0 To 9
        strNumeros = strNumeros & i + 1 & "-" & lngNumero + i & vbCrLf
        If EsPrimo(lngNumero + i) Then
            strPrimos = strPrimos & iSiPri + 1 & "-" & lngNumero + i & vbCrLf
            iSiPri = iSiPri + 1
        Else
            strNoPrimos = strNoPrimos & iNopri + 1 & "-" & lngNumero + i & vbCrLf
            iNopri = iNopri + 1
        End If
    Next i

Un saludo.


Editado por lbauluz - 13/Septiembre/2022 a las 15:28
El Búho es un pajarraco
Arriba
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Enviado: 14/Septiembre/2022 a las 08:02
Hola Ibauluz
Sí, efectivamente, eso mismo que tu has hecho lo hice anoche, ...  siguiendo las indicaciones de Xavi.
Gracias, de todas formas por tu aportación en este post.

Bueno, ahora sí que creo que queda el tema cerrado. 

Si me permiten, pego aquí el código, tal y como lo tengo en mi formulario. Este código, ofrecido por el maestro Xavi, es la solución simplificada al código que yo implementaba en un principio, complicándome la cosa al utilizar varios arrays, y que sin utilizarlos muestra el resultado de una manera muy eficiente. Gracias Xavi.
,----------------------------------------------------

EXTRAER PRIMOS Y NO PRIMOS DE UNA LISTA DE 10 NUMEROS CONSECUTIVOS.

Option Compare Database

Dim i As Integer, j As Integer, Numero As Integer

Dim iprimo As Integer, inoprimo As Integer

 

Private Sub cmdCalcular_Click()

Numero = InputBox("Introduce el primer número de la lista...")

iprimo = 0

inoprimo = 0

 

For i = 0 To 9

     TxtNumeros.Value = TxtNumeros.Value & i + 1 & "- " & Numero + i & vbCrLf

 

        If EsPrimo(Numero + i) Then

              TxtPrimos.Value = TxtPrimos.Value & iprimo + 1 & "- " & Numero + i & vbCrLf

              iprimo = iprimo + 1

        Else

              TxtNoPrimos.Value = TxtNoPrimos.Value & inoprimo + 1 & "- " & Numero + i & vbCrLf

              inoprimo = inoprimo + 1

        End If

Next i

End Sub

 

Function EsPrimo(Numero As Integer) As Boolean

    Dim i As Integer

    Dim CuentaCeros As Integer

   

    For i = 1 To Numero

        If Numero Mod i = 0 Then

            CuentaCeros = CuentaCeros + 1

        End If

    Next i

    EsPrimo = (CuentaCeros = 2)

End Function


Saludos a todos los miembros del foro.
Adrián.

Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable