Board logo

标题: [文本处理] 输出杨辉三角的BAT代码错在哪里? [打印本页]

作者: 悬崖之树    时间: 2013-7-14 17:59     标题: 输出杨辉三角的BAT代码错在哪里?

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set m=0&set $11=1
  4. :loop
  5. set /a m+=1
  6. for /l %%i in (1 1 %m%) do (
  7.    set /a a=%m%-1
  8.    set /a b=%%i-1
  9.    for %%a in (!a!) do (
  10.       for %%b in (!b!) do (
  11.          set /a $%m%%%i=!$%%a%%b!+!$%%a%%i!
  12.          set /p =!$%m%%%i! <nul
  13.       )
  14.    )
  15. )
  16. 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,小改一下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a m=0,$00=1
  4. :loop
  5. set /a m+=1
  6. for /l %%i in (1 1 %m%) do (
  7.    set /a a=%m%-1,b=%%i-1
  8.    set /a $%m%%%i=$!a!!b!+$!a!%%i
  9.    set /p =!$%m%%%i! <nul
  10. )
  11. set /a $%m%1=$%m%%m%=1
  12. echo.&goto loop
复制代码

作者: CrLf    时间: 2013-7-14 18:46

如果要提升速度,有三个建议:
  1. 首先是用 for /l 代替 goto :loop 来大幅加速
  2. 其次,set /p 是比较耗时的,可以把要输出的行合并到一个变量中再 echo
  3. 除此,还可以在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
  1. @echo off&setlocal enabledelayedexpansion
  2. set line=15
  3. for /l %%i in (1 1 %line%) do (
  4.     for /l %%j in (%%i -1 2) do (
  5.         set /a N=%%j-1
  6.         set /a $%%j+=$!N!
  7.     )
  8.     set $%%i=1
  9.     for /l %%j in (1 1 %%i) do set /p=!$%%j! <nul
  10.     echo.
  11. )
  12. pause
复制代码

作者: CrLf    时间: 2013-7-14 21:11

本帖最后由 CrLf 于 2013-7-14 21:27 编辑

我也来个:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a a=0,$00=1,end=15
  4. for /l %%a in (1 1 %end%) do (
  5. set /a b=echo=1
  6. for /l %%i in (2 1 %%a) do (
  7. set /a $%%a%%i=$!a!!b!+$!a!%%i,b=%%i
  8. set "echo=!echo! !$%%a%%i!"
  9. )
  10. echo;!echo!
  11. set /a $%%a1=$%%a%%a=1,a=%%a
  12. )
  13. 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 编辑

又长又粗糙
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a lv=0,maxlv=10
  4. call :Tri
  5. pause &exit
  6. :Tri
  7. set /a ever=0,lv+=1
  8. set str=
  9. for %%a in (%*) do (
  10. set /a next=ever+%%a,ever=%%a
  11. set "str=!str!!next! "
  12. )
  13. echo !str!1
  14. if %lv% lss %maxlv% (
  15. call :Tri !str!1
  16. )
复制代码

作者: CrLf    时间: 2013-7-14 22:10

回复 10# 523066680


    有意思,%*
作者: 523066680    时间: 2013-7-14 22:23

回复 11# CrLf

不call了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=
  4. for /l %%m in (1,1,10) do (
  5. set /a ever=0
  6. set ts=
  7. for %%a in (!str!) do (
  8. set /a next=ever+%%a,ever=%%a
  9. set "ts=!ts!!next! "
  10. )
  11. echo "!ts!1"
  12. set str=!ts!1
  13. )
  14. 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
还有,把你的代码小改一下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a m=0,$01=1
  4. for /l %%j in (1 1 10) do (
  5. set /a m+=1
  6. for /l %%i in (1 1 !m!) do (
  7.    set /a a=!m!-1,b=%%i-1
  8.    set /a $!m!%%i=$!a!!b!+$!a!%%i
  9.    call set /p =%%$!m!%%i%% <nul
  10. )
  11. echo.
  12. )
  13. pause
复制代码

作者: CrLf    时间: 2013-7-15 16:28

回复 14# 悬崖之树
  1. set /a var*1
复制代码
这里的 var 如果不存在,的确相当于 0,但你如果这么引用:
  1. set /a !var!*1
复制代码
  1. set /a %var%*1
复制代码
var 为空时就会出错,因为 *1 不是一个有效的算式,当出现找不到操作数的时候,建议这样:
  1. set /a 出错的算式
复制代码
写成:
  1. echo set /a 出错的算式
  2. set /a 出错的算式
  3. 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