elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Ayuda con dudas de programacion batch
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con dudas de programacion batch  (Leído 3,428 veces)
legolas266

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Ayuda con dudas de programacion batch
« en: 27 Febrero 2013, 21:46 pm »

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.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Ayuda con dudas de programacion batch
« Respuesta #1 en: 28 Febrero 2013, 01:33 am »

Hola,

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

Código
  1. @Echo OFF
  2.  
  3. REM By Elektro H@cker
  4.  
  5. :: Esperar el input del usuario
  6. Set /P "Word=Introduce una palabra >> "
  7.  
  8. :: Obtener la longitud del input
  9. (ECHO "%WORD%">"%TEMP%\Word.txt" & FOR %%# IN ("%TEMP%\Word.txt") DO (SET /A "Word_Length=%%~z# - 5"))
  10.  
  11. :: Obtener el punto de separación del string
  12. Set /A "Word_Middle=%Word_Length% / 2"
  13.  
  14. :: Setear las variables de las comparaciones
  15. Call Set "Compare_A=%%WORD:~0,%Word_Middle%%%"
  16. Call Set "Compare_B=%%WORD:~-%Word_Middle%%%"
  17.  
  18. :: Revertir la variable "Compare_B"
  19. FOR /L %%X in (1,1,%Word_Middle%) DO (Call Set "Compare_B_REVERSED=%%Compare_B_REVERSED%%%%Compare_B:~-%%X,1%%")
  20.  
  21. :: Comparar y mostrar el resultado
  22. IF "%Compare_A%" EQU "%Compare_B_REVERSED%" (
  23. Echo El string es palindromo.    | MORE
  24. ) ELSE (
  25. Echo El string no es palindromo. | MORE
  26. )
  27.  
  28. Pause&Exit


saludos


En línea



legolas266

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Ayuda con dudas de programacion batch
« Respuesta #2 en: 28 Febrero 2013, 11:31 am »

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.

En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Ayuda con dudas de programacion batch
« Respuesta #3 en: 28 Febrero 2013, 12:17 pm »

Citar
Código:
SET /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)


Citar
Expansió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.




Citar
Código:
Call 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...





Citar
Código:
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?)

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:
Código:
monje

Variable al revés:
Código:
ejmon

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).

Código:
%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.
En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Dudas: Parametros remplazables | Programación Batch
Scripting
miguel_s777 1 4,007 Último mensaje 8 Octubre 2011, 18:17 pm
por leogtz
Programación Batch
Programación General
ELVJop 3 2,745 Último mensaje 4 Abril 2012, 21:55 pm
por $Edu$
[Ayuda] Dudas con respecto a la programacion.
Programación General
MartiN+ 8 4,235 Último mensaje 30 Junio 2012, 20:36 pm
por Anvil
ayuda programacion batch: uso del for /f
Programación General
juntacadaveres 7 5,547 Último mensaje 4 Abril 2019, 20:42 pm
por EdePC
Dudas y ayuda
Hacking
luiguinnos 5 3,419 Último mensaje 9 Noviembre 2021, 19:39 pm
por Danielㅤ
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines