2016-02-02 3 views
-2

Как создать программу пакетного файла, которая, если я ввещу год, программа определит, является ли это високосным годом или нет.Пакетный файл високосного года?

@echo off 
cls 
echo. LEAP YEAR 
echo. Enter Year: 
exit /b 0 

Ну, это только то, что мне нужна помощь, как предложения о том, что я должен делать.

+0

Как человек решит это? – jeb

+0

зависит от того, что он хочет ввести. например, если он вводит 2016, то это високосный год. –

+4

Ага, может быть, есть правило о високосных годах? Или это случайный? Знаете ли вы, что 2028 год будет високосным годом? – jeb

ответ

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 
+0

@TeffanyMaeReyes не забывают отмечать это как принятый ответ. –

1

Вы могли злоупотреблять даты конструктора PowerShell в. Если ошибки пытаются установить объект даты до 29 февраля nnnn, то это не високосный год.

@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); 
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 («делится» означает, что остаток деления на заданное число равен нулю). Таким образом, 2000 и 2400 являются високосными годами, потому что их остатки, когда они делятся на 400, равны нулю, но 2100, 2200 и 2300 не являются: это особые случаи, потому что их остатки, когда они делятся на 100, равны нулю.

В set /A команде ! булево оператор НЕ дает 1, если ее операнд равен нулю, и дает 0 в любом другом случае, так set /A "leap=!(year%%4)" дает 1, если год делится на 4 и нулю в любом другом случае; это дает первую часть результата.

После этого нам нужно вычесть 1 из этого значения в 2100, 2200 и 2300 годах, но ничего не вычесть в 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))" дает полный результат.

+2

Хороший ответ объясняет также решение :-) – jeb

+0

@jeb: Готово! Мне не нравится, когда объяснения больше и сложнее писать, чем само решение ** ': /' ** – Aacini

+1

приятно. Может быть, это будет работать еще быстрее 'set/A" leap =! (Year & 3) + (!! (year% 100) - !! (year & 15)) "' (побитовое вместо проверки по модулю) – npocmaka

Смежные вопросы