[BATCH] Donde falla este script. Alguien me puede ayudar?. Gracias.

Iniciado por legolas266, 14 Marzo 2013, 11:40 AM

0 Miembros y 1 Visitante están viendo este tema.

legolas266

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:
Código (DOS) [Seleccionar]
@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.

OmarHack

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.
I like to test things.

legolas266

Ok ya esta modificado el post, disculpad no sabia eso.

Eleкtro

#3
Que lío tienes montado en las condicionales, pero de entre todo, hay una cosa que resaltar con creces:

Código (dos) [Seleccionar]
: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
Código (dos) [Seleccionar]
@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:

Código (dos) [Seleccionar]
@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.








legolas266

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.

Eleкtro

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.