Ayuda con dudas de programacion batch

Iniciado por legolas266, 27 Febrero 2013, 21:46 PM

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

legolas266

Hola, alguien seria tan amable de decirme como puedo hacer para comparar una cadena numerica sin limite de longitud, los x primeros numeros con los x ultimos numeros.

Necesito realizar un programa que me diga si un numero introducido por un usuario es capicua o no y no doy con el script necesario para que me funcione y ya estoy desesperado.

He mirado mil foros y mil tutoriales de batch pero no consigo dar con la solucion.

Alquien me puede ayudar por favor?. Gracias.

Eleкtro

Hola,

Te dije que este código sirve tanto para palabras palíndromas cono números palíndromos (capicúas).

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



saludos








legolas266

Lo se pero no me funciona. Aun así, si fueras tan amable de explicarme para que sirven estas lineas de codigo... me gustaria entenderlo para saberlo hacer la proxima vez o cuando se me planteen otros ejercicios.

(ECHO "%WORD%">"%TEMP%\Word.txt" & FOR %%# IN ("%TEMP%\Word.txt") DO (SET /A "Word_Length=%%~z# - 5"))
- De esta linea entiendo que la variable WORD es sacada a un archivo de texto llamado Word.txt en la carpeta temp, supongo que el for es para asignar al simbolo de la almuadilla la cadena numerica que contiene el archivo Word.txt y ya donde me pierdo del todo es en esta parte del codigo: (SET /A "Word_Length=%%~z# - 5")),
se supone que es una operacion matematica, pero no la entiendo... para letras supongo que se referirá que tenga en cuenta de la a a la z, pero el - 5 para que sirve.. o si me lo pudieras explicar todo mejor.
-----------------------------------------------------------------------
Call Set "Compare_A=%%WORD:~0,%Word_Middle%%%"
Call Set "Compare_B=%%WORD:~-%Word_Middle%%%"
Estas lineas, la variable Comapre_A, supongo que se refiere a que dentro de la Variable Word se empieze a contar desde la posicion 0, pero no entiendo el resto, la coma que viene despues y la variable esa que no se de donde ha salido ni lo que hace %Word_Middle%, y si para datos numericos se aplica igualmente.
De la segunda variable Compare_B, entiendo que para la variable Word  esta vez es para que lea desde la ultima cifra o letra (~-) pero no entiendo porque esta vez la variable %Word_Middle% no va separado por una coma, deduzco que la coma es para decir que empieze a leer desde la ultima letra o cifra hasta la mitad... al no tener coma me lio y no entiendo porque se pone así.
-----------------------------------------------------------------------
FOR /L %%X in (1,1,%Word_Middle%) DO (Call Set "Compare_B_REVERSED=%%Compare_B_REVERSED%%%%Compare_B:~-%%X,1%%")
De esta linea llego a entender, que como en el caso de un palindromo el contenido de la variable es texto se pone For/L, en el caso del capicua se pondria For (sin /L, verdad?) aparte de eso %%X in (1,1,%Word_Middle%), no seria para que empieze a contar desde el digito o letra 0 así: %%X in (0,1,%Word_Middle%), entiendo que este bucle es para que el script cuente el numero de letras o numeros que hay hasta la mitad del contenido del numero o texto introducido por el usuario..
Por ultimo en esta linea me pierdo del todo:
Call Set "Compare_B_REVERSED=%%Compare_B_REVERSED%%%%Compare_B:~-%%X,1%%")
No entiendo si abres una nueva variable "Compare_B_REVERSED"= ....  porque se vuelve a poner esa variable con doble % y seguido con otro doble %..Compare_B:~-%%X,1%%" .

Me gustaria entender el codigo para no tener que estar preguntando a cada rato y hacerlo por mi mismo en futuros ejercicios.

Siento ser tan pesado. Gracias por ayudarme.


Eleкtro

Cita de: legolas266 en 28 Febrero 2013, 11:31 AM
CitarSET /A "Word_Length=%%~z# - 5")

Tutorial extendido de aprendizaje Batch by Elektro H@cker
6.1 Variables especiales (o Variables de parámetro) (o Variables de argumentos)


CitarExpansión de variables especiales (o Argumentos) y de variables de FOR
%~z0        - expande %0 a tamaño del archivo

1 caracter escrito equivale a 1 byte de tamaño, así que con ese método sacamos el tamaño del archivo (que es lo mismo que sacar la longituid del string porque se cuentan de 1 en 1), le descuento 5 (-5) por los bytes de las comillas y los espacios.





Cita de: legolas266 en 28 Febrero 2013, 11:31 AM
CitarCall Set "Compare_A=%%WORD:~0,%Word_Middle%%%"
Call Set "Compare_B=%%WORD:~-%Word_Middle%%%"

No.

Substring: Extraer parte de una variable.

http://ss64.com/nt/syntax-substring.html

Si la palabra es "atoyota", almaceno en la primera variable "ato" y en la segunda "ota", y lo mismo si en lugar de palabras usases números...






Cita de: legolas266 en 28 Febrero 2013, 11:31 AM
CitarFOR /L %%X in (1,1,%Word_Middle%) DO (Call Set "Compare_B_REVERSED=%%Compare_B_REVERSED%%%%Compare_B:~-%%X,1%%")
De esta linea llego a entender, que como en el caso de un palindromo el contenido de la variable es texto se pone For/L, en el caso del capicua se pondria For (sin /L, verdad?)

Tampoco.

Lée el comentario de esa línea, ese FOR lo uso para hacer un Reverse-String de la variable "Compare_B", es necesario tanto para strings alfabéticos, numéricos, o alfanuméricos.

Variable normal:
monje

Variable al revés:
ejmon

Cita de: legolas266 en 28 Febrero 2013, 11:31 AM
Call Set "Compare_B_REVERSED=%%Compare_B_REVERSED%%%%Compare_B:~-%%X,1%%")

Tutorial extendido de aprendizaje Batch by Elektro H@cker
4.8 Otros operadores


Citar%

Este operador sirve para identificar y usar las variables standard, las variables de FOR, y las variables especiales (Variables de argumento).

%0
%%A
%VARIABLE%


NOTA: Como norma general, directamente en la consola el caracter % solo se usa una vez (Incluso al escribir un FOR), pero en un script hay que duplicar el número de veces que se repite este caracter para poder identificarlo %%, y el número de veces que hay que repetir el caracter aumenta según la recursividad del código.

Para strings numéricos es más sensato que uses la expansión retardada:

Tutorial extendido de aprendizaje Batch by Elektro H@cker
6.3 Variables expandidas







Resumen del código entero:

Introducimos la palabra "atoyota"
El código separa el string así:  ato-y-ota
en la variable "Compare_A" se almacena "ato"
en la variable "Compare_B" se almacena "ota"
a la variable "Compare_B" se le da la vuelta quedando así: "ato"
se compara si la variable "A" y la "B" son iguales (ato = ato) y entonces es palíndromo.

Lo mismo con los números:
introduces "123321"
El código separa el string así:  123-321
en la variable "Compare_A" se almacena "123"
en la variable "Compare_B" se almacena "321"
a la variable "Compare_B" se le da la vuelta quedando así: "123"
se compara si la variable "A" y la "B" son iguales, ¿123 = 123? si, pues es capicúa.

Saludos.