Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Alex_loar en 25 Febrero 2008, 20:50 pm



Título: DNI
Publicado por: Alex_loar en 25 Febrero 2008, 20:50 pm
Hola, estoy haciendo el típico programa de calcular la letra del DNI, pero ahora con  un archivo de procesamiento por lotes(.bat). Tengo esto:

@echo off
echo Introduce un DNI
set /p dni=
set cadena= "TRWAGMYFPDXBNJZSQVHLCKE"
set /a cociente=%dni% / 23
set /a resto=(%dni%-(23* %cociente%))+1
echo El NIF es %cadena%[%resto%] <----------------¿?
pause>nul

Me falta sacar de la cadena la letra pero no sé como. Tampoco sé si existe alguna función para sacar el resto y evitarme así las variables cociente y resto.
A ver si alguien me puede echar una mano.

Gracias


Título: Re: DNI
Publicado por: Stacker en 26 Febrero 2008, 19:19 pm
Hola, lo deje así y funciona. Si alguien sabe simplificarlo más:

Código:
@echo off
echo Introduce un NIF
set /p dni=
set cadena=TRWAGMYFPDXBNJZSQVHLCKE
set /a resto=%dni%-(23*(%dni%/23))
:bucle
set /a resto-=1
set cadena=%cadena:~1,23%
if %resto%==1 ( set cadena=%cadena:~1,1% ) else ( goto bucle )
echo La letra del NIF es %cadena%
pause>nul

-Se calcula el resto en una sola linea.
-Con un bucle se van eliminando a la vez un caracter del principio de la cadena y una unidad del resto.
-Cuando el resto llega a 1, se coge solamente el primer caracter de la cadena.


PD: Con el comando set /? puedes obtener más ayuda para tratar variables en batch.  ;)

Saludos


Título: Re: DNI
Publicado por: Alex_loar en 27 Febrero 2008, 01:02 am
Hola Stacker, lo primero gracias.
Tengo una duda, acabo de empezar con esto. Podrías explicar lo anterior a partir de la etiqueta.

Saludos
Álex


Título: Re: DNI
Publicado por: Stacker en 27 Febrero 2008, 19:45 pm
Antes de nada, hay un error: fallaba cuando tenia que mostrar el primer caracter "T".

Código:
@echo off
echo Introduce un NIF
set /p dni=
set cadena=TRWAGMYFPDXBNJZSQVHLCKE
set /a resto=%dni%-(23*(%dni%/23))
:bucle
if %resto%==0 goto fin
set /a resto-=1
set cadena=%cadena:~1,23%
goto bucle
:fin
echo La letra del NIF es %cadena:~0,1%
pause>nul

Perdón por el primer código, pasa por hacerlo deprisa. :-\



Explicación:

La idea es ir eliminando un caracter del principio de la cadena por cada unidad del resto. Y después mostrar el primer caracter de los que queden.


if %resto%==0 goto fin, comprueba si el resto es o ha llegado a cero y termina.

set /a resto-=1, resta una unidad al resto.

set cadena=%cadena:~1,22%, coge 22 (para asegurarnos de abarcar todo) caracteres a partir de la posición 1, es decir todos menos el primero.

echo La letra del NIF es %cadena:~0,1%, igual que el anterior, en este caso desde la posición 0 y solamente 1 caracter.



La razón de usar este sistema en vez de simplemente:

echo La letra del NIF es %cadena:~%resto%,1%

- es que devuelve literalmente: cadena:~-n,1 , donde n es el resto.


Si alguien sabe evitar esto seria de gran utilidad y simplificaria muchísimo el código.

Espero que hayas entendido el código.

Saludos


Título: Re: DNI
Publicado por: Alex_loar en 28 Febrero 2008, 00:53 am
Ahora sí ;)

Gracias de nuevo