Autor Tema: hacer un algoritmo en pseint sobre numeros en inverso  (Leído 2092 veces)

Gatoxzerot

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Buenas gente, me pidieron hacer un algoritmo en pseint, sobre colocar de 5 cifras de numeros en inversa, todo bien ahi lo hice y me sale normal, pero cuando el profesor me pide escribir de una cifra de 1 a 4, sobran casillas odbio, esas casillas se ponen en cero y como salen los num en inversos, con los ceros que sobra lo hacen ver un numero mayor y no deberia ser asi. Aqui muestro mi avanze, que funciona con 5 cifras, pero cn menores cifras los espacios vacios me ponen en 0, de igual forma informo que no puedo utilizar otro comando mayor recien, solo hasta el comando "segun", y eso que otros conectores o palabras avanzados no se deben colocar. (es de mi profe que recien enseña y no quiere adelantarnos):

Algoritmo NUMEROS_EN_INVERSOS
   //INGRESE UN NUMERO DE CINCO CIFRAS DE TALK FORMA QUE SE
   //REPORTE EN FORMA INVERTIDA
   //EJEMPLO: 12345 REPORTE: 54321
   Definir N, N0, N1, N2, N3, N4, N5, NC Como Entero
   ESCRIBIR "ESCRIBE LOS NUMEROS QUE QUIERES INVERTIR"
   LEER N
   Si (N >= 1 y n <= 99999) Entonces
   N4 <- N MOD 10
   N <- trunc(N/10)
   N3 <- N MOD 10
   N <- trunc(N/10)
   N2 <- N MOD 10
   N <- trunc(N/10)
   N1 <- N MOD 10
   N <- trunc(N/10)
   N0 <- N MOD 10
   N <- trunc(N/10)
   Si (N1 > 0) y (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
        NC <- N4 * 10000 + N3 * 1000 + N2 * 100 + N1 * 10 + N0
    SiNo
        Si (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
            NC <- N4 * 1000 + N3 * 100 + N2 * 10 + N1
        SiNo
            Si (N3 > 0) y (N4 > 0) Entonces
                NC <- N4 * 100 + N3 * 10 + N2
            SiNo
                Si (N4 > 0) Entonces
                    NC <- N4 * 10 + N3
                SiNo
                    NC <- N4
                FinSi
            FinSi
        FinSi
    FinSi   
   Escribir "EL NUMERO EN INVERSO ES ", NC
    SiNO
      Escribir "NO SE PUEDE INVERTIR ESE NUMERO "
   FinSi
FinAlgoritmo


¿Que me falta o en que me equivoco para que no salgan los ceros, cuando invierto los numeros?

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: hacer un algoritmo en pseint sobre numeros en inverso
« Respuesta #1 en: 10 de Mayo 2023, 19:52 »
A ver si puedo ayudarte, porque Pseint apenas lo conozco. Cuando yo estudié programación, hace ya siglos, esto no existía y el pseudocódigo lo escribíamos con papel y lápiz. Lo compilábamos en nuestro cerebro xD, y nunca lo veíamos ejecutarse realmente.


Para intentar detectar qué está ocurriendo, puedes añadir líneas de código que te ayuden a saber por donde está discurriendo realmente la ejecución del programa.
En Pseint tienes un modo ejecución paso a paso que puede ayudar a depurar el programa, pero muchas veces es más rápido e intuitivo añadir temporalmente una línea de código con algún mensaje en pantalla que te indique por donde está fluyendo el código.

Por ejemplo, se supone que si introduces 4 cifras, el programa debería fluir por la "alternativa" que hay después del primer SiNo, ¿verdad?
Pues vamos a comprobar si realmente eso está ocurriendo, añadiendo un mensaje en pantalla cuando el código discurra por esa alternativa

Citar
Si (N >= 1 y n <= 99999) Entonces
      N4 <- N MOD 10
      N <- trunc(N/10)
      N3 <- N MOD 10
      N <- trunc(N/10)
      N2 <- N MOD 10
      N <- trunc(N/10)
      N1 <- N MOD 10
      N <- trunc(N/10)
      N0 <- N MOD 10
      N <- trunc(N/10)
      Si (N1 > 0) y (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
         NC <- N4 * 10000 + N3 * 1000 + N2 * 100 + N1 * 10 + N0
      SiNo
         Si (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
            Escribir "4 cifras introducidas"
            NC <- N4 * 1000 + N3 * 100 + N2 * 10 + N1

         SiNo
            Si (N3 > 0) y (N4 > 0) Entonces
               NC <- N4 * 100 + N3 * 10 + N2
            SiNo
               Si (N4 > 0) Entonces
                  NC <- N4 * 10 + N3
               SiNo
                  NC <- N4
               FinSi
            FinSi
         FinSi
      FinSi   

Si lo ejecutamos, oh sorpresa, ese mensaje no aparece en pantalla. El programa no está discurriendo por donde esperábamos.
A ver, pongamos mensajes similares en todas las alternativas posibles.
Citar
      Si (N1 > 0) y (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
         Escribir "5 cifras introducidas"
         NC <- N4 * 10000 + N3 * 1000 + N2 * 100 + N1 * 10 + N0
      SiNo
         Si (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
            Escribir "4 cifras introducidas"
            NC <- N4 * 1000 + N3 * 100 + N2 * 10 + N1
         SiNo
            Si (N3 > 0) y (N4 > 0) Entonces
            Escribir "3 cifras introducidas"
               NC <- N4 * 100 + N3 * 10 + N2
            SiNo
               Si (N4 > 0) Entonces
                  Escribir "2 cifras introducidas"
                  NC <- N4 * 10 + N3
               SiNo
                  Escribir "1 cifra introducida"
                  NC <- N4
               FinSi
            FinSi
         FinSi
      FinSi   

Si probamos distintas longitudes de cifra, vemos algo curiosos.
Si el números es de 5 o de 4 cifras, el código va por el mismo sitio.
Si es de 3 cifras, lo identifica como si fueran 4 cifras.
Si es 2 cifras, lo identifica como si fuera 3
Si es de 1, para el programa son 2...

Algo ocurre que hace que no se evalúe correctamente la longitud de cifras.

Y seguramente es que no estamos haciendo las preguntas correctas.

Llama un poco la atención el que para preguntar si es un número de 5 cifras, solo estamos evaluando 4 variables (N1,N2,N3,N4).
Y para preguntar si es de 4 cifras, solo evaluamos 3 (N2,N3,N4)
Para preguntar si es de 3 cifras, solo se evalúan 2 (N3,N4)
Y para saber si es de 2, solo se evalúa N4.

Quizás deberíamos preguntar por el mismo número de variables que las cifras que nos interesan.
Para preguntar por 5 cifras, vamos a incluir a N0 -> (N0,N1,N2,N3,N4).
Para preguntar por 4 cifras, incluyamos a N1 -> (N1,N2,N3,N4).
Y así sucesivamente...
Citar
      Si (N0 > 0) y (N1 > 0) y (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
         Escribir "5 cifras introducidas"
         NC <- N4 * 10000 + N3 * 1000 + N2 * 100 + N1 * 10 + N0
      SiNo
         Si (N1 > 0) y (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
            Escribir "4 cifras introducidas"
            NC <- N4 * 1000 + N3 * 100 + N2 * 10 + N1
         SiNo
            Si (N2 > 0) y (N3 > 0) y (N4 > 0) Entonces
               Escribir "3 cifras introducidas"
               NC <- N4 * 100 + N3 * 10 + N2
            SiNo
               Si (N3 > 0) y (N4 > 0) Entonces
                  Escribir "2 cifras introducidas"
                  NC <- N4 * 10 + N3
               SiNo
                  Escribir "1 cifra introducida"
                  NC <- N4
               FinSi
            FinSi
         FinSi
      FinSi 

Si lo ejecutamos, veremos que ahora sí identifica correctamente la longitud de cifras  ;D
Así que este era el problema, ya puedes quitar los mensajes en pantalla que hemos introducido, o también puedes dejarlos si quieres.

Por cierto, para preguntar si es de 1 cifra, se podría preguntar por N4 para continuar con la misma lógica que se ha aplicado con las otras alternativas, pero no es necesario.

Al principio de todo ya se ha preguntado si N es mayor que 0. Y si esto se cumple, ya está garantizado que N4 también será mayor que 0. Así que no hace falta preguntarlo, sería redundante.
Se podría quitar de también N4 de las otras preguntas alternativas y funcionaría igual.

Sin embargo, el programa no es perfecto, hay problemas con la cifra 0

Si yo introduzco 01234, dice que son 4 cifras y publica 4321.
Esto es totalmente correcto, sin problema aquí.

Pero, si introducimos por ejemplo 12340, aquí vienen los problemas.

Ese es un número de 5 cifras, no hay duda, pero ese 0 confunde al programa y la cosa no va bien
Código: [Seleccionar]
*** Ejecución Iniciada. ***
ESCRIBE LOS NUMEROS QUE QUIERES INVERTIR
> 12340
1 cifra introducida
EL NUMERO EN INVERSO ES 0
*** Ejecución Finalizada. ***

Si quitamos (N4 >0) de las preguntas de los Si Entonces, mejora un poco el resultado, pero sigue sin ser correcto
Código: [Seleccionar]
*** Ejecución Iniciada. ***
ESCRIBE LOS NUMEROS QUE QUIERES INVERTIR
> 12340
5 cifras introducidas
EL NUMERO EN INVERSO ES 4321
*** Ejecución Finalizada. ***

Y de todos modos, si el 0 estuviera en medio, la cosa va a peor
Código: [Seleccionar]
*** Ejecución Iniciada. ***
ESCRIBE LOS NUMEROS QUE QUIERES INVERTIR
> 12034
2 cifras introducidas
EL NUMERO EN INVERSO ES 43
*** Ejecución Finalizada. ***

Bien, este problema creo que no tiene solución, si seguimos intentando solucionarlo creando un nuevo valor entero con todas las cifras de forma invertida, que es lo que estamos haciendo en la variable NC.

He probado varias formas de hacerlo y ninguna termina de funcionar bien del todo.
Y es porque no hay forma de insertar un 0 en mitad de un valor entero de forma sencilla.
Es una limitación por la forma en que funcionan los valores enteros.
Podría hacerse tal vez de alguna forma supercomplicada, con montones de Si Entonces anidados, para decidir si una cifra conviene multiplicarla por 10, o por 100, o por 1000.... para añadir un cero extra en el valor entero.

Si cambiamos el enfoque y no intentamos crear un nuevo valor entero, encontraremos formas más sencillas de resolverlo.
Una sería tratar las cifras como caracteres y concatenarlas en una cadena con la función CONCATENAR()
Pero posiblemente aún no la conozcas ni te dejen usarla.

Otra posibilidad es ir escribiendo en pantalla directamente cada cifra que conseguimos al hacer la operación N MOD 10

Para que salgan juntas en la misma línea, podemos usar la instrucción Escribir Sin Saltar (que supongo si podrás usarla...)

Cada vez que escribimos una cifra, hacemos el truncado y comprobamos si N sigue siendo mayor que 0.
Si esto es cierto, es que todavía podemos obtener cifras, por lo que de nuevo haremos MOD 10, Escribir sin Saltar y el truncado.
Si no fuese cierto, es decir, si N ha alcanzado el valor 0, significa que ya no quedan cifras por obtener del valor introducido, así que no haremos nada y el programa terminará.

Este sería el código.
Fíjate que de esta manera, solo necesitamos dos valores enteros para resolverlo.
Código: [Seleccionar]
Algoritmo NUMEROS_EN_INVERSOS
//INGRESE UN NUMERO DE CINCO CIFRAS DE TALK FORMA QUE SE
//REPORTE EN FORMA INVERTIDA
//EJEMPLO: 12345 REPORTE: 54321
Definir N, cifra Como Entero
ESCRIBIR "ESCRIBE LOS NUMEROS QUE QUIERES INVERTIR"
LEER N
Si (N >= 1 y N <= 99999) Entonces

cifra <- N MOD 10
Escribir Sin Saltar cifra
N <- trunc(N/10)

Si (N > 0)
cifra <- N MOD 10
Escribir Sin Saltar cifra
N <- trunc(N/10)
FinSi

Si (N > 0)
cifra <- N MOD 10
Escribir Sin Saltar cifra
N <- trunc(N/10)
FinSi

Si (N > 0)
cifra <- N MOD 10
Escribir Sin Saltar cifra
N <- trunc(N/10)
FinSi

Si (N > 0)
cifra <- N MOD 10
Escribir Sin Saltar cifra
FinSi

SiNO
Escribir "NO SE PUEDE INVERTIR ESE NUMERO "
FinSi
Escribir " "
FinAlgoritmo

Esta vez si lo ejecutamos, veremos que podemos invertir sin problema valores que tengan alguna cifra 0 al final o en medio.
Incluso si tienen varias cifras 0
Código: [Seleccionar]
*** Ejecución Iniciada. ***
ESCRIBE LOS NUMEROS QUE QUIERES INVERTIR
> 10203
30201
*** Ejecución Finalizada. ***

De todos modos, tu solución una vez corregida, está muy bien.
Solo tendría el problema de las cifras 0, pero como he dicho, es inevitable si intentamos solucionarlo construyendo un nuevo entero.

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".