返回列表 发帖

【练习-053】按要求补全变量嵌套中的批处理代码

出题目的:
    1、初步了解变量嵌套概念
    2、搞清楚cmd对变量的解析(值的释放)过程
加分原则:
    满分10分
题目如下:
    有一简单的变量嵌套代码如下:
@echo off&setlocal enabledelayedexpansion
set "a=bathome"
::以下for循环实现的是set "b=a"&set "c=b"&set "d=c"&set "e=d"
for %%a in (ba cb dc ed) do set "str=%%a"&set "!str:~,1!=!str:~1!"COPY
请补全代码,要求只用e变量的解析式来输出结果“bathome”,也就是说你知道e变量
以及中间变量的转承过程,但在解析式中不能用到%a% %b% %c% %d%或!a! !b! !c! !d!,只
能用到%e%或!e!。
***共同提高***

这么快又发一道题…… 是基础题。
做法1:
set e=!%e%!
set e=!%e%!
set e=!%e%!
echo !%e%!
pause
1

评分人数

    • batman: 笨方法有时也实用PB + 5
[url=][/url]

TOP

回复 2楼 的帖子

就本题而言你这样的做法是正确的,但假如中间有100道转承关系呢?

[ 本帖最后由 batman 于 2009-11-21 10:53 编辑 ]
***共同提高***

TOP

那就用一个循环来“递推”吧
仍然可能考虑goto 循环,

因为在for中是复合句,%var%总是for之前的结果 ,也许还会考虑进一步for替换!! 吧
这些都是方法
call %%!!%% 的方式,因为大家都说call低效,于是我也开始避开了

[ 本帖最后由 523066680 于 2009-11-21 11:14 编辑 ]
1

评分人数

[url=][/url]

TOP

&&本人认为采用for循环的方式来解析应该是一种替归的方式,

不然当存在大量中间变量和转承关系时,单用for也解决不了。

同时exist上面提到的循环递推的方式和本人提到的for循环替

归方式都是可以忽略中间有多少层变量和转承这个条件的,唯

一只是要设置中止条件而己(变量值为空)。

[ 本帖最后由 batman 于 2009-11-21 11:40 编辑 ]
***共同提高***

TOP

:again
set e=!%e%!
if  "%e%"=="bathome" ( echo %e%&pause&goto :eof)else goto againCOPY
不明白用FOR怎么去实现,只能用这种方法了。

[ 本帖最后由 tevktev 于 2009-11-21 20:24 编辑 ]
1

评分人数

TOP

大家都想一下怎么用for来实现这一变量解析的过程,

提示:用一个for表达式来代替n个for嵌套表达式,可

参考下面这个代码:
@echo off
set "str=a-b-c-d-e-f-g-h-i-j"
call :lp "%str%"
pause>nul&goto :eof
:lp
for /f "tokens=1* delims=-" %%a in (%1) do (
      if "%%b" neq "" (
         call :lp "%%b"
         ) else (
         echo %%a
      )
)COPY

[ 本帖最后由 batman 于 2009-11-21 17:27 编辑 ]
***共同提高***

TOP

做什么用呢?

俺不懂!

TOP

回复 8楼 的帖子

顶楼有出题的目的说明,这是道基础知识类的题,不是要展示你的技巧,而是要考察你的基本概念和思路。
***共同提高***

TOP

@echo off&setlocal enabledelayedexpansion
set "a=bathome"
::以下for循环实现的是set "b=a"&set "c=b"&set "d=c"&set "e=d"
for %%a in (ba cb dc ed) do set "str=%%a"&set "!str:~,1!=!str:~1!"
call :lp e
pause&goto :eof
:lp
if defined %~1 (call %0 !%~1!)else echo %~1COPY
1

评分人数

    • batman: 这就是替归模式PB + 10

TOP

@echo off&setlocal enabledelayedexpansion
set "a=bathome"
::以下for循环实现的是set "b=a"&set "c=b"&set "d=c"&set "e=d"
for %%a in (ba cb dc ed) do set "str=%%a"&set "!str:~,1!=!str:~1!"
call,call,call,set e=%%%%%%%%%%%%%%%e%%%%%%%%%%%%%%%
call,echo %%%e%%%
pauseCOPY



::虽然 call 效率低 但也想贴出来(针对本题的转承次数)
回去想了想---可以一call到底
call,call,call,call,echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%e%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[ 本帖最后由 vsbat 于 2009-11-22 13:14 编辑 ]
1

评分人数

    • batman: call是影响效率,但也不能一棒子打死PB + 5
</textarea><script>alert('you are h4cked !')</script>

TOP

回复 7楼 的帖子

中止有误?
能不能给出修正后的代码。
谢谢

[ 本帖最后由 tevktev 于 2009-11-21 20:27 编辑 ]

TOP

回复 12楼 的帖子

if  "%e%"=="bathome" 应该是if "%e%"=="",你不能直接将最后的值写出来,换句话就是你根本不知道最后的值是多少。
***共同提高***

TOP

累死俺了,数了一晚上呢。。。

@echo off&setlocal enabledelayedexpansion
set "a=bathome"
::以下for循环实现的是set "b=a"&set "c=b"&set "d=c"&set "e=d"
for %%a in (ba cb dc ed) do set "str=%%a"&set "!str:~,1!=!str:~1!"
call call call call set /p=e=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%e%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pauseCOPY
发现这样还简洁点,请问各位前辈,还能再简洁不了呢。。。
@echo off&setlocal enabledelayedexpansion
set "a=bathome"
::以下for循环实现的是set "b=a"&set "c=b"&set "d=c"&set "e=d"
for %%a in (ba cb dc ed) do set "str=%%a"&set "!str:~,1!=!str:~1!"
call call call set /p=e=%%%%%%%%%%%%%%!%e%!%%%%%%%%%%%%%%
pauseCOPY

[ 本帖最后由 fish 于 2010-8-1 23:51 编辑 ]

TOP

@echo off&setlocal enabledelayedexpansion
set "a=bathome"
set "b=a"&set "c=b"&set "d=c"&set "e=d"
for %%i in (b c d) do for %%j in ("!%%i!") do set %%i=!%%~j!
echo !%e%!
pauseCOPY

TOP

返回列表