标题: [数值计算] [已解决]批处理set /a的乘法运算该怎么写? [打印本页]
作者: sgaizxt001 时间: 2010-4-27 08:51 标题: [已解决]批处理set /a的乘法运算该怎么写?
这是我做的batman的摩尔斯密码题代码,但是出错,目前发现是set /a的乘法运算我不会写- @echo off
- setlocal enabledelayedexpansion
- 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 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"
- 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 (
- set /a num1=%%i,num2=%%j,num3=%%k,num4=%%l
- set /a s_kip=(num1-1)*14+num2+2
- set /a t_ook=(num3-1)*4+num4-1
- rem 这个for是取得homebook.txt的第s_kip行的母本。
- for f "tokens=1,2* delims=:" %%a in ('findstr /n .* homebook.txt') do (
- set numm=%%i
- if %s_kip% equ numm set str=%%c
- set str=!str:-=!
- set str=!str: =!
- rem 这个for是获取字符
- for %%I in ("%str%") do set (
- set stt=%%i
- set word=!stt:~!t_ook!,1!
- call echo %%word%%
- )
- )
- )
- pause
- 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 后的表达式中至少把 () 的部分用双引号引起来- set /a s_kip="(num1-1)"*14+num2+2
- set /a t_ook="(num3-1)"*4+num4-1
复制代码
2.for f "tokens=1,2* delims=:"
少了斜线, 应为- for /f "tokens=1,2* delims=:"
复制代码
3. if %s_kip% equ numm set str=%%c
一个变量该用延迟却没用, 另一个都没有扩展起来- 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,上边是%%I,这里是%%i?这里的变量名是区分大小写的。。- @echo off&setlocal enabledelayedexpansion
- 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 "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"
- for %%h in (%A%) do for /f "tokens=1-4 delims=-" %%i in ("%%h") do (
- set/a "s_kip=(%%i-1)*14+%%j+2"
- set/a "t_ook=(%%k-1)*4+%%l-1"
- for /f "tokens=1,2* delims=:" %%a in ('findstr /n .* homebook.txt') do (
- if "!s_kip!"=="%%a" (
- set str=%%c
- set str=!str:-=!
- set str=!str: =!
- call echo.%%str:~!t_ook!,1%%
- )
- )
- )
- 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 |