Board logo

标题: [其他] [已解决]求批处理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 或借助第三方小程序,谢谢。

下面的代码是不行的,结果不是期望
  1. @echo off
  2. for /L %%a in (0,1,2) do (
  3.   for /L %%b in (5,1,7) do (
  4.     for /L %%c in (6,2,10) do (
  5.       echo %%a_%%b_%%c
  6.     )
  7.   )
  8. )
  9. pause
复制代码

作者: qixiaobin0715    时间: 2024-6-19 16:55

代码第3行是设定初始值,第4行设定差值:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a n1=0,n2=5,n3=6
  4. set /a m1=m2=1,m3=2
  5. for /l %%i in (1,1,3) do (
  6.     echo,!n1!_!n2!_!n3!
  7.     set /a n1+=m1,n2+=m2,n3+=m3
  8. )
  9. pause
复制代码

作者: aloha20200628    时间: 2024-6-19 17:17

本帖最后由 aloha20200628 于 2024-6-19 17:20 编辑

回复 1# hnfeng
  1. @echo off &setlocal enabledelayedexpansion
  2. set/a "a=0,b=5,c=6"
  3. for %%n in (0,1,1) do (
  4. set/a "a+=%%n,b+=%%n,c+=2*%%n"
  5. echo,!a!_!b!_!c!
  6. )
  7. endlocal&pause&exit/b
复制代码

作者: aloha20200628    时间: 2024-6-19 19:35

本帖最后由 aloha20200628 于 2024-6-19 19:38 编辑

回复 1# hnfeng

再给一个基于一楼三层循环结构的版本
  1. @echo off &setlocal enabledelayedexpansion
  2. for /L %%a in (0,1,2) do (
  3. for /L %%b in (5,1,7) do (
  4. 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")
  5. if not defined b1 (set "b1=%%b") else if not defined b2 (set "b2=%%b") else if not defined b3 (set "b3=%%b")
  6. )
  7. if not defined a1 (set "a1=%%a") else if not defined a2 (set "a2=%%a") else if not defined a3 (set "a3=%%a")
  8. )
  9. for /L %%n in (1,1,3) do (echo,!a%%n!_!b%%n!_!c%%n!)
  10. 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

要使用循环的话,平行结构是不是比嵌套更容易理解一些:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. for /l %%a in (0,1,2) do (
  5.     set /a n+=1
  6.     set x!n!=%%a
  7. )
  8. set n=0
  9. for /l %%a in (5,1,7) do (
  10.     set /a n+=1
  11.     set y!n!=%%a
  12. )
  13. set n=0
  14. for /l %%a in (6,2,10) do (
  15.     set /a n+=1
  16.     set z!n!=%%a
  17. )
  18. for /l %%a in (1,1,3) do (
  19.     echo,!x%%a!_!y%%a!_!z%%a!
  20. )
  21. pause
复制代码

作者: qixiaobin0715    时间: 2024-6-20 15:57

使用嵌套结构也可以这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n1=0
  4. for /l %%a in (0,1,2) do (
  5.     set /a n1+=1
  6.     set n2=0
  7.     for /l %%b in (5,1,7) do (
  8.         set /a n2+=1
  9.         set n3=0
  10.         for /l %%c in (6,2,10) do (
  11.             set /a n3+=1
  12.             if !n1! equ !n2! (
  13.                 if !n1! equ !n3! (
  14.                     echo %%a_%%b_%%c
  15.                 )
  16.             )
  17.         )
  18.     )
  19. )
  20. 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行即可:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set m="0,1,3" "5,1,8" "6,2,12" "10,3,19" "20,2,26"
  4. for %%i in (%m%) do (
  5.     set n=0
  6.     for /l %%j in (%%~i) do (
  7.         set /a n+=1
  8.         for %%k in (!n!) do (
  9.             if not defined x%%k (
  10.                 set x%%k=%%j
  11.             ) else (
  12.                 set x%%k=!x%%k!_%%j
  13.             )
  14.         )
  15.     )
  16. )
  17. for /l %%i in (1,1,!n!) do (
  18.     echo,!x%%i!
  19. )
  20. pause
复制代码

作者: hnfeng    时间: 2024-6-25 19:01

回复  qixiaobin0715
根据需要,只需修改代码第3行即可:
qixiaobin0715 发表于 2024-6-25 08:11



    佩服,很好的方法




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