中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 奥运倒计时,请大家帮助完善!!!
« [1] [2] »
作者:
标题: 奥运倒计时,请大家帮助完善!!! 上一主题 | 下一主题
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『楼 主』:  奥运倒计时,请大家帮助完善!!!

在此声明我不是在刻意标榜,而是以一个自豪的中国人身份写下了这段代码:
-----------------------------------
在此严重感谢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
:one
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
2008-4-16 21:14
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 2 楼』:  

出现有的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 ]



2008-4-16 21:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 3 楼』:  

ls说的问题解决了。



批处理之家新域名:www.bathome.net
2008-4-16 21:26
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 4 楼』:  

60秒还没解决
新的问题:
不能显示52、51秒,53秒在3秒后直接跳到50秒

PS:还剩129天???



2008-4-16 21:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 5 楼』:  



  Quote:
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
2008-4-16 21:37
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
afeichai
初级用户




积分 171
发帖 78
注册 2006-11-22
状态 离线
『第 6 楼』:  

颜色用0c更换了。那个颜色太刺眼啦
其他的都正常

2008-4-16 21:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
afeichai
初级用户




积分 171
发帖 78
注册 2006-11-22
状态 离线
『第 7 楼』:  

晕,还是上面的仔细,果真有53、52、51的问题

2008-4-16 21:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 8 楼』:  

53、52、51的问题是你不能直接拿08,09进行计算,set/a会认为是8进制而计算错误(会提示“无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。”,只是闪的太快,不容易发现),所以01-09最好先去掉前面的0



2008-4-16 22:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 9 楼』:  再次感谢:

再次感谢兄弟,其实我也往这方面想了,因其它的个位数都没问题,就没细想了,现在问题解决了,但代码长了好多。



批处理之家新域名:www.bathome.net
2008-4-16 22:17
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 10 楼』:  

当小时为 0 点时,代码无法正确运行,
另:使用cls 给人一种很不舒服的跳动感,建议用退格键来完成。



致精致简!
2008-4-17 00:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 11 楼』:  

粗略作了一个,不知道计算方面有没有错误。
:
@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




致精致简!
2008-4-17 02:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 12 楼』:  测试成功:

真的是离兄弟的差距太远,学习了!!!



批处理之家新域名:www.bathome.net
2008-4-17 09:31
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 13 楼』:  排版还有点问题:

稍做修改:
@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
2008-4-17 09:58
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 14 楼』:  

代码有点偷懒
最末尾的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


2008-4-18 09:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 15 楼』:  

有道理,好像这样可以显示毫秒的倒计时,不过也看不出来。呵呵。。
:
@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 ]



致精致简!
2008-4-18 10:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: