中国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] 变量的检测和计算[难度:★] 上一主题 | 下一主题
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『楼 主』:  [挑战2] 变量的检测和计算[难度:★]

set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"

目标:在上面两个条件中提取出纯数字的组合,并计算这两个数字的和,然后正确输出到屏幕上。(提取上面两个字符串只可以使用一个子程序,因为是测试的关系,只给出2个字符串的组合)

编写条件:cmd (help里包含的命令)

难点:随机的数字存在位和计算时的溢出

目标人群:有一定批处理基础的人。

注:挑战会逐渐提高难度。(大家尽量就自己会做的做出来)

编写积分奖励:3分。

完成提取任务的一分,完成计算任务的二分。。

加分不是目的。是对能力的一种肯定。

2楼正确获取了 随机的字符串,但在处理计算时问题上有点问题。

输出为科学记数法。。但要求是:输出精确数值。。(完成第一项,加一分)

[ Last edited by flyinspace on 2007-4-30 at 01:19 PM ]



知,不觉多。不知,乃求知
2007-4-30 13:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 2 楼』:  

由于对P一窍不通 写个VBS吧
num1="qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
num2="aaaaa2/23456789012345678/asdfssasd/asdaa"
numarr=split(num1&"/"&num2,"/")
For i=0 To UBound(numarr)
if IsNumeric(numarr(i)) then
num=num+CDbl(numarr(i))
end if
Next
msgbox num
msgbox FormatNumber(num,0,,,0)
[ Last edited by baomaboy on 2007-4-30 at 04:37 PM ]

   此帖被 +4 点积分     点击查看详情   
评分人:【 zh159 分数: +3  时间:2007-4-30 15:46
评分人:【 flyinspace 分数: +1  时间:2007-4-30 15:46




好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-30 14:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





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



  Quote:
Originally posted by baomaboy at 2007-4-30 01:48 AM:
由于对P一窍不通 写个VBS吧
[code]
num1="qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
num2="aaaaa2/23456789012345678/asdfssasd/asdaa"
numarr=split(num1&"/"&num2,"/")
For i=0 To UBound(numarr)
if IsNumeric(numarr(i)) then
num=num+CDbl(numarr(i))
end if
Next
msgbox num

挑战失败:
原因见附件:

我们要求正确输出 结果。

[ Last edited by flyinspace on 2007-4-30 at 02:35 AM ]

附件 1: 1.JPG (2007-4-30 15:31, 3.91 K, 下载附件所需积分 1 点 ,下载次数: 2)




知,不觉多。不知,乃求知
2007-4-30 15:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




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

楼上的,二楼结果是正确的,E+16是科学计数的写法代表N*(1后面有16个零)
24691356902469134=2.46913569024691*10000000000000000=2.46913569024691E+16

   此帖被 +1 点积分     点击查看详情   
评分人:【 flyinspace 分数: +1  时间:2007-4-30 15:46


2007-4-30 15:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





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

不好意思,我也知道他的结果正确。。。。

但我们的要求是 :
         输出:24691356902469134
这个结果,而不是2.46913569024691E+16 这个结果。。

这个算我没有说清楚。。。。

若我们的数字再变化一下呢??  有 30位呢?

我们要求的是精确。。。呵呵。。

最后谢谢 zh159的指出。



知,不觉多。不知,乃求知
2007-4-30 15:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by flyinspace at 2007-4-30 15:46:
不好意思,我也知道他的结果正确。。。。

但我们的要求是 :
         输出:24691356902469134
这个结果,而不是2.46913569024691E+16 这个结果。。

这个 ...

那就格式化一下吧:
msgbox FormatNumber(num,0,,,0)

不过估计你那最后两位34没人能得到吧,早几年在Excel中就发现超过15位后全显示0,也许是微软觉得15位已经够用了限制了吧,呵呵,开玩笑的,反正我是用不到15位不深究了,有人知道指点下。

[ Last edited by baomaboy on 2007-4-30 at 04:51 PM ]



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-30 16:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
digger
初级用户

