Board logo

标题: [数值计算] [已解决]批处理set /a的乘法运算该怎么写? [打印本页]

作者: sgaizxt001    时间: 2010-4-27 08:51     标题: [已解决]批处理set /a的乘法运算该怎么写?

这是我做的batman的摩尔斯密码题代码,但是出错,目前发现是set /a的乘法运算我不会写
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set A="17-5-5-1 8-2-2-4 17-10-4-4 9-8-3-1 3-2-5-3 21-7-1-2 15-9-1-3"
  4. set B="24-5-3-1 10-5-3-4 28-5-1-2 3-2-5-3 21-7-1-2 7-10-4-4 25-5-4-4 32-1-5-3 31-3-5-3 25-7-1-2 12-2-4-1 3-2-5-1"
  5. rem 把每串分行写进临时文本
  6. for %%i in ("%a%") do (
  7.   set str=%%i
  8.   set str=!str:"=!
  9.   call echo %%str%% >>tmp_.txt
  10.                       )
  11. rem 设置s_kip等于X版Y行在homebook.txt的第多少行,设置t_ook为那一行的中文母本字符在那一行中文母本的位置的前一位
  12. for /f "tokens=1,2,3,4 delims=-" %%i in (tmp_.txt) do (
  13.   set /a num1=%%i,num2=%%j,num3=%%k,num4=%%l
  14.   set /a s_kip=(num1-1)*14+num2+2
  15.   set /a t_ook=(num3-1)*4+num4-1
  16.   rem 这个for是取得homebook.txt的第s_kip行的母本。
  17.   for f "tokens=1,2* delims=:" %%a in ('findstr /n .* homebook.txt') do (
  18.     set numm=%%i
  19.     if %s_kip% equ numm  set str=%%c
  20.     set str=!str:-=!
  21.     set str=!str: =!
  22.     rem 这个for是获取字符
  23.     for %%I in ("%str%") do set (
  24.       set stt=%%i
  25.       set word=!stt:~!t_ook!,1!
  26.       call echo %%word%%         
  27.                                 )  
  28.                                                                          )
  29.                                                      )
  30. pause
  31. del tmp_.txt
复制代码
我在查错的时候,在set /a s_kip=(num1-1)*14+num2+2这里就提示此时不应该有*14+num2+2

[ 本帖最后由 sgaizxt001 于 2010-4-27 21:34 编辑 ]
作者: neorobin    时间: 2010-4-27 10:09

发现 3 个错误:

1. 在 for 的循环体内, set /a 后的表达式中至少把 () 的部分用双引号引起来
  1.   set /a s_kip="(num1-1)"*14+num2+2
  2.   set /a t_ook="(num3-1)"*4+num4-1
复制代码
2.
for f "tokens=1,2* delims=:"
少了斜线, 应为
  1. for /f "tokens=1,2* delims=:"
复制代码
3.
if %s_kip% equ numm  set str=%%c
一个变量该用延迟却没用, 另一个都没有扩展起来
  1. if !s_kip! equ !numm! set str=%%c
复制代码

作者: hanyeguxing    时间: 2010-4-27 18:23

1,
set A="17-5-5-1 8-2-2-4 17-10-4-4 9-8-3-1 3-2-5-3 21-7-1-2 15-9-1-3"

设置变量是写成set "A=17-5-5-1 8-2-2-4 17-10-4-4 9-8-3-1 3-2-5-3 21-7-1-2 15-9-1-3"
2,
set B="24-5-3-1 10-5-3-4 28-5-1-2 3-2-5-3 21-7-1-2 7-10-4-4 25-5-4-4 32-1-5-3 31-3-5-3 25-7-1-2 12-2-4-1 3-2-5-1"

看不到你批处理中使用这个变量。。。
3,
rem 把每串分行写进临时文本
for %%i in ("%a%") do (
  set str=%%i
  set str=!str:"=!
  call echo %%str%% >>tmp_.txt
                      )
rem 设置s_kip等于X版Y行在homebook.txt的第多少行,设置t_ook为那一行的中文母本字符在那一行中文母本的位置的前一位
for /f "tokens=1,2,3,4 delims=-" %%i in (tmp_.txt) do (

尽量不要使用临时文件,这些可以直接写成
for %%h in (%A%) do for /f "tokens=1-4 delims=-" %%i in ("%%h") do (
4,
set /a num1=%%i,num2=%%j,num3=%%k,num4=%%l
直接使用这些变量进行,不需要set
5,
set /a s_kip=(num1-1)*14+num2+2
  set /a t_ook=(num3-1)*4+num4-1

要写成set/a "s_kip=(%%i-1)*14+%%j+2"
6,
for f "tokens=1,2* delims=:" %%a in ('findstr /n .* homebook.txt') do (
    set numm=%%i
按照你的目的,这个时候应该是%%a吧?for /f。。。
7,
if %s_kip% equ numm  set str=%%c
既然下面都是面向str在处理,那么这些行都该是这个if的子句,那么就该应()括起来if "!s_kip!"=="%%a" (
8,
for %%I in ("%str%") do set (
既然上面已经set str=!str: =!了,那么变量str中就没有了空格,猜测也不会有其他分隔符,那么这个for 也就没太大的必要了,而且do set 是为什么?
9,
set stt=%%i
上边是%%I,这里是%%i?这里的变量名是区分大小写的。。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "A=17-5-5-1 8-2-2-4 17-10-4-4 9-8-3-1 3-2-5-3 21-7-1-2 15-9-1-3"
  3. set "B=24-5-3-1 10-5-3-4 28-5-1-2 3-2-5-3 21-7-1-2 7-10-4-4 25-5-4-4 32-1-5-3 31-3-5-3 25-7-1-2 12-2-4-1 3-2-5-1"
  4. for %%h in (%A%) do for /f "tokens=1-4 delims=-" %%i in ("%%h") do (
  5.         set/a "s_kip=(%%i-1)*14+%%j+2"
  6.         set/a "t_ook=(%%k-1)*4+%%l-1"
  7.         for /f "tokens=1,2* delims=:" %%a in ('findstr /n .* homebook.txt') do (
  8.         if "!s_kip!"=="%%a" (
  9.                 set str=%%c
  10.                 set str=!str:-=!
  11.                 set str=!str: =!
  12.                 call echo.%%str:~!t_ook!,1%%
  13.                 )  
  14.         )
  15. )
  16. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-4-27 18:49 编辑 ]
作者: sgaizxt001    时间: 2010-4-27 19:54

错误真不少,谢谢指点。但是还是没有得出结果,我再看看我的代码
作者: hanyeguxing    时间: 2010-4-27 20:25

贴homebook.txt的部分内容啊
作者: sgaizxt001    时间: 2010-4-27 21:13

http://www.bathome.net/thread-6467-1-1.html
第15版
*******************************************************************
第1行:        貉-姓-担-轼 缥-斓-年-钕 遛-站-炀-魂 疗-各-傿-嵇 鯆-启-挚-颜
第2行:        摧-检-胭-砝 帐-鲭-纩-疴 荦-幌-厦-痔 枇-丧-豢-溟 笤-榔-葑-膑
第3行:        昨-魬-藜-冠 腙-请-氆-揠 跻-端-绐-椟 螳-菌-褰-崖 据-睾-肭-遄
第4行:        涠-蓝-鸿-谁 骘-熛-懂-嘧 岸-坊-猃-踢 鳙-哧-枢-铵 型-断-美-杯
第5行:        煽-瞑-蝙-鲠 懑-碘-爬-翋 貘-韵-浔-危 洋-蜈-愤-傜 缲-僦-溺-舸
第6行:        琼-弨-恪-缛 碎-桕-荛-膛 疙-屉-捷-胡 牧-蕊-澜-赇 伏-姗-菔-闳
第7行:        碑-陂-邋-柑 征-匀-荪-挢 彩-槎-疱-卉 娥-侃-阂-颊 傣-枥-锡-逃
第8行:        供-鞫-俸-贱 宄-笥-辰-棁 脸-酌-泉-饥 喜-娇-乖-和 赌-嗒-摸-卒
第9行:        鸺-酤-人-祎 筌-邶-銮-遇 舱-窝-鲈-唛 赶-佀-料-辑 杵-柃-躄-遁
第10行:        丑-坚-皓-症 习-縻-碇-亏 懦-松-望-甏 炸-售-怄-葩 泌-隆-肩-锥
*******************************************************************
好多的哦。。。
作者: sgaizxt001    时间: 2010-4-27 21:19

ok了,我set/a "t_ook=(%%k-1)*4+%%l-1"这里应该是set/a "t_ook=(%%k-1)*4+%%l",不过效率好底哦,在我电脑上是1.2秒,别人的只是零点几秒

[ 本帖最后由 sgaizxt001 于 2010-4-27 21:24 编辑 ]
作者: hanyeguxing    时间: 2010-4-27 22:46

把for /f "tokens=1,2* delims=:" %%a in ('findstr /n .* homebook.txt') do 提取出来,放到最外层,这样,整个批处理的核心就变成了对homebook.txt文本的快速处理,即以最快的速度完成对变量组的定义。
作者: sgaizxt001    时间: 2010-4-27 22:58

变快了,只有0.6秒了。看来这个for位置还是很重要的哈
思想是什么呢?对于文本来说,文本越大的就放在最外面吗?
作者: hanyeguxing    时间: 2010-4-28 18:23

原帖由 sgaizxt001 于 2010-4-27 22:58 发表
变快了,只有0.6秒了。看来这个for位置还是很重要的哈
思想是什么呢?对于文本来说,文本越大的就放在最外面吗?

放在里面是运行这个for /f和findstr的N次,放在外面就只运行一次。所以,在忽略其他因素的时候,for尽量减少套的层数。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2