[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
向各献丑了,变量赋值法:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0,1,9) do (
  3.     for /f "delims=" %%b in (b.txt) do (
  4.          for %%c in (%%b) do (
  5.               set /a num=%%c-%%a,num=num%%10
  6.               if !num! equ 0 set "_%%a=!_%%a! %%c"
  7.          )
  8.     )
  9. )
  10. for /f "tokens=1,2 delims==_" %%a in ('set _') do (
  11.      set /p=%%a <nul&setlocal enabledelayedexpansion
  12.      for %%c in (%%b) do (
  13.           set "str=000%%c"&set "str=!str:~-3!"
  14.             if defined #!str! (
  15.             call,set "#!str!=%%#!str!%% %%c"
  16.             ) else (
  17.             set "#!str!=%%c"  
  18.         )
  19.      )
  20.      for /f "tokens=2 delims==" %%d in ('set #') do set /p=%%d <nul
  21.      echo.&endlocal
  22. )  
  23. pause>nul
复制代码
2

评分人数

    • tyc: 利用set ,有点投机取巧的PB + 2
    • rat: 够简洁,但效率……PB + 30
***共同提高***

TOP

感觉还可以优化,两个大循环可以合并,要开会了,占下位子先。。。
***共同提高***

TOP

原帖由 terse 于 2009-4-13 17:10 发表
先抛砖 感觉可以少个FOR@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
   for %%j in (%%i) do (
       set str=%%j
       for /l %%a in (0,1,9) do (
       if "!str: ...



set真是用的经典,学习了。

TOP

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /l %%i in (0,1,9) do set "n%%i=%%i"
  4. for /f "delims=" %%a in (1.txt) do (
  5. for %%b in (%%a) do (
  6. set num=%%b
  7. set re=n!num:~-1!
  8. call set "!re!=%%!re!%% %%b"
  9. )
  10. )
  11. for /l %%p in (0,1,9) do call echo %%n%%p%%
  12. pause
  13. goto :eof
复制代码
好了  今天来给我昨天那个稍微改了下  可以了  HOHO
1

评分人数

TOP

原帖由 terse 于 2009-4-13 17:10 发表
先抛砖 感觉可以少个FOR

虽然少个FOR 但CALL的效率不知道怎么样
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.    for %%j in (%%i) do (
  4.        set str=%%j
  5.        call set _!str:~-1!=%%_!str:~-1!%% %%j
  6. ))
  7. for /l %%a in (0,1,9) do if not "!_%%a!"=="" echo %%a!_%%a!
  8. pause
复制代码
1

评分人数

TOP

回复 23楼 的帖子

call 的效率比 for 差。(命令耗时清单)

以下是用 timeit.exe 测出的结果:
Average for terse.bat key over 5 runs

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:32 am, Tuesday, April 14 2009
Elapsed Time:     0:00:00.056
Process Time:     0:00:00.062

System Calls:     5282
Context Switches: 327
Page Faults:      586
Bytes Read:       17129
Bytes Written:    0
Bytes Other:      72752


Average for terse_call.bat key over 5 runs

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:32 am, Tuesday, April 14 2009
Elapsed Time:     0:00:00.143
Process Time:     0:00:00.156

System Calls:     4479
Context Switches: 658
Page Faults:      688
Bytes Read:       23031
Bytes Written:    6220
Bytes Other:      78810

[ 本帖最后由 tireless 于 2009-4-14 10:32 编辑 ]

TOP

原帖由 terse 于 2009-4-14 10:12 发表

虽然少个FOR 但CALL的效率不知道怎么样
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
   for %%j in (%%i) do (
       set str=%%j
       call set _!str:~-1!=%%_!st ...

怎么不加上排序?
***共同提高***

TOP

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. md l100
  4. md g100
  5. for /l %%i in (0,1,9) do set "n%%i=%%i"
  6. for /f "delims=" %%a in (1.txt) do (
  7. for %%b in (%%a) do (
  8. if %%b lss 100 (echo off >l100/%%b) else (echo off >g100/%%b)
  9. )
  10. )
  11. dir /o:n /b l100 >>result.txt
  12. dir /o:n /b g100 >>result.txt
  13. for /f %%m in (result.txt) do (
  14. set num=%%m
  15. set re=n!num:~-1!
  16. call set "!re!=%%!re!%% %%m"
  17. )
  18. for /l %%p in (0,1,9) do call echo %%n%%p%%
  19. rd /s /q l100
  20. rd /s /q g100
  21. del result.txt
  22. pause
  23. goto :eof
复制代码
昨天没看到有排序的要求  HOHO  现在写好了   新手   给点鼓励

TOP

将我19楼的代码简化并提效如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0,1,9) do (
  3.     for /f "delims=" %%b in (b.txt) do (
  4.          for %%c in (%%b) do (
  5.               set /a num=%%c-%%a,num=num%%10
  6.               if !num! equ 0 (
  7.                  set "str=000%%c"&set "str=%%a!str:~-3!"
  8.                  if defined _!str! (
  9.                    call,set "_!str!=%%_!str!%% %%c"
  10.                    ) else (
  11.                    set "_!str!=%%c"
  12.                  )
  13.                )        
  14.           )
  15.      )
  16. )
  17. for /f "tokens=1,2 delims==_" %%a in ('set _') do (
  18.      set "str=%%a"&set "str=!str:~,1!"
  19.      if not defined !str! (
  20.        echo.&set /p=!str! %%b <nul&set "!str!=a"
  21.        ) else (
  22.        set /p=%%b <nul
  23.      )
  24. )
  25. pause>nul
复制代码
1

评分人数

    • rat: 够简洁,但效率……PB + 30
***共同提高***

TOP

17、18楼的代码都有问题,请nanhui兄弟仔细对照题目要求测试和检查,你24楼的写得太罗索,我就没仔细看了。

[ 本帖最后由 batman 于 2009-4-14 11:57 编辑 ]
***共同提高***

TOP

回复 28楼 的帖子

写错了,效率挺好的,学习

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=*" %%a in (a.txt) do (
  3.   for %%i in (%%a) do set "var=00%%i" & echo !var:~-3!
  4. ))>a_tmp.txt
  5. for /f "tokens=* delims=0" %%a in ('sort a_tmp.txt') do (
  6.   set var=%%a
  7.   for %%i in (#!var:~-1!) do (
  8.     set "var=!%%i! "
  9.     if "!var: %%a =!"=="!var!" set %%i=!%%i! %%a
  10.   )
  11. )
  12. for /l %%a in (0 1 9) do if defined #%%a echo %%a!#%%a!
  13. del a_tmp.txt & pause
复制代码

TOP

楼上是否有点考虑欠妥了,好像没有处理数值相同的情况!

[ 本帖最后由 batman 于 2009-4-14 19:56 编辑 ]
***共同提高***

TOP

回复 32楼 的帖子

处理了                                                                                                                   .

TOP

你楼上的代码没有处理,如果处理就要在下面这句中用if来处理:
for %%i in (%%a) do set "var=00%%i" & echo !var:~-3!
你这样就是将相同值多次赋值,只保留下最后的一次赋值,也就
是说无论数字中有多少个值相同,结果也只会有一个数字被输出
,如下面这一段代码:
  1. @echo off
  2. for %%a in (1 1 2 3 3 4 4) do set "_%%a=%%a"
  3. set _
  4. pause>nul
复制代码
***共同提高***

TOP

返回列表