中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战2] 变量的检测和计算[难度:★]
« [1] [2] [3] »
作者:
标题: [挑战2] 变量的检测和计算[难度:★] 上一主题 | 下一主题
111ab
新手上路





积分 2
发帖 1
注册 2007-5-10
状态 离线
『第 31 楼』:  



  Quote:
Originally posted by bjsh at 2007-5-1 05:16 AM:
抽出了点时间 写了这个..
结果为:24691356902469134

bjsh兄:
     无意间看到了你的帖子,被你的代码折服了。花了一天多时间拜读了一下你的代码,刚弄懂提取数字字段那部分,我是菜鸟,别笑话我,哈。有点问题想请教。
     感觉你的 findstr 的正则表达式对字串类似"12345adfadfds45156"(头尾均为数字,但中间为字符)的情况也能匹配。我想改成这样地:
                          findstr  "^[0-9][0-9]*$"  tmp.txt
你的findstr中有个参数是 /r , 我在命令行查看findstr的帮助的时候没看到有这个参数,就对加 /r 和不加 /r两种情况分别试了一下,没看出什么区别,那个 /r 是做什么用地呢?

注:正则表达式 "^[0-9][0-9]*$" 并不能匹配字串类似"123457684    "的情况,所以:get_number段中代码要做一下小小改动,我的建议如下:
原代码:    echo %1 >>tmp.txt & shift   
修改后:    echo %1>>tmp.txt& shift     ::注意该处%1后和.txt后均不能有空格,否则空格会被输入到.txt中,影响正则表达式的匹配。
或改成:    echo %1>>tmp.txt
                shift

2007-5-10 13:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 32 楼』:  



  Quote:
Originally posted by 111ab at 2007-5-10 01:35 PM:

bjsh兄:
     无意间看到了你的帖子,被你的代码折服了。花了一天多时间拜读了一下你的代码,刚弄懂提取数字字段那部分,我是菜鸟,别笑话我, ...

我对正则表达式还是不太明白。。刚刚接触vbs。。

但兄可以仔细看看 findstr /?

里面有说明: /r 表示使用一般表达式。而根据下面对一般表达式的描叙,应该是属于正则表达式范畴。



知,不觉多。不知,乃求知
2007-5-10 17:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 33 楼』:  

to 111ab

  Quote:
感觉你的 findstr 的正则表达式对字串类似"12345adfadfds45156"(头尾均为数字,但中间为字符)的情况也能匹配。我想改成这样地:
                          findstr  "^[0-9][0-9]*$"  tmp.txt



  Quote:
注:正则表达式 "^[0-9][0-9]*$" 并不能匹配字串类似"123457684    "的情况,所以:get_number段中代码要做一下小小改动,我的建议如下:
原代码:    echo %1 >>tmp.txt & shift   
修改后:    echo %1>>tmp.txt& shift     ::注意该处%1后和.txt后均不能有空格,否则空格会被输入到.txt中,影响正则表达式的匹配。
或改成:    echo %1>>tmp.txt
                shift

感谢兄的指点;
兄的建议 很有道理

2007-6-6 10:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





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


:: 向各位高手学习的同时,自己也写了个,没什么技术可言。
:: 不过好像就楼主的要求,能够达到目的
:: 得到的结果是 24691356902469134
:: 特点:
::     不限于数字的大小,只要是求和的都可以
:: 思路:
::    直接加最后一位数,再加进位的数,再将原数舍弃最后一位,如此循环,直至结果.


@echo off & setlocal enabledelayedexpansion
set "num1=qwer/2asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"

set "num1=%num1:/= %"&set "num2=%num2:/= %"&set b=1
for %%i in (%num1% %num2%) do (
echo %%i|findstr "^[0-9]*$">nul&&set num!b!=%%i&&set /a b+=1
)
set jin=0

:loop
set /a a=%num1:~-1%+%num2:~-1%+%jin%
set jieguo=%a:~-1%%jieguo%
set a=0%a%
set jin=%a:~-2,1%
set num1=%num1:~0,-1%
set num2=%num2:~0,-1%
if "%num1%"=="" set /a zz=%num2%+%jin%&goto lis
if "%num2%"=="" set /a zz=%num1%+%jin%&goto lis
goto loop

:lis
if "%zz%"=="0" set zz=
echo.&echo   结果:%zz%%jieguo%
echo.&pause
[ Last edited by 26933062 on 2007-8-15 at 07:51 PM ]



致精致简!
2007-8-15 19:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 35 楼』:  

又回到这个问题了。
刚刚想到一个“补位”的方法来实现加法,从而避开所有的if检查,而且程序主要部分都是在for中运行,避开了goto的使用,从而使效率大大提高(特别是针对特大数字)。所给程序代码支持 200 位以内数字的加法。
::code by youxi01@cn-dos.net
@echo off&setlocal enabledelayedexpansion
set "str1=qwer/asdf2/asd34f/123456789012345665644654456454665446565446544665446546545644565465464646546544654546654654465654465654665465465465446565446564/asdf/aaaa"
set "str2=aaaaa2/23456789012345678654466544466544641125654456455464654546654465654465446554665445454654544545654/asdfssasd/asdaa"
call :GetNum %str1% num1
call :GetNum %str2% num2
call :lineup num1
call :lineup num2
set/a flag=0
for /l %%i in (2 1 199) do (
set/a var=!num1:~-%%i,1!+!num2:~-%%i,1!+!flag!
set var=0!var!
set flag=!var:~-2,1!
set str=!var:~-1!!str!
)
for /f "delims=0 tokens=*" %%i in ("!str!") do echo %%i
pause>nul
:GetNum OBJ Res
   for /f "delims=/ tokens=1,*" %%i in ("%~1") do (
       if %%i LSS a set %2=%%i & goto :eof
       call :GetNum "%%j" %2
     ) & goto :eof
:lineup obj
    for /l %%i in (1 1 200) do set %1=0!%1!
    call set %1=!%1:~-200!
[ Last edited by youxi01 on 2007-8-15 at 09:07 PM ]

2007-8-15 20:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 36 楼』:  

高手看看这个行不??


@echo off
set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"
SETLOCAL ENABLEDELAYEDEXPANSION
set tester=500
:main1
FOR /F "tokens=1,2* delims=/" %%i in ("%num1%") do (
set NTC=
set RUS=
set NTC=%%i
set /a RUS=%tester%+!NTC!>>nul>>nul
if !ERRORLEVEL!==9168 set shuzi1=!NTC!
set num1=%%j/%%k
goto main1
)
cls
:main2
FOR /F "tokens=1,2* delims=/" %%a in ("%num2%") do (
set NTC=
set RUS=
set NTC=%%a
set /a RUS=%tester%+!NTC!>>nul>>nul
if !ERRORLEVEL!==9168 set shuzi2=!NTC!
set num2=%%b/%%c
goto main2
)
cls
echo !shuzi1!
echo !shuzi2!
pause

2007-8-15 22:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





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


:: 写了个补位的,如你所说,全局没有一个goto和if
:: 但是效率好像没见有什么提高啊?

@echo off & setlocal enabledelayedexpansion
set "num1=qwer/2asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"

set "num1=%num1:/= %"&set "num2=%num2:/= %"&set b=1
for %%i in (%num1% %num2%) do (
echo %%i|findstr "^[0-9]*$">nul&&set num!b!=%%i&&set /a b+=1
)
echo !num1! + !num2!
for /l %%i in (1 1 200) do (
set num1=0!num1!
set num2=0!num2!
)
set num1=!num1:~-200!&set num2=!num2:~-200!

set jin=0
for /l %%i in (-1 -1 -200) do (
set /a a=!num1:~%%i,1!+!num2:~%%i,1!+!jin!
set jie=!a:~-1!!jie!
set a=0!a!
set jin=!a:~-2,1!
)
for /f "tokens=* delims=0" %%i in ("!jie!") do echo.&echo %%i
echo.&pause




致精致简!
2007-8-16 20:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 38 楼』:  

哦,你试下特大数字就知道了

2007-8-16 20:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 39 楼』:  

LZ给的数字很长。
直接用set运算会报错。ERROELV为9168
那样只要只要检测到ERRORLEVEL==9168不就可以了?

2007-8-16 20:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: