[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 输出杨辉三角的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
时光荏苒||新陈代谢&&涛声依旧||本性难移

回复 16# 悬崖之树


    各种等号运算符都是向右结合的,批处理中的其他运算符是向左结合,顺便说一句,因为括号优先级最高,所以它可以改变计算的顺序,如果能明白这两点,看下面这个帖子你一定会有收获的~
http://bbs.bathome.net/viewthread.php?tid=12689

TOP

回复 7# CrLf


    请问  set /a b=echo=1 是什么意思?
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

回复 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
复制代码
这样运行后一看回显就明白了

TOP

回复 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
复制代码
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

回复 12# 523066680


    嗯,好办法,这思路以前见过,给忘了
http://bathome.net/redirect.php? ... 8&fromuid=30406

TOP

回复 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
复制代码
1

评分人数

    • CrLf: 好思路技术 + 1

TOP

回复 10# 523066680


    有意思,%*

TOP

本帖最后由 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. )
复制代码

TOP

回复 8# 523066680


    优化时忘了删。已修改~

TOP

回复 7# CrLf


    喂,结果不对吧。
还有,签名居然是白色字体。
1

评分人数

    • CrLf: 感谢指正!技术 + 1

TOP

本帖最后由 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
复制代码

TOP

本帖最后由 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
复制代码

TOP

TOP

如果要提升速度,有三个建议:
  1. 首先是用 for /l 代替 goto :loop 来大幅加速
  2. 其次,set /p 是比较耗时的,可以把要输出的行合并到一个变量中再 echo
  3. 除此,还可以在set /p 之前加一句  set "$!a!!b!=" 清空已经用不着的变量,避免在层数大的时候多余的变量影响读写变量表的效率
复制代码

TOP

返回列表