Hola, buenos dias. Necesito hacer funcionar correctamente el siguiente script que debe decirme si un numero es capicua o no (el numero tendrá un maximo de 5 cifras) usando unicamente las funciones que pongo en mi codigo ya que es programacion a nivel basico y no me permiten usar otro tipo de comandos para hacerlo.
De momento solo consigo que me funcione insertando un numero de 5 cifras, con menos cifras se me sale del programa o me dá un resultado incorrecto. A ver si alguien me dice donde está el fallo del mismo.
El codigo es el siguiente:
@Echo off
setlocal enabledelayedexpansion
title Ejercicio 9. Numeros Capicua
set numero=""
:comienzo
echo.
echo ===========================================
echo Numero Capicua o no....
echo ===========================================
echo.
Set /P numero="Introduce un numero de 5 cifras "
if %numero%=="" (
goto error
) else (
goto variables
)
:variables
set num1=%numero:~0,1%
set num2=%numero:~1,1%
set num3=%numero:~2,1%
set num4=%numero:~3,1%
set num5=%numero:~4,1%
goto longitud
:longitud
if !num5! gtr -1 (
goto compara4
)
if !num4! gtr -1 (
goto compara3
)
if !num3! gtr -1 (
goto compara2
)
if !num2! gtr -1 (
goto compara1
)
if !num1! gtr -1 (
goto compara
)
:compara
echo.
echo El numero introducido es Capicua.
goto fin
:compara1
if !num1! equ !num2! (
echo El numero introducido es Capicua.
goto fin
) else (
echo El numero introducido no es Capicua.
goto fin
)
:compara2
if !num1! equ !num3! (
echo El numero introducido es Capicua.
goto fin
) else (
echo El numero introducido no es Capicua.
goto fin
)
:compara3
if !num1! equ !num4! (
if !num2! equ !num3! (
echo El numero introducido es Capicua.
goto fin
)
) else (
echo El numero introducido no es Capicua.
goto fin
)
:compara4
if !num1! equ !num5! (
if !num2! equ !num4! (
echo El numero introducido es Capicua.
goto fin
)
) else (
echo El numero introducido no es Capicua.
goto fin
)
:error
echo.
echo ERROR! .No ha introducido ningun numero.
pause
goto comienzo
:fin
echo.
pause
exit
Gracias a todos por su ayuda.
Edita el mensaje y pon el código en insertar código es el símbolo del asterisco o si no pon "" al principio y "
" al final. Un saludo.
Ok ya esta modificado el post, disculpad no sabia eso.
Que lío tienes montado en las condicionales, pero de entre todo, hay una cosa que resaltar con creces:
:longitud
if !num5! gtr -1 (
goto compara4
)
if !num4! gtr -1 (
goto compara3
etc...
)
No entiendo la lógica que se te ha pasado por la cabeza para realizar esas comparaciones, porque en ninguno de los casos la cifra podrá ser negativa (-1), el número que obtienes del substring siempre será positivo, así que esas comparaciones ni son necesarias ni se que intentas conseguir con eso reálmente.
EDITO: Si de ese pretendías saber si la variable estaba vacía podrías haber hecho:
if "!num1!"=="" (Goto..)
if "!num2!"=="" (Goto...)
o
if not defined num1 (goto...)
if not defined num2 (goto...)
Véo que no te sirvió de nada el ejemplo que te puse en este post: http://foro.elhacker.net/scripting/ayuda_con_dudas_de_programacion_batch-t384295.0.html;msg1832789#msg1832789
Cita de: EleKtro H@cker en 24 Febrero 2013, 20:02 PM
@Echo OFF
REM By Elektro H@cker
:: Esperar el input del usuario
Set /P "Word=Introduce una palabra >> "
:: Obtener la longitud del input
(ECHO "%WORD%">"%TEMP%\Word.txt" & FOR %%# IN ("%TEMP%\Word.txt") DO (SET /A "Word_Length=%%~z# - 5"))
:: Obtener el punto de separación del string
Set /A "Word_Middle=%Word_Length% / 2"
:: Setear las variables de las comparaciones
Call Set "Compare_A=%%WORD:~0,%Word_Middle%%%"
Call Set "Compare_B=%%WORD:~-%Word_Middle%%%"
:: Revertir la variable "Compare_B"
FOR /L %%X in (1,1,%Word_Middle%) DO (Call Set "Compare_B_REVERSED=%%Compare_B_REVERSED%%%%Compare_B:~-%%X,1%%")
:: Comparar y mostrar el resultado
IF "%Compare_A%" EQU "%Compare_B_REVERSED%" (
Echo El string es palindromo. | MORE
) ELSE (
Echo El string no es palindromo. | MORE
)
Pause&Exit
Bueno, aquí tienes algo mucho más sencillo siguiendo la línea de tu ejercicio:
@Echo off
title Ejercicio 9. Numeros Capicua
:comienzo
Set "numero="
Cls
echo.
echo ===========================================
echo Numero Capicua o no....
echo ===========================================
echo.
Set /P "numero=Introduce un numero menor de 5 cifras >> "
if not defined numero (GOTO :error)
if %numero% GTR 99999 (GOTO :error)
:longitud
if %numero% LEQ 9 (Call :Comparar %numero:~0,1% %numero:~0,1%)
if %numero% LEQ 99 (Call :Comparar %numero:~0,1% %numero:~1,1%)
if %numero% LEQ 999 (Call :Comparar %numero:~0,1% %numero:~2,1%)
if %numero% LEQ 9999 (Call :Comparar %numero:~0,1%%numero:~1,1% %numero:~3,1%%numero:~2,1%)
if %numero% LEQ 99999 (Call :Comparar %numero:~0,1%%numero:~1,1% %numero:~4,1%%numero:~3,1%)
GOTO :comienzo
:error
echo.
echo ERROR! Numero incorrecto.
pause
goto :comienzo
:comparar
if %1 equ %2 (echo El numero introducido es Capicua.) else (echo El numero introducido no es Capicua.)
pause
GOTO:comienzo
Saludos.
Ok, gracias crack... si tenia un gran lio con las comparaciones dichosas.
No se me habia ocurrido comparar para el tema de la longitud con:
if %numero% LEQ 99999 .... para 5 digitos.. etc..
Solo con modificar la parte de mi codigo donde tenia comparado el numero con -1 ya funciona completamente bien el programa.
Joder aun no tengo mucha idea de esto de programación pero poco a poco como en todas las cosas se va avanzando.
Gracias una vez mas gracias por la ayuda.
Cita de: legolas266 en 14 Marzo 2013, 12:55 PM
No se me habia ocurrido comparar para el tema de la longitud con:
if %numero% LEQ 99999 .... para 5 digitos.. etc..
Gracias una vez mas gracias por la ayuda.
Lo importante es que hayas entendido el code, y ahora ya sabes que puedes hacerlo de esa manera...
Para eso estamos :),
un saludo.