中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-08 03:34
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 奥运倒计时,请大家帮助完善!!! 查看 1,676 回复 16
楼 主 奥运倒计时,请大家帮助完善!!! 发表于 2008-04-16 21:14 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
在此声明我不是在刻意标榜,而是以一个自豪的中国人身份写下了这段代码:
-----------------------------------
在此严重感谢zh159兄多次测试并指出bug。
-----------------------------------
于2008年4月18日再次更新,加入毫秒倒计时。
@echo off&color ac&mode con cols=50 lines=10
title 奥运倒计时--made by zw19750516(cn-dos)
echo.&echo.&echo.
echo 我们每一个中国人都在期盼这一自豪时刻的到来!
echo.
for /l %%i in (1,1,100) do call,set cls=%%cls%%
goto one
:two
set n=2&set var=08-07&goto begin
ne
set n=1&set var=%date:~5,-4%
:begin
set month=%var:~1,1%&set number=29
set /a month-=1
for /l %%i in (1,1,%month%) do call :lp %%i
set /a number+=100%var:~3,2%%%100
set str=%str% %number%
if not %n% equ 2 goto two
for /f "tokens=1,2" %%i in ("%str%" do set /a day=%%j-%%i
set /a hm=100-1000%time:~9,2%%%1000,m=60-100%time:~6,2%%%100,f=60-100%time:~3,2%%%100,s=43-%time:~,2%
if %hm% equ 100 set /a hm-=100,m+=1
if %m% equ 60 set /a m-=60,f+=1
if %f% equ 60 set /a f-=60,h+=1
if %s% geq 24 set /a s-=24,day+=1
set /p= 离北京奥运开幕还有%day%天%s%小时%f%分%m%秒%hm%毫秒<nul
set /p=%cls%<nul
set n=0&set number=0
goto begin
:lp
for %%i in (1,3,5,7,8,10) do if %%i equ %1 set /a number+=31
for %%i in (4,6,9,11) do if %%i equ %1 set /a number+=30


[ Last edited by zw19750516 on 2008-4-19 at 09:13 PM ]
批处理之家新域名:www.bathome.net
2 发表于 2008-04-16 21:23 ·  中国 广西 玉林 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
出现有的bug
1、60秒(现在离北京奥运开幕还有113天23小时43分60秒)
2、无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。(大概是在52、51秒的时候)

颜色改为4c可能好些

[ Last edited by zh159 on 2008-4-16 at 09:26 PM ]
3 发表于 2008-04-16 21:26 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
ls说的问题解决了。
批处理之家新域名:www.bathome.net
4 发表于 2008-04-16 21:32 ·  中国 广西 玉林 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
60秒还没解决
新的问题:
不能显示52、51秒,53秒在3秒后直接跳到50秒

PS:还剩129天???
5 发表于 2008-04-16 21:37 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by zh159 at 2008-4-16 21:32:
60秒还没解决
新的问题:
不能显示52、51秒,53秒在3秒后直接跳到50秒

PS:还剩129天???

谢谢楼上60秒60分是我大意了,己解决,但53、52、51的问题不知从何入手!!!

[ Last edited by zw19750516 on 2008-4-16 at 09:49 PM ]
批处理之家新域名:www.bathome.net
6 发表于 2008-04-16 21:52 ·  中国 陕西 安康 电信
初级用户
★★
积分 171
发帖 78
注册 2006-11-22 11:26
19年会员
UID 71373
性别 男
状态 离线
颜色用0c更换了。那个颜色太刺眼啦
其他的都正常
7 发表于 2008-04-16 21:54 ·  中国 陕西 安康 电信
初级用户
★★
积分 171
发帖 78
注册 2006-11-22 11:26
19年会员
UID 71373
性别 男
状态 离线
晕,还是上面的仔细,果真有53、52、51的问题
8 发表于 2008-04-16 22:05 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
53、52、51的问题是你不能直接拿08,09进行计算,set/a会认为是8进制而计算错误(会提示“无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。”,只是闪的太快,不容易发现),所以01-09最好先去掉前面的0
9 再次感谢: 发表于 2008-04-16 22:17 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
再次感谢兄弟,其实我也往这方面想了,因其它的个位数都没问题,就没细想了,现在问题解决了,但代码长了好多。
批处理之家新域名:www.bathome.net
10 发表于 2008-04-17 00:15 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
当小时为 0 点时,代码无法正确运行,
另:使用cls 给人一种很不舒服的跳动感,建议用退格键来完成。
致精致简!
11 发表于 2008-04-17 02:05 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
粗略作了一个,不知道计算方面有没有错误。
:

@echo off&color ac&mode con cols=50 lines=10
for /l %%a in (1 1 100) do call set "t=%%t%%"
for /f "tokens=1-3 delims=./- " %%a in ("%date%") do (
set /a sy=%%a,sm=100%%b%%100,sd=100%%c%%100
)
for /l %%i in (%sm% 1 8) do call :loop %%i
set /a mt-=sd
for /f "tokens=1-3 delims=.: " %%a in ("%time%") do (
set /a ss=20-100%%a%%100-1,ff=60-100%%b%%100,mm=60-100%%c%%100
)
echo.&echo.
echo 我们每个中国人都在期盼这一自豪时刻的到来!
echo.&echo.
set var=%time:~7,1%
:lis
if %mm% equ 0 set /a ff-=1,mm=59
if %ff% equ 0 set /a ss-=1,ff=59
if %ss% lss 0 set /a ss=%ss:~-1%,mt-=1
if %ss% equ 0 set /a ss=23,mt-=1
set /p= 现在离北京奥运开幕还有%mt%天%ss%小时%ff%分%mm:~-2%秒%time:~9%毫秒<nul
set /p=%t%<nul
set num=%time:~7,1%
if %var% neq %num% (set/a mm-=1&set var=%time:~7,1%)
goto lis
:loop
for /f "tokens=%~1" %%a in ("31 29 31 30 31 30 31 8") do set /a mt+=%%a
goto :eof
致精致简!
12 测试成功: 发表于 2008-04-17 09:31 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
真的是离兄弟的差距太远,学习了!!!
批处理之家新域名:www.bathome.net
13 排版还有点问题: 发表于 2008-04-17 09:58 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
稍做修改:
@echo off&color ac&mode con cols=50 lines=10
title 奥运倒计时
for /l %%a in (1 1 100) do call set "t=%%t%%"
for /f "tokens=1-3 delims=./- " %%a in ("%date%") do (
set /a sy=%%a,sm=100%%b%%100,sd=100%%c%%100
)
for /l %%i in (%sm% 1 8) do call :loop %%i
set /a mt-=sd
for /f "tokens=1-3 delims=.: " %%a in ("%time%") do (
set /a ss=20-100%%a%%100-1,ff=60-100%%b%%100,mm=60-100%%c%%100
)
echo.&echo.
echo 我们每个中国人都在期盼着这一自豪时刻的到来!
echo.&echo.&echo.
set var=%time:~7,1%
:lis
if %mm% equ 0 set /a ff-=1,mm=59
if %ff% equ 0 set /a ss-=1,ff=59
if %ss% lss 0 set /a ss=%ss:~-1%,mt-=1
if %ss% equ 0 set /a ss=23,mt-=1
set /p=  离北京奥运开幕还有%mt%天%ss%小时%ff%分%mm:~-2%秒%time:~9%毫秒<nul
set /p=%t%<nul
set num=%time:~7,1%
if %var% neq %num% (set/a mm-=1&set var=%time:~7,1%)
goto lis
:loop
for /f "tokens=%~1" %%a in ("31 29 31 30 31 30 31 8") do set /a mt+=%%a
goto :eof
批处理之家新域名:www.bathome.net
14 发表于 2008-04-18 09:30 ·  中国 山西 运城 联通
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
代码有点偷懒
最末尾的100分之一秒是在正计时
而非倒计时

当然
想精确的计算100分之一秒剩余稍微有些困难
因为这段时间内能进行的计算是有限的
如果代码性能太低
等计算出剩余值都指不定过了多少个100分之一秒

另外这也与代码的优化执行策略有关
比如以下这段代码

@echo off
set count=0
set b=0
:loop
set last=%b%
set b=1%time:~9,2%
set /a r=200-b
set /p=%r% <nul
set /a count+=1
if %count% lss 1000 goto loop
pause
15 发表于 2008-04-18 10:22 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
有道理,好像这样可以显示毫秒的倒计时,不过也看不出来。呵呵。。
:

@echo off
set n=101
for /l %%a in (1 1 100) do (
set /a n-=1
call set _%%a=%%n%%
)
:loop
set b=%time:~9%
call set /p=%%_%b%%%<nul
set /p=<nul
set /a count+=1
if %count% lss 1000 goto loop
pause


[ Last edited by 26933062 on 2008-4-18 at 10:25 AM ]
致精致简!
论坛跳转: