标题: [文本处理] 输出杨辉三角的BAT代码错在哪里? [打印本页]
作者: 悬崖之树 时间: 2013-7-14 17:59 标题: 输出杨辉三角的BAT代码错在哪里?
- @echo off
- setlocal enabledelayedexpansion
- set m=0&set $11=1
- :loop
- set /a m+=1
- for /l %%i in (1 1 %m%) do (
- set /a a=%m%-1
- set /a b=%%i-1
- for %%a in (!a!) do (
- for %%b in (!b!) do (
- set /a $%m%%%i=!$%%a%%b!+!$%%a%%i!
- set /p =!$%m%%%i! <nul
- )
- )
- )
- echo.&goto loop
复制代码
为什么老是提示“找不到操作数”,怀疑可能是!$%%a%%b!+!$%%a%%i!没有被扩展。
目的是输出如下文本:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
作者: CrLf 时间: 2013-7-14 18:04
本帖最后由 CrLf 于 2013-7-14 18:05 编辑
三角形外的那一圈没赋值为 0,用 !var! 得到的结果就是空的
作者: CrLf 时间: 2013-7-14 18:18
计算前先补齐三角形上一层左右的 1,小改一下:- @echo off
- setlocal enabledelayedexpansion
- set /a m=0,$00=1
- :loop
- set /a m+=1
- for /l %%i in (1 1 %m%) do (
- set /a a=%m%-1,b=%%i-1
- set /a $%m%%%i=$!a!!b!+$!a!%%i
- set /p =!$%m%%%i! <nul
- )
- set /a $%m%1=$%m%%m%=1
- echo.&goto loop
复制代码
作者: CrLf 时间: 2013-7-14 18:46
如果要提升速度,有三个建议:- 首先是用 for /l 代替 goto :loop 来大幅加速
- 其次,set /p 是比较耗时的,可以把要输出的行合并到一个变量中再 echo
- 除此,还可以在set /p 之前加一句 set "$!a!!b!=" 清空已经用不着的变量,避免在层数大的时候多余的变量影响读写变量表的效率
复制代码
作者: terse 时间: 2013-7-14 19:46
http://bbs.bathome.net/viewthrea ... mp;page=1#pid104388
作者: terse 时间: 2013-7-14 20:04
本帖最后由 terse 于 2013-7-14 23:19 编辑
递增0起 是不是多输一行啊
加第一个1
改一下 多余的 for- @echo off&setlocal enabledelayedexpansion
- set line=15
- for /l %%i in (1 1 %line%) do (
- for /l %%j in (%%i -1 2) do (
- set /a N=%%j-1
- set /a $%%j+=$!N!
- )
- set $%%i=1
- for /l %%j in (1 1 %%i) do set /p=!$%%j! <nul
- echo.
- )
- pause
复制代码
作者: CrLf 时间: 2013-7-14 21:11
本帖最后由 CrLf 于 2013-7-14 21:27 编辑
我也来个:- @echo off
- setlocal enabledelayedexpansion
- set /a a=0,$00=1,end=15
- for /l %%a in (1 1 %end%) do (
- set /a b=echo=1
- for /l %%i in (2 1 %%a) do (
- set /a $%%a%%i=$!a!!b!+$!a!%%i,b=%%i
- set "echo=!echo! !$%%a%%i!"
- )
- echo;!echo!
- set /a $%%a1=$%%a%%a=1,a=%%a
- )
- pause
复制代码
作者: 523066680 时间: 2013-7-14 21:22
回复 7# CrLf
喂,结果不对吧。
还有,签名居然是白色字体。
作者: CrLf 时间: 2013-7-14 21:27
回复 8# 523066680
优化时忘了删。已修改~
作者: 523066680 时间: 2013-7-14 21:56
本帖最后由 523066680 于 2013-7-14 22:03 编辑
又长又粗糙- @echo off
- setlocal enabledelayedexpansion
- set /a lv=0,maxlv=10
- call :Tri
- pause &exit
-
- :Tri
- set /a ever=0,lv+=1
- set str=
- for %%a in (%*) do (
- set /a next=ever+%%a,ever=%%a
- set "str=!str!!next! "
- )
- echo !str!1
- if %lv% lss %maxlv% (
- call :Tri !str!1
- )
复制代码
作者: CrLf 时间: 2013-7-14 22:10
回复 10# 523066680
有意思,%*
作者: 523066680 时间: 2013-7-14 22:23
回复 11# CrLf
不call了- @echo off
- setlocal enabledelayedexpansion
- set str=
-
- for /l %%m in (1,1,10) do (
- set /a ever=0
- set ts=
- for %%a in (!str!) do (
- set /a next=ever+%%a,ever=%%a
- set "ts=!ts!!next! "
- )
- echo "!ts!1"
- set str=!ts!1
- )
- pause
复制代码
作者: CrLf 时间: 2013-7-14 22:50
回复 12# 523066680
嗯,好办法,这思路以前见过,给忘了
http://bathome.net/redirect.php? ... 8&fromuid=30406
作者: 悬崖之树 时间: 2013-7-15 16:18
回复 3# CrLf
“ 三角形外的那一圈没赋值为 0,用 !var! 得到的结果就是空的”
我认为用!var!得到的值是0
还有,把你的代码小改一下:- @echo off
- setlocal enabledelayedexpansion
- set /a m=0,$01=1
- for /l %%j in (1 1 10) do (
- set /a m+=1
- for /l %%i in (1 1 !m!) do (
- set /a a=!m!-1,b=%%i-1
- set /a $!m!%%i=$!a!!b!+$!a!%%i
- call set /p =%%$!m!%%i%% <nul
- )
- echo.
- )
- pause
复制代码
作者: CrLf 时间: 2013-7-15 16:28
回复 14# 悬崖之树 复制代码
这里的 var 如果不存在,的确相当于 0,但你如果这么引用:复制代码
复制代码
var 为空时就会出错,因为 *1 不是一个有效的算式,当出现找不到操作数的时候,建议这样:复制代码
写成:- echo set /a 出错的算式
- set /a 出错的算式
- pause
复制代码
这样运行后一看回显就明白了
作者: 悬崖之树 时间: 2013-7-15 22:05
回复 7# CrLf
请问 set /a b=echo=1 是什么意思?
作者: CrLf 时间: 2013-7-16 17:23
回复 16# 悬崖之树
各种等号运算符都是向右结合的,批处理中的其他运算符是向左结合,顺便说一句,因为括号优先级最高,所以它可以改变计算的顺序,如果能明白这两点,看下面这个帖子你一定会有收获的~
http://bbs.bathome.net/viewthread.php?tid=12689
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |