中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 20:59
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 帮忙看看我这段代码--判断闰年,哪里有问题?
楼 主 帮忙看看我这段代码--判断闰年,哪里有问题? 发表于 2006-11-01 22:12 ·  中国 上海 东方有线
初级用户
积分 35
发帖 14
注册 2006-10-16 05:53
UID 65933
状态 离线
set UDAY=0
for /L %%i in (1971,1,%YEAR%) do (
set /a temp1="%%i%%4"
::除4取余数
set /a temp2="%%i%%100"
::除100取余数
set /a temp3="%%i%%400"
::除400取余数
if %temp1%==0 if not %temp2%==0 set /a UDAY="%UDAY%+366"&set TAG=r else if %temp3%==0 set /a UDAY="%UDAY%+366"&set TAG=r else set /a UDAY="%UDAY%+365"&set TAG=p)


::代码是判断是否闰年并累加天数
好像 tempx那里不计算,百思不得其解,大虾们,指点一下迷津,多谢多谢!

[ Last edited by hhl on 2006-11-1 at 10:32 PM ]
2 发表于 2006-11-01 22:25 ·  中国 上海 东方有线
初级用户
积分 35
发帖 14
注册 2006-10-16 05:53
UID 65933
状态 离线
上面的算法有问题,调整一下:
set UDAY=0
for /L %%i in (1971,1,%YEAR%) do (
set /a temp1="%%i%%4"
::除4取余数
set /a temp2="%%i%%100"
::除100取余数
set /a temp3="%%i%%400"
::除400取余数
if %temp1%==0 (
if not %temp2%==0 set /a UDAY="%UDAY%+366"&set TAG=r else if %temp3%==0 set /a UDAY="%UDAY%+366"&set TAG=r else set /a UDAY="%UDAY%+365"&set TAG=p)
else set /a UDAY="%UDAY%+365"&set TAG=p
)


::算法,抄C语言书上的,能被4整除,但不能被100整除的是闰年;能被400整除的也是闰年
帮帮看看tempx那里用set /a计算有什么问题?

[ Last edited by hhl on 2006-11-1 at 10:30 PM ]
3 发表于 2006-11-01 22:36 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set UDAY=0
for /L %%i in (1971,1,%YEAR%) do (
set/a temp1=%%i%%4
set/a temp2=%%i%%100
set/a temp3=%%i%%400
echo !temp1! !UDAY!
if !temp1!==0 if not !temp2!==0 (set /a UDAY=!UDAY!+366&set TAG=r) else (if !temp3!==0 (set /a UDAY=!UDAY!+366&set TAG=r) else (set /a UDAY=!UDAY!+365&set TAG=p)))
4 发表于 2006-11-01 22:40 ·  中国 上海 东方有线
初级用户
积分 35
发帖 14
注册 2006-10-16 05:53
UID 65933
状态 离线
请教超版:
SETLOCAL ENABLEDELAYEDEXPANSION 什么意思?
echo !temp1! !UDAY! 这句又是什么意思?
为什么tempx,UDAY变量要用!!包起来?
5 发表于 2006-11-01 22:44 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
UID 60484
状态 离线
加上括号。
6 发表于 2006-11-01 22:45 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
UID 60484
状态 离线
在论坛搜下“变量延迟”。
7 发表于 2006-11-01 22:56 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
Originally posted by hhl at 2006-11-1 22:40:
请教超版:
SETLOCAL ENABLEDELAYEDEXPANSION 什么意思?
echo !temp1! !UDAY! 这句又是什么意思?
为什么tempx,UDAY变量要用!!包起来?

