[ 新手练习 小结 ] 批处理寻找随机数
[code]set %random%=%random%[/code]目的:大家也从习题集中学了不少了。这个题目将综合考察新手们对 for、set 的运用能力,当然基础部分的变量截取、随机数等也有涉及。要求:添加代码找出这两个随机数(一个是变量,另一个是它的值),并计算出这两个数各位数字的和。方法不限,可以生成临时文件,当然不用临时文件更好。
随机数如果是这样的:123=456,
那么 [各位数字的和] = 1 + 2 + 3 + 4 + 5 + 6。
==================================
[color=Blue]显示时不要求显示过程,可以这样显示:[/color]
随机变量为 123,其值为 456;
各位数的和为 21。
上面的这行代码不能改动,这个要求和以前是一样的。
评分:完美代码 10:
无临时文件 3,
代码简洁 3,
速度 2,
代码可读性 2。[quote]参考:set 命令使用 详解
[url=http://bbs.bathome.net/thread-57-1-1.html]http://bbs.bathome.net/thread-57-1-1.html[/url]
for 语句从入门到精通
[url=http://bbs.bathome.net/thread-2189-1-1.html]http://bbs.bathome.net/thread-2189-1-1.html[/url]
set 截取字符详解
[url=http://bbs.bathome.net/thread-996-1-2.html]http://bbs.bathome.net/thread-996-1-2.html[/url]
[/quote]
[[i] 本帖最后由 wxcute 于 2008-11-21 18:53 编辑 [/i]] 呵,wxcute兄出的题目越来越有水平了,说难也不难,说不难也的确要动一下脑子。强烈支持!!![code]
@echo off&setlocal enabledelayedexpansion
set %random%=%random%
for /f "delims=" %%i in ('set') do set str=%%i&goto start
:start
echo %str%
for /f "tokens=1,2 delims==" %%i in ("%str%") do set num=%%i%%j
:calc
set var=!num:~,1!
set /a s+=var
set /p=%var%+<nul
set num=!num:~1!
if defined num goto calc
set /p==!s!<nul
pause>nul
[/code]
[[i] 本帖最后由 lhjoanna 于 2008-11-21 16:53 编辑 [/i]] 修改了一下,通过屏蔽错误输出,从而省略去掉str中“=”的步骤!可以稍微提高点效率~~
[code]@echo off&setlocal enabledelayedexpansion
set %random%=%random%
for /f "delims=" %%i in ('set') do set str=%%i&goto start
:start
echo %str%
:calc
set var=!str:~,1!
set /a s+=var
set /p=%var%+<nul 2>nul
set str=!str:~1!
if defined str goto calc
set /p==!s!<nul
pause>nul[/code]
[[i] 本帖最后由 lhjoanna 于 2008-11-21 17:11 编辑 [/i]] @echo off
set a=%random%=%random%
echo %a%
:calc
set var=%a:~,1%
set /a s+=var
set /p=%var%+<nul 2>nul
set a=%a:~1%
if defined a goto calc
set /p==%s%<nul
pause>nul set %random%=%random%
上面的这行代码不能改动,
这个要求是否有点高了?随机数,如何获取变量名?难道要通过判断变量名是否为纯数字?如此代码是否复杂化了?
回复 6楼 的帖子
因为此题是本练习题的一个小结,属于一个综合性的题目。因为题目是连贯性的,所以只要弄明白了前面的题目,这一题就不会很难了。唯一的比较难的点就是找到这个变量,这就看大家有没有掌握关于 SET 命令显示变量的用法了。
还有就是显示的时候没必要像 2 楼一样显示过程,像顶楼蓝字下面一样显示结果就行了。 [code]@setlocal enabledelayedexpansion
set %random%=%random%
@echo off
::没有在开头使用是为了对比检验结果。完全可以移到首行
for /l %%i in (0 1 32767) do (if defined %%i (set i=%%i)&goto next)
:next
::这里使用一个跳转是为了节约CPU资源,不直接跳转是为了防止出错。
echo 随机变量为:%i%
echo 其值为:!%i%!
set num=0
set b=%i%
set c=!%i%!
for /l %%a in (0 1 4) do (
set /a num+=!b:~%%a,1!
set /a num+=!c:~%%a,1!
)
echo 各位数的和为:%num%
pause>nul[/code]
试验后发现位数不足五位时会有错误提示,修改屏蔽提示。
[code]@setlocal enabledelayedexpansion
set %random%=%random%
@echo off
for /l %%i in (0 1 32767) do (if defined %%i (set i=%%i)&goto next)
:next
echo 随机变量为:%i%
echo 其值为:!%i%!
set num=0
set b=%i%
set c=!%i%!
for /l %%a in (0 1 4) do (
set /a num+=!b:~%%a,1! 2>nul
set /a num+=!c:~%%a,1! 2>nul
)
echo 各位数的和为:%num%
pause>nul[/code]
[[i] 本帖最后由 firewolf85 于 2008-12-20 19:11 编辑 [/i]] 学习一下,厉害啊………………!
寻找随机数代码
@echo off&setlocal enabledelayedexpansion:: 分两部分求和,是个笨方法
set %random%=%random%
set/a a=%random%&echo 随机值为:!a!
set/a b=%random%&echo 其值为:!b!
echo/&echo -----------
echo %a%=%b%
echo -----------
for /f %%i in ("%a%%b%") do (
set/a a=%%i
set/a b=%%i
set/a a0=%a:~0,1%
set/a a1=%a:~1,1% 2>nul&set/a a1+=!a0!
set/a a2=%a:~2,1% 2>nul&set/a a2+=!a1!
set/a a3=%a:~3,1% 2>nul&set/a a3+=!a2!
set/a a4=%a:~4,1% 2>nul&set/a a4+=!a3!
set/a b0=%b:~0,1%
set/a b1=%b:~1,1% 2>nul&set/a b1+=!b0!
set/a b2=%b:~2,1% 2>nul&set/a b2+=!b1!
set/a b3=%b:~3,1% 2>nul&set/a b3+=!b2!
set/a b4=%b:~4,1% 2>nul&set/a b4+=!b3!
)
set/a b4+=%a4%
echo 和为:%b4%
pause>nul
[[i] 本帖最后由 jadych 于 2009-1-23 22:00 编辑 [/i]]
回复 10楼 的帖子
这个方法是不对的,因为 RANDOM 是在不断变化中的。可用 set 命令检验。
回复
对代码改动了下,谢谢楼主大哥指出的错误,对随机数概念认识不足。问楼主个问题,二楼代码中:set /p==!s!<nul这句如何解释?另对下面代码中逐个数字截取并相加那段代码能不能用简化代码来实现?@echo&setlocal enabledelayedexpansion
set %random%=%random%
for /f "delims=" %%i in ('set') do set num=%%i&call echo %%num%%&goto be
:be
for /f "tokens=1,2 delims==" %%j in ("%num%") do (
set/a a=%%j
set/a b=%%k
)
for /f %%l in ("%a%%b%") do (
set/a a=%%l
set/a b=%%l
set/a a0=%a:~0,1%
set/a a1=%a:~1,1% 2>nul&set/a a1+=!a0!
set/a a2=%a:~2,1% 2>nul&set/a a2+=!a1!
set/a a3=%a:~3,1% 2>nul&set/a a3+=!a2!
set/a a4=%a:~4,1% 2>nul&set/a a4+=!a3!
set/a b0=%b:~0,1%
set/a b1=%b:~1,1% 2>nul&set/a b1+=!b0!
set/a b2=%b:~2,1% 2>nul&set/a b2+=!b1!
set/a b3=%b:~3,1% 2>nul&set/a b3+=!b2!
set/a b4=%b:~4,1% 2>nul&set/a b4+=!b3!
)
set/a b4+=%a4%
echo 和为:%b4%
pause>nul
回复 12楼 的帖子
第一个问题参考:[url]http://bbs.bathome.net/viewthread.php?tid=57[/url]
set 命令使用 详解(2007-11-11日更新)
[url]http://bbs.bathome.net/viewthread.php?tid=1940[/url]
set /p=<nul是什么意思??
[url]http://bbs.bathome.net/thread-2646-1-2.html[/url]
请问>nul和<nul各有什么作用啊
二、简化方法提供 2 个思路罢
1空格隔开数字用最原始的 FOR 语句做加法
2利用除法与取余运算一次性算出,因为随机数位数是有限制的
随机加点,不知道批处理可以实现吗?
谢谢收藏了 [code]@echo off:back
setlocal enabledelayedexpansion
set %random%=%random%
set /a man=1
set /a men=1
set /a num1=0
set /a num2=0
for /F "delims=" %%n IN ('set') DO (
if !man! EQU 1 (set flog=%%n)
set man=!man!+1
)
for /f "delims== tokens=1,2" %%i in ("%flog%") do (
set ax1=%%i
set ax2=%%j
)
for /l %%a in (0 1 4) do (
set /a num1=!num1!+!ax1:~%%a,1! 2>nul
set /a num2=!num2!+!ax2:~%%a,1! 2>nul
)
if %num1% EQU %num2% goto end
endlocal
goto back
:end
echo %ax1% and %ax2% are all %num1%
pause > nul [/code]研究时发现这个变量永远在set的第一行,因为set中的系统变量没有数字开头的,于是乎我偷懒了
试试
[code]@echo offsetlocal enabledelayedexpansion
set /a a=%random%
set /a b=%random%
echo %a%=%b%
for /l %%i in (0,1,4) do (
set /a c1=c1+!a:~%%i,1!
set /a c2=c2+!b:~%%i,1! )
set /a c=c1+c2
echo %c%
pause>nul[/code]
再精炼一下
@echo offsetlocal enabledelayedexpansion
set /a a=%random%
set /a b=%random%
echo %a%=%b%
for /l %%i in (0,1,4) do (
set /a c1+=a:~%%i,1!
set /a c2+=!b:~%%i,1! )
set /a c=c1+c2
echo %c%
pause>nul
回复 1楼 的帖子
[code]@echo off
echo set %random%= %random% >>my.txt
for /f "tokens=2,3 delims== " %%i in (my.txt) do (
echo varName--%%i *** varValue--%%j
set x=%%i
set y=%%j
)
:xx 从左面截取一符号,放到右面,并添加“+”号,此时为字符串
set x=%x:~1%+^%x:~,1%
if "%x:~,1%" neq "+" goto xx else goto yy
rem 这里加引号,我实验了好多次才成功,花的时间主要在这个if中的引号上
:yy 对值进行循环移位,此时为字符串
set y=%y:~1%^+%y:~,1%
if "%y:~,1%" neq "+" goto yy
del /q my.txt
:end 把字符串,通过set /a 自动转化为数值计算。
call echo varName=%%x%%
set /a x=%x%0 &call echo %%x%%
call echo varValue=%%y%%
set /a y=%y%
call echo %%y%%
set /a total=%x%+%y%
call echo varName+varValue=%%total%%
echo. ok---bye
[/code]
[[i] 本帖最后由 myzwd 于 2009-3-2 02:29 编辑 [/i]] [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=15719&ptid=2607]1#[/url] [i]wxcute[/i] [/b]
郁闷了,一开始的时候,一直想用set 将=替换掉,在尝试了许久之后无法,
于是查询了许多帖子,然后从google搜到了论坛,才知道set无法替换=,崩溃。[code]
@echo off&setlocal enabledelayedexpansion
set %random%=%random%
for /f "delims=" %%i in ('set') do (set str=%%i&&goto A)
:A
for /f "delims== tokens=1,2" %%i in ("!str!") do (
echo first=%%i second=%%j
set "str=%%i%%j")
for /l %%i in (0 1 9) do (set "str=!str:%%i=+%%i!")
set /a t=!str!
echo total=!t!
pause[/code] [i=s] 本帖最后由 zaixinxiangnian 于 2011-8-7 22:30 编辑 [/i]
不理解二楼这句 (for /f "delims=" %%i in ('set') do set str=%%i) 为什么这行总是显示一样的结果 而不是显示默认的所有行的第一节内容,而且只显示一行 好难啊,我想到用
for /f "tokens=1,2 delims==" %%a in ('set^|findstr /b [0-9]')
来找到%random%=%random%前后的值。
但是后面还得逐字提取吗?伤脑筋。。 [code]
@echo off
setlocal enabledelayedexpansion
set %random%=%random%
for /f "tokens=1,2 delims==" %%a in ('set^|findstr /b [0-9]') do (
echo;变量%%a,其值%%b
set var=%%a%%b
)
for /l %%i in (0,1,10) do (
set /a n=%%i
call set /a sum+=%%var:~!n!,1%% 2>nul
)
echo;各位数的和是%sum%&pause>nul
[/code] [code]@echo off
setlocal enabledelayedexpansion
set var_random=%random%
set !var_random!=%random%
set sumresult=0
echo %var_random%=!%var_random%!
REM 计算随机变量名的各位数字之和
call:GetSum %var_random%!%var_random%!
echo %var_random%!%var_random%!=!sumresult!
exit /b 0
:GetSum
set randomstr=%1
for /l %%i in (0,1,30) do (
set tempnum1=!randomstr:~%%i, 1!
if "!tempnum1!"=="" (
goto EndVar
)
set /a sumresult+=!tempnum1!
)
:EndVar
goto:EOF
[/code]
页:
[1]