游荡的孤魂



积分 79
发帖 29
注册 2007-4-2
来自 湖南
状态 离线
『第 7 楼』:  

计算两数的和这个话题论坛里曾经有过专题讨论,在精华帖里,有难度啊。

2007-4-30 20:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




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

我曾经写过 大数字的 计算(乘法)的,计算数字在 100 位以内。

还有,看2F的代码 似乎 两个字符串 只是其中有一项目 是数字哦!(就是说 没有其它的特殊情况罗,比如:有两项数字又该怎么处理等?)

[ Last edited by youxi01 on 2007-4-30 at 08:56 PM ]

2007-4-30 20:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




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

提供一下思路:(因为马上要工作,就不能给出详细代码了。同时,因为搬家的原因,短期内要上不了网,所以也可能暂离联盟。)
1、关于各字符段的提取,昨天的挑战一就有相关代码。
2、提取出的各字符段,是否是数字相关判断的问题。此问题解决办法有三:
1>利用set/a 的特殊性,此办法不严谨,无法防止字符段恰好为0的情况。
2>利用findstr+正则,比较精确,但效率不高。
3>个人比较推荐的办法:拿字母(包括汉字)直接和数字比较大小,如果,某字符段是纯数字,它就一定比 a 小。缺点:无法处理特殊字符。
3、有关特大数字的计算。我们可以采取分段计算的办法,已经有相关讨论,我曾经也写过相关代码,在此不作赘述。

2007-4-30 21:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 10 楼』:  给出 计算 大数字的演示,提取好象大家都会?

@echo off & setlocal EnableDelayedExpansion
        set "a=123456789012485642424543456"
        set "b=234567890000000000000005678"
        call :GetLen "%a%"
        set "Len1=%Len%"
        call :GetLen "%b%"
        set "Len2=%Len%"
        set "s="
        set "bit=0"
        set "count=0"
:recompute
        set /a "count+=1"
        if %Len1% GEQ 9 (
                set "str1=%a:~-9%
                set "a=%a:~0,-9%"
                set /a "Len1-=9"
                ) else (
                set "str1=%a%"
                set "a=0"
                )
        if %Len2% GEQ 9 (
                set "str2=%b:~-9%"
                set "b=%b:~0,-9%
                set /a "Len2-=9"
                ) else (
                set "str2=%b%"
                set "b=0"
                )
call :formatstr %str1%
        set "str1=%xxx%
call :formatstr %str2%
        set "str2=%xxx%
        set /a "num=!str1!+!str2!+!bit!"
        call :GetLen "%num%"
        if '%Len% GTR 9' (
                set "bit=%num:~0,1%"
                set "num=%num:~-9%"
                )
        set "s=%num%%s%"
        echo [%count%]: %str1%[%Len1%]+%str2%[%Len2%]=%s%
        if "%a%"=="0" (
                if "%b%" == "0" (
                        goto :END
                )
        )
goto :recompute


:formatstr _str_
        set "xxx=%~1"
:reformat
        set "lll=9"
        if "%xxx:~0,1%"=="0" (
                set "xxx=!xxx:~1,%lll%!
                set /a "lll-=1"
                goto :reformat
                )
        goto :EOF

:GetLen
        set "string=%~1"
        for /l %%i in (0,1,255) do (
                if "!string:~%%i,1!"=="" (
                        set "Len=%%i"
                        goto :EOF
                        )
                )
        goto :EOF
:END
echo ——————————————————————————
echo 最后答案为:%s%
echo ——————————————————————————
echo 程序演示结束,任意键退出 & pause>nul

[ Last edited by flyinspace on 2007-4-30 at 04:29 PM ]



知,不觉多。不知,乃求知
2007-4-30 22:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhoushijay
高级用户

Autowalk


积分 845
发帖 375
注册 2007-3-3
状态 离线
『第 11 楼』:  

num1="qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
num2="aaaaa2/23456789012345678/asdfssasd/asdaa"
len1=len(num1)
len2=len(num2)


for i=1 to len1
nu1=mid (num1,i,1)

on error resume next
a=int(nu1)
if err.number=0 then
b=b&a
end if
next

for a=1 to len2
nu2=mid (num2,a,1)

on error resume next
d=int(nu2)
if err.number=0 then
s=s&d

end if
next
s=int(s)
b=int(b)

he=s+b

msgbox(he)正确的答案应该是2564691356902469134,我用计算器算了2遍

[ Last edited by zhoushijay on 2007-4-30 at 04:53 PM ]

2007-5-1 00:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by youxi01 at 2007-4-30 20:55:
我曾经写过 大数字的 计算(乘法)的,计算数字在 100 位以内。

还有,看2F的代码 似乎 两个字符串 只是其中有一项目 是数字哦!(就是说 没有其 ...

当数值型字串与数值在一起做运算时,数值型字串被当作数值



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-5-1 04:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





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



  Quote:
Originally posted by zhoushijay at 2007-4-30 11:58 AM:
nu1=mid (num1,i,1)

on error resume next
a=int(nu1)
if err.number=0 then
b=b&a
end if
next

for a=1 to len2
nu2=mid (num2,a,1)

on error resume next
d=int(nu2)
if err.number=0 then
s=s&d

end if
next
s=int(s)
b=int(b)

he=s+b
msgbox(he)
正确的答案应该是2564691356902469134,我用计算器算了2遍

=1234567890123456
23456789012345678+
--------------------------------
24691356902469134

怎么比也没有算错啊??

怎么会是
2564691356902469134呢?

[ Last edited by flyinspace on 2007-4-30 at 04:10 PM ]



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





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

抽出了点时间 写了这个..
结果为:24691356902469134

  Quote:

  1. @echo off & setlocal enabledelayedexpansion
  2. set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
  3. set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"
  4. set "num1=%num1:/= %" & call :get_number !num1! & set "num1=!t!"
  5. set "num2=%num2:/= %" & call :get_number !num2! & set "num2=!t!"
  6. set "result="
  7. :c_loop
  8. set /a x=%num1:~-8%
  9. set /a y=%num2:~-8%
  10. set /a z=%x%+%y%
  11. if defined flag set /a z=%z%+%flag%
  12. set "flag=%z:~0,-8%" >>nul 2>>nul && set "z=%z:~-8%"
  13. set "num1=%num1:~0,-8%"
  14. set "num2=%num2:~0,-8%"
  15. set "result=%z%%result%"
  16. if not defined num1 if not defined num2 set "result=%flag%%result%" & goto :show
  17. if not defined num1 set /a num1=0
  18. if not defined num2 set /a num2=0
  19. goto c_loop
  20. :show
  21. echo %result% & pause & goto :eof
  22. :get_number
  23. :loop
  24. echo %1 >>tmp.txt & shift
  25. if not "%1"=="" goto :loop
  26. for /f %%a in ('findstr /r "^[0-9]" tmp.txt') do set "t=%%a"
  27. del tmp.txt
         BJSH发表于:  2007-04-30  16:04



   此帖被 +3 点积分      点击查看详情   
评分人:【 flyinspace 分数: +3  时间:2007-5-1 05:34


2007-5-1 05:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




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



  Quote:
Originally posted by zhoushijay at 2007-4-30 11:58:
nu1=mid (num1,i,1)

on error resume next
a=int(nu1)
if err.number=0 then
b=b&a
end if
next

for a=1 to len2
nu2=mid (num2,a,1)

on error resume next
d=int(nu2)
if err.number=0 then
s=s&d

end if
next
s=int(s)
b=int(b)

he=s+b
msgbox(he)
正确的答案应该是2564691356902469134,我用计算器算了2遍

16位数+17位数怎么也不可能得出19位数啊?

   1234567890123456
 +23456789012345678
--------------------------------------
 =24691356902469134
=================
  2564691356902469134

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


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



论坛跳转: