Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: 0x0309 en 5 Mayo 2009, 04:02 am



Título: [Batch] Función año bisiesto de 3 líneas.
Publicado por: 0x0309 en 5 Mayo 2009, 04:02 am
La otra vez había hecho una función para saber si un año es bisiesto o no, y tenía muchas líneas. Ahora la he escrito en menos.

Código:
@echo off

call :esBisiesto 2008
echo.2008 : bisiesto : %errorlevel%
call :esBisiesto 2000
echo.2000 : bisiesto : %errorlevel%
call :esBisiesto 1900
echo.1999 : bisiesto : %errorlevel%
pause
goto :eof

:esBisiesto
::Funcion para saber si un anyo es bisiesto o no
::Autor: Carlos
::Devuelve 1 si es bisiesto y 0 si no lo es.
::Recibe un argumento con el anyo.
::Ejemplo: call :esBisiesto 2008
::Ejemplo: call :esBisiesto 2000
::Ejemplo: call :esBisiesto 1900
::Para ver el retorno deben expandir errorlevel
@setlocal enableextensions disabledelayedexpansion
@set /a b="(!(%~1%%4)&!!(%~1%%100))|!(%~1%%400)"
@exit /b %b%


Título: Re: [Batch] Función año bisiesto de 3 líneas.
Publicado por: leogtz en 5 Mayo 2009, 07:04 am
Excelente 0x0309, aun no sabia como usar los ! en el SET /a.

Saludos.


Título: Re: [Batch] Función año bisiesto de 3 líneas.
Publicado por: M a t t en 5 Mayo 2009, 07:24 am
Supongo que también funcionaría:

Código:
:esBisiesto
setlocal enableextensions
set /a "etc=%~1/4*4"
if "%~1" equ "%etc%" (exit /b 1) else (exit /b 0)


Título: Re: [Batch] Función año bisiesto de 3 líneas.
Publicado por: 0x0309 en 5 Mayo 2009, 16:00 pm
Supongo que también funcionaría:

Código:
:esBisiesto
setlocal enableextensions
set /a "etc=%~1/4*4"
if "%~1" equ "%etc%" (exit /b 1) else (exit /b 0)

Nada que ver, el algoritmo de año bisiesto no dice solamente que sea divisible por 4, por ejemplo: 1900 no es año bisiesto, ya que es divisible por 100 pero no por 400.


Título: Re: [Batch] Función año bisiesto de 3 líneas.
Publicado por: M a t t en 5 Mayo 2009, 16:24 pm
Ahh, yo pensaba que un año es bisiesto si es divisible por 4 y nada más.

Excelente código.


Título: Re: [Batch] Función año bisiesto de 3 líneas.
Publicado por: 0x0309 en 5 Mayo 2009, 16:33 pm
He actualizado el código levemente, he añadido la palabra disabledelayedexpasion, ya que cuando se llamaba a la función con la expansión retardada activada se producía un error que decía: Sobran o faltan paréntesis.
Cuando se hacía esto:
Código:
setlocal enabledelayedexpansion
call :esBisiesto 2009
rem se producía el error.
rem ahora ha sido corregido.