标题: [其他] [已解决]求批处理3个循环同时进行的算法,思路,方法 [打印本页]
作者: hnfeng 时间: 2024-6-19 16:23 标题: [已解决]求批处理3个循环同时进行的算法,思路,方法
本帖最后由 hnfeng 于 2024-6-19 21:29 编辑
比如,
第一个变量从 0 到 2,递加1 ,一般用 for /L %%a in (0,1,2)
第二个变量从 5 到 7,递加1 ,一般用 for /L %%b in (5,1,7)
第三个变量从 6 到 7,递加2 ,一般用 for /L %%c in (6,2,10)
想得到的结果是
0_5_6
1_6_8
2_7_10
就是同时递加,再组合输出。求高手指教。最好是 BAT 或借助第三方小程序,谢谢。
下面的代码是不行的,结果不是期望- @echo off
- for /L %%a in (0,1,2) do (
- for /L %%b in (5,1,7) do (
- for /L %%c in (6,2,10) do (
- echo %%a_%%b_%%c
- )
- )
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2024-6-19 16:55
代码第3行是设定初始值,第4行设定差值:- @echo off
- setlocal enabledelayedexpansion
- set /a n1=0,n2=5,n3=6
- set /a m1=m2=1,m3=2
- for /l %%i in (1,1,3) do (
- echo,!n1!_!n2!_!n3!
- set /a n1+=m1,n2+=m2,n3+=m3
- )
- pause
复制代码
作者: aloha20200628 时间: 2024-6-19 17:17
本帖最后由 aloha20200628 于 2024-6-19 17:20 编辑
回复 1# hnfeng - @echo off &setlocal enabledelayedexpansion
- set/a "a=0,b=5,c=6"
- for %%n in (0,1,1) do (
- set/a "a+=%%n,b+=%%n,c+=2*%%n"
- echo,!a!_!b!_!c!
- )
- endlocal&pause&exit/b
复制代码
作者: aloha20200628 时间: 2024-6-19 19:35
本帖最后由 aloha20200628 于 2024-6-19 19:38 编辑
回复 1# hnfeng
再给一个基于一楼三层循环结构的版本
- @echo off &setlocal enabledelayedexpansion
- for /L %%a in (0,1,2) do (
- for /L %%b in (5,1,7) do (
- for /L %%c in (6,2,10) do if not defined c1 (set "c1=%%c") else if not defined c2 (set "c2=%%c") else if not defined c3 (set "c3=%%c")
- if not defined b1 (set "b1=%%b") else if not defined b2 (set "b2=%%b") else if not defined b3 (set "b3=%%b")
- )
- if not defined a1 (set "a1=%%a") else if not defined a2 (set "a2=%%a") else if not defined a3 (set "a3=%%a")
- )
- for /L %%n in (1,1,3) do (echo,!a%%n!_!b%%n!_!c%%n!)
- endlocal&pause&exit/b
复制代码
作者: hnfeng 时间: 2024-6-19 21:20
代码第3行是设定初始值,第4行设定差值:
qixiaobin0715 发表于 2024-6-19 16:55
多谢多谢,巧妙的方法
作者: hnfeng 时间: 2024-6-19 21:22
回复 hnfeng
aloha20200628 发表于 2024-6-19 17:17
也是很巧妙的方法,多谢多谢
作者: hnfeng 时间: 2024-6-19 21:26
回复 hnfeng
再给一个基于一楼三层循环结构的版本
aloha20200628 发表于 2024-6-19 19:35
这个好像是把变量名也当作变量,学习了。多谢多谢
作者: qixiaobin0715 时间: 2024-6-20 10:11
要使用循环的话,平行结构是不是比嵌套更容易理解一些:- @echo off
- setlocal enabledelayedexpansion
- set n=0
- for /l %%a in (0,1,2) do (
- set /a n+=1
- set x!n!=%%a
- )
- set n=0
- for /l %%a in (5,1,7) do (
- set /a n+=1
- set y!n!=%%a
- )
- set n=0
- for /l %%a in (6,2,10) do (
- set /a n+=1
- set z!n!=%%a
- )
- for /l %%a in (1,1,3) do (
- echo,!x%%a!_!y%%a!_!z%%a!
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2024-6-20 15:57
使用嵌套结构也可以这样:- @echo off
- setlocal enabledelayedexpansion
- set n1=0
- for /l %%a in (0,1,2) do (
- set /a n1+=1
- set n2=0
- for /l %%b in (5,1,7) do (
- set /a n2+=1
- set n3=0
- for /l %%c in (6,2,10) do (
- set /a n3+=1
- if !n1! equ !n2! (
- if !n1! equ !n3! (
- echo %%a_%%b_%%c
- )
- )
- )
- )
- )
- pause
复制代码
作者: hnfeng 时间: 2024-6-20 17:11
回复 8# qixiaobin0715
学习了,却似更好理解,多谢
作者: qixiaobin0715 时间: 2024-6-24 09:28
实际上上述问题可以改成更通用一些,即:
1.等差数列个数任意,即循环次数不定;
2.每个等差数列的列数任意但要相同。
感觉也能实现。
例如,代码既能处理楼主提供的3个循序,稍加改动也能处理下面一组数列(初值,差值,终值):
0,1,3
5,1,8
6,2,12
10,3,19
20,2,26
处理后的结果为:
0_5_6_10_20
1_6_8_13_22
2_7_10_16_24
3_8_12_19_26
作者: hnfeng 时间: 2024-6-25 06:35
实际上上述问题可以改成更通用一些,即:
1.等差数列个数任意,即循环次数不定;
2.每个等差数列的列数任 ...
qixiaobin0715 发表于 2024-6-24 09:28
这方法确实很方便延伸扩展
作者: qixiaobin0715 时间: 2024-6-25 08:11
回复 11# qixiaobin0715
根据需要,只需修改代码第3行即可:- @echo off
- setlocal enabledelayedexpansion
- set m="0,1,3" "5,1,8" "6,2,12" "10,3,19" "20,2,26"
- for %%i in (%m%) do (
- set n=0
- for /l %%j in (%%~i) do (
- set /a n+=1
- for %%k in (!n!) do (
- if not defined x%%k (
- set x%%k=%%j
- ) else (
- set x%%k=!x%%k!_%%j
- )
- )
- )
- )
- for /l %%i in (1,1,!n!) do (
- echo,!x%%i!
- )
- pause
复制代码
作者: hnfeng 时间: 2024-6-25 19:01
回复 qixiaobin0715
根据需要,只需修改代码第3行即可:
qixiaobin0715 发表于 2024-6-25 08:11
佩服,很好的方法
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |