我应该如何创建批处理文件程序,如果我输入一年,程序将识别它是否是闰年。
@echo off
cls
echo. LEAP YEAR
echo. Enter Year:
exit /b 0
嗯,这只是我需要帮助,比如我应该怎么做的建议。
答案 0 :(得分:6)
@echo off
setlocal
set /P "year=Enter year: "
set /A "leap=!(year%%4) + (!!(year%%100)-!!(year%%400))"
if %leap% equ 1 echo Is leap year
相对于Wikipedia,如果它可以被4整除,那么它是一个跳跃,除非它也可以被100整除,在这种情况下它只有在它可以被400整除时才会跳跃("可分割&# 34;表示除以给定数字的余数为零)。这样,2000和2400是闰年,因为当它们除以400时它们的余数为零,但是2100,2200和2300不是:这些是特殊情况,因为当它们除以100时它们的余数为零。
在set /A
命令中,!
布尔NOT运算符在其操作数为零时给出1,在任何其他情况下给出0,因此如果年份可以被4整除,则set /A "leap=!(year%%4)"
给出1在任何其他情况下为零;这给出了结果的第一部分。
之后我们需要在2100年,2200年和2300年从这个值中减去1,但在2000年和2400年没有减去任何数据;那就是:
year year%%100 a=!!(year%%100) year%%400 b=!!(year%%400) a-b
2000 0 0 0 0 0
2100 0 0 100 1 -1
2200 0 0 200 1 -1
2300 0 0 300 1 -1
2400 0 0 0 0 0
如果年份不可被100整除,则a
和b
值均等于1,因此a-b
为零,并给出结果只剩下4的原始余数。
这样,公式set /A "leap=!(year%%4) + (!!(year%%100)-!!(year%%400))"
给出了完整的结果。
答案 1 :(得分:2)
它不会检查输入是否正确:
@echo off
set /p year=enter a year:
call :isLeap %year%
exit /b 0
:isLeap
setlocal
set "year=%~1"
set /a _4=year%%4
set /a _100=year%%100
set /a _400=year%%400
::set _
if not %_4% equ 0 (
echo not leap
exit /b 0
)
if %_100% equ 0 (
if not %_400% equ 0 (
echo not leap
exit /b 0
)
)
echo leap
exit /b 0
答案 2 :(得分:1)
您可能滥用PowerShell的日期构造函数。如果尝试将日期对象设置为 nnnn 的2月29日时出错,那么它不是闰年。
@echo off
setlocal
if "%~1"=="" (
echo Usage: %~nx0 year
goto :EOF
)
>NUL 2>NUL powershell "get-date -date '%~1.2.29'" && (
echo Leap year!
) || (
echo Not leap year.
)
goto :EOF
您可以对JScript混合使用相同的操作。这是一个更多的代码,但速度要快得多。
@if (@CodeSection == @Batch) @then
@echo off
setlocal
if "%~1"=="" (
echo Usage: %~nx0 year
goto :EOF
)
cscript /nologo /e:Jscript "%~f0" "%~1" && (
echo Leap year!
) || (
echo Not leap year.
)
goto :EOF
@end
WSH.Quit(new Date(WSH.Arguments(0), 1, 29).getDate() - 29);