echo !temp1! !UDAY! 这句是调试用的
你在命令行下输入:
for/?
就知道为什么tempx,UDAY变量要用!!包起来了
不过你的代码还有点问题,再改下:
SETLOCAL ENABLEDELAYEDEXPANSION
set UDAY=0
set YEAR=2000
for /L %%i in (1971,1,%YEAR%) do (
set/a temp1=%%i%%4
set/a temp2=%%i%%100
set/a temp3=%%i%%400
if !temp1!==0 (if not !temp2!==0 (set /a UDAY=!UDAY!+366&set TAG=r) else (if !temp3!==0 (set /a UDAY=!UDAY!+366&set TAG=r) else (set /a UDAY=!UDAY!+365&set TAG=p))) else set /a UDAY=!UDAY!+365&set TAG=p)


[ Last edited by 不得不爱 on 2006-11-1 at 10:57 PM ]
8 发表于 2006-11-01 23:04 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
Originally posted by hhl at 2006-11-1 22:25:
::算法,抄C语言书上的,能被4整除,但不能被100整除的是闰年;能被400整除的也是闰年 ...

  在我的印象中,只要能被4整除的年份都是闰年,怎么C里的算法竟然如此复杂、并且似乎有点不合闰年的定义呢?
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
9 发表于 2006-11-01 23:09 ·  中国 上海 东方有线
初级用户
积分 35
发帖 14
注册 2006-10-16 05:53
UID 65933
状态 离线
谢谢,楼上各位,非常感谢。呵呵,我是CMD新手,很多语法,运算符都不清楚。
10 发表于 2006-11-01 23:10 ·  中国 上海 东方有线
初级用户
积分 35
发帖 14
注册 2006-10-16 05:53
UID 65933
状态 离线
呵呵,namejm版主,请参考谭浩强的那本经典的C.
11 发表于 2006-11-01 23:18 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
Originally posted by namejm at 2006-11-1 23:04:

  在我的印象中,只要能被4整除的年份都是闰年,怎么C里的算法竟然如此复杂、并且似乎有点不合闰年的定义呢?

你没有学过历法吗?
4年1润
100年少1润
400年多1润
原因是每年是365.2422天
12 发表于 2006-11-01 23:28 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  呵呵,对历法了解不多,闰年的概念甚至来自于小学时的数学课本,各位见笑了。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
13 发表于 2006-11-02 00:45 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
UID 68504
性别 男
来自 湖南==》广东
状态 离线
哈哈,我原来也不知道哦,也知道被4整除的才是闰年,现在知道了,感谢啊!
14 发表于 2006-11-02 03:53 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
判断是否为闰年条件是:
1. 能被4整除, 但不能被100整除.
2. 能被100整除, 又能被400整除.

C语言真的好强, 而判断是否闰年最简单的是逻辑运算来完成了, 遗憾的是批处理中并没有这样的运算类型. 我想是不是可以通过更复杂的CMD代码来模拟逻辑运算.


@echo off
set /p year=请输入年份:
set /a x=%year%%%4
set /a y=%year%%%100
set /a z=%year%%%400
if %x%==0 (
if %y%==0 (
if %z%==0 (
set term=1
) else (
set term=0
)
) else (
set term=1
)
) else (
set term=0
)
if %term%==1 (
echo %year% is a leap year.
) else (
echo %year% is not a leap year.
)
pause



@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /l %%i in (1971,1,2008) do (
set /a x=%%i%%4
set /a y=%%i%%100
set /a z=%%i%%400
if !x!==0 (
if !y!==0 (
if !z!==0 (
set term=1
) else (
set term=0
)
) else (
set term=1
)
) else (
set term=0
)
if !term!==1 (
set /a uday+=366
) else (
set /a uday+=365
)
)
echo 1971-2008累计天数为:%uday%
pause


[ Last edited by pengfei on 2006-11-2 at 04:26 AM ]
15 发表于 2006-11-02 04:41 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /l %%i in (1971,1,2008) do (
set /a x=%%i%%4
set /a y=%%i%%100
set /a z=%%i%%400
if !x!==0 if !y!==0 (if !z!==0 set/a t+=1) else set/a t+=1)
set/a t=(2008-1971+1)*365+t
echo 1971-2008累计天数为:%t%
pause
论坛跳转: