Board logo

标题: [原创]列表输出文档,一些学习心得 [打印本页]

作者: everest79     时间: 2007-3-25 05:00    标题: [原创]列表输出文档,一些学习心得

昨天看贴子有列表输出的,仔细想了下办法,做了个简单工具,在精简过程中发现set /a的一些特性,提出来大家探讨一下

set /a var1=(x...),var2=var1(x...),var3=var2(x...)
计算过程中,不因为一行命令的延缓约束来传送变量
例如以上,var2的计算过程中引用的var1就是前式结果
此例在for中依然有效,但call之后就不行了,不知什么原因
@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION 2>nul 3>nul
set arg=                                                                              1
:cfgf
if "%~1" == "" (set /p df=datafile:) else set df="%1"
set df=%df:"=%&&if not exist "%df%" goto cfgf
cls&echo file "%df%" line:10.
for /f "usebackq delims=" %%i in ("%df%") do set /a vvv+=1,1/(vvv%%10)&&echo %%i||echo.&&goto cfgc
:cfgc
set /p column=column:
set /a 0/column||goto cfgc
for /l %%i in (1,1,%column%) do set /p wcol%%i=col%%i:&&set /a 0/!wcol%%i!||goto cfgc
set /a wcol0=!wcol%column%!
cls&echo FILE:%df%        COLUMN:%column%
for /l %%i in (1,1,%column%) do echo COL%%i WIDTH:!wcol%%i!byte
echo setup ...&pause>nul

cls&for /f "usebackq" %%i in ("%df%") do (
set /a xxx+=1,zzz=xxx%%%column%
call set /a yyy=%%wcol!zzz!%%
set rga=%%i%arg%
call set/p=%%rga:~0,!yyy!%%<nul
set/p= <nul
set /a 1/zzz||echo.
)
echo/&pause

作者: lxmxn     时间: 2007-3-25 07:04

To everest79:

兄的代码有很多亮点,其中巧妙利用了set/a的很多特性,比如set /a 1/zzz||echo.,set的连续赋值(不知道说的对不对),值得好好的学习一下,支持!

今天把分用完了,改天给兄加分。

作者: everest79     时间: 2007-3-25 08:41
re lxmxn
  谢谢你的分,嘿嘿,平常在使用set/a时习惯性的都加了引用符号,反而把一些东西错过了,原来set/a连续赋值时各变量按先后顺序是有延缓特性,并且可以很好的工作在for这类命令中,一些简单的计数操作再也不用特意开启延缓了
作者: kcdsw     时间: 2007-3-25 08:44
晕倒啊  这分是俺加上去的  

这个这个连续赋值俺还是没看明白
作者: everest79     时间: 2007-3-25 08:47
下边代码就是连续赋值了,同时为a b c
set /a a=1+1,b=a*2,c=b-1

作者: everest79     时间: 2007-3-26 02:19
顶上来骗分
作者: stornager     时间: 2007-3-27 06:30    标题: 求教

brother  everest79:可否详细解释一下set/a的用法?????????
作者: lagunazeng     时间: 2007-3-27 07:50
是啊,set /a到底是用来干什么的?
作者: flyinspace     时间: 2007-3-27 09:45
汗.自己查看啊..help set就可以了.
作者: everest79     时间: 2007-3-27 10:14


  Quote:
Originally posted by stornager at 2007-3-26 05:30 PM:
brother  everest79:可否详细解释一下set/a的用法?????????

这个原理什么的讲不通,举个例子吧

set /a A=6-1,B=A*A,C=B-1,D=C/2

这个运算结果A=5 B=25 C=24 D=12,","是表达式分隔符,这条命令可以看作是一个表达式的集合,由结果可以发现不同于大多数命令的两个特点,第一,表达式是按先后次序来分层进行计算的,第二,每个表达式的结果也就是赋值在各个表达式间是可以按先后产生顺序来调用的,这是因为第一个特点产生的延时效果,这种延时效果在for之类命令中有较大的作用

通常我们在判断一个数是否为偶数时采用以下方法

set /a a=8%2  ;求除以2的余数
if %a% equ 0 echo %a%是偶数  ;判断余数是否为零,若是则为偶数

现在直接用set来完成

set /a 1/(8%2) 2>nul ||echo %a%是偶数

这样节省了变量空间,并简化了代码
这种方法在配合前边提到的两个特点,可以将一些工作变得简单起来
作者: flyinspace     时间: 2007-3-27 10:24
set /a 1/(8%2) 2>nul ||echo %a%是偶数
不明白这一句??

变量a从那里来的??
作者: everest79     时间: 2007-3-27 10:26
复制来的
作者: flyinspace     时间: 2007-3-27 10:52
这么说吧.
set /a a=8%2  ;求除以2的余数
if %a% equ 0 echo %a%是偶数  ;判断余数是否为零,若是则为偶数
上面这段话很好理解.
我知道什么变量做了一些什么事?

而set /a 1/(8%2) 2>nul ||echo %a%是偶数
而这一句.若是单独用出来.
就会在屏幕上显示%a%

至于你说的复制来的。
我就更加不明白从那里复制来的..
作者: everest79     时间: 2007-3-27 23:52
晕呀,那第二个echo %a%是偶数当然是复制第一个了