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

凑热闹

好早之前看到这个帖子了,在这个帖子还没有回复的时候就开始研究写了代码,可是错误不少,后来因为工作的事就一直没时间去斟酌。现在有时间了,仔细看了下,终于改出来了,本来挺高兴的,结果上来一看,前辈们早就把代码反复推敲了N久了,而且问题的本质已经从对症下药给出合理的解决代码上升倒了代码效率高下的研究,这是本人不敢企及的。本来不打算把代码贴上来了,可是本人后来输入较大点的数字的时候,又出现一个问题,就是“已经达到最大的setlocal递归层”但是似乎幻方的生成还是没有影响,数字也都对,我不太明白这个错误怎么长生的。老调重弹,麻烦前辈们给解释下,不胜感激!
我写的代码如下:
  1. @echo off
  2. :start
  3. set /p n=Please input your odd integer:
  4. set /a p=n%%2
  5. if %p% equ 0 echo Input error!&&goto start
  6. set /a i=%n%
  7. set /a t=(%n%+1)/2
  8. set /a a%t%_%n%=1,temp=1,m=n-1,p=n
  9. :repeat
  10. set /a p-=1
  11. if %p% lss 0 goto array
  12. for /l %%a in (1 1 %m%) do (
  13.    setlocal enabledelayedexpansion
  14.    if !t! gtr %n% set /a t=1
  15.    if !i! gtr %n% set /a i=1
  16.    set /a s=!t!+1,q=!i!+1
  17.    if !s! gtr %n% set /a s=1
  18.    if !q! gtr %n% set /a q=1
  19.    set /a a!s!_!q!=a!t!_!i!+1,t+=1,i+=1
  20.    set /a temp+=1
  21.    if !temp! equ %n% (
  22.          set /a temp=1,tmp=a!s!_!q!,q-=1,i-=1
  23.          if !q! equ 0 set /a q=n
  24.          set /a a!s!_!q!=tmp+1
  25.          goto repeat
  26. )   
  27. )
  28. pause
  29. :array
  30. echo Now behold the powerful Magic Sqaure^^!:
  31. set /a a!t!_!n!=1
  32. for /l %%c in (!n! -1 1) do (
  33.    for /l %%d in (1 1 !n!) do (
  34.               set /a result=a%%d_%%c
  35.               set /p=!result!<nul      
  36. )
  37. echo.
  38. )
  39. pause>nul
复制代码
如上,输入7以上的奇数就会出现那个问题,没弄明白,只好请教诸位了。
Still with wax

TOP

晕菜啊,这么久也没人来指点一下啊,再等~
Still with wax

TOP

变量延迟不要放在for里面

TOP

回复 31楼 的帖子

“已经达到最大的setlocal递归层”的问题,请参考:
http://bbs.bathome.net/thread-1224-1-3.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 33楼 的帖子

呵呵,就要这种效果,一句话就解决,我把变量延迟放到外面就不会提示那个错误了。再去好好看看这个问题的描述,多谢啦!
Still with wax

TOP

回复 35楼 的帖子

确实应该好好看看,也许你会发现不把变量延迟扩展放在for里面有时可能带来更多的问题^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 36楼 的帖子

那个帖子我看了,上面说最好把变量延迟扩展申明放在for结构内,哪里需要哪里申明,然后再结束,那我的问题不就没办法解决了么?我试过了,在for里申明然后在结构结束之前用endlocal结束,结果还是会出现那个恼人的错误提示。但是我照33楼兄弟的说法把申明放到for结构之前,问题就没有了。到底哪个是对的?如果要放在for里面的话,如何把我的问题解决?
Still with wax

TOP

回复 37楼 的帖子

把setlocal enabledelayedexpansion放在for语句里面是为了防止读取某些含有叹号!字符串时,丢失叹号!字符。

而你的这个算幻方的题,可能不涉及到叹号!字符串的处理。所以可以把setlocal enabledelayedexpansion放在for语句外面防止超过最大递归层。

但当你处理一些含有叹号!字符串时,应该注意把setlocal enabledelayedexpansion放在for语句内部,防止丢失。

这就叫 “随机应变”,就是看情况选择setlocal enabledelayedexpansion的位置。
(*^_^*)

TOP

返回列表