Board logo

标题: 【练习-042】批处理将文本数值按尾数分类 [打印本页]

作者: batman    时间: 2009-4-13 15:56     标题: 【练习-042】批处理将文本数值按尾数分类

&&有一文本文件a.txt,内容如下:
  1. 530 862 477 448
  2. 407 68 191 157 929
  3. 76 866 730 445 665
  4. 591 99 285 868
  5. 352 64 196 755 220
  6. 922 245 966 294 118
  7. 839 757 564 701 391
  8. 629 794
  9. 110 349 604 962 868
  10. 846 20 637 11 782
复制代码
  要求用批处理将这些数值按尾数分类排出如下:
  1. 0  530 730 220 110 20
  2. 1  191 591 701 391 11
  3. 2  862 352 922 962 782
  4. 4  64 294 564 794 604
  5. 5  445 665 285 755 245
  6. 6  76 866 196 966 846
  7. 7  477 407 157 757 637
  8. 8  448 68 868 118 868
  9. 9  929 99 839 629 349
复制代码
  本题满分10分,视情况加分(以思路为重)。
  如成功解答后请加大难度,加入数值排序,输出如下:
  1. 0 20 110 220 530 730
  2. 1 11 191 391 591 701
  3. 2 352 782 862 922 962
  4. 4 64 294 564 604 794
  5. 5 245 285 445 665 755
  6. 6 76 196 846 866 966
  7. 7 157 407 477 637 757
  8. 8 68 118 448 868 868
  9. 9 99 349 629 839 929
复制代码
  如成功完成,本人将给予额外的加分,分值视情况而定。
  注:所有数值都在3位数内,排序时请考虑数值会出现相等的情况

[ 本帖最后由 batman 于 2009-4-13 17:39 编辑 ]
作者: Batcher    时间: 2009-4-13 16:22

如果a.txt里面没有以5结尾的数字,结果应该如何显示?
作者: batman    时间: 2009-4-13 16:39

TO二楼,文本中本就没有以3结尾的数字。。。
作者: terse    时间: 2009-4-13 17:10

先抛砖 感觉可以少个FOR
  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.        for /l %%a in (0,1,9) do (
  6.        if "!str:~-1!"=="%%a" set _%%a=!_%%a! %%j
  7. )))
  8. for /l %%a in (0,1,9) do if not "!_%%a!"=="" echo;%%a !_%%a!
  9. pause
复制代码

[ 本帖最后由 terse 于 2009-4-13 17:12 编辑 ]
作者: stuqx    时间: 2009-4-13 17:21

这个不是应该放到新手练习区么
作者: batman    时间: 2009-4-13 17:30

TO 楼上,这题对新手有点难,不适宜放在新手练习区的。
作者: pusofalse    时间: 2009-4-13 17:37

如果用设置变量的方法,恐怕站长前辈又会说好的程序员应注意内存的占用问题。
在想有无别的方法?~ 肯定会有的。。
作者: batman    时间: 2009-4-13 17:41

我一直就喜欢用变量赋值法(原因已多次说明过),但以往总是没有处理数值相同的情
况,现在已经想到解决办法了。

[ 本帖最后由 batman 于 2009-4-13 17:42 编辑 ]
作者: stuqx    时间: 2009-4-13 18:12

  1. @echo off
  2. set "n0=0 "
  3. set "n1=1 "
  4. set "n2=2 "
  5. set "n3=3 "
  6. set "n4=4 "
  7. set "n5=5 "
  8. set "n6=6 "
  9. set "n7=7 "
  10. set "n8=8 "
  11. set "n9=9 "
  12. for /f "delims=" %%a in (1.txt) do (
  13. for %%b in (%%a) do (
  14. setlocal ENABLEDELAYEDEXPANSION
  15. set num=%%b
  16. set re=n!num:~-1!
  17. call set "!re!=!!re!! %%b"
  18. ENDLOCAL
  19. )
  20. )
  21. echo %n0%
  22. echo %n1%
  23. echo %n2%
  24. echo %n3%
  25. echo !n4!
  26. echo !n5!
  27. echo !n6!
  28. echo !n7!
  29. echo !n8!
  30. echo !n9!
复制代码
问下这个为什么不行  变量嵌套的还是用不好
作者: Batcher    时间: 2009-4-13 18:22     标题: 回复 9楼 的帖子

楼主出这个题目,意图应该不仅仅是考察截取最后一位字符的方法,你可以先尝试一下其它思路,比如:取余。
作者: tireless    时间: 2009-4-13 19:57

  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 set %%i=!%%i! %%a
  8. )
  9. for /l %%a in (0 1 9) do if defined #%%a echo %%a!#%%a!
  10. del a_tmp.txt & pause
复制代码

[ 本帖最后由 tireless 于 2009-4-14 11:50 编辑 ]
作者: gohai    时间: 2009-4-13 20:10

下面是我做的, 分类 + 排序,
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. del b.txt&del 1.txt&del 2.txt
  4. for /f "usebackq delims=" %%i in (`more a.txt`) do (
  5.   for %%j in (%%i)do (
  6.     set "number=   %%j"
  7.     echo !number:~-4!>>1.txt
  8.   )
  9. )
  10. for /f "usebackq" %%i in (`sort 1.txt`) do (
  11.   echo %%i>>2.txt
  12. )
  13. del 1.txt
  14. for /l %%i in (0,1,9) do (
  15. set /a input=0
  16. for /f "delims=" %%j in (2.txt) do (
  17. set /a num=%%j
  18. set /a flag=!num:~-1,1!
  19. if !flag! equ %%i (
  20. if !input! equ 0 (
  21. set /p=!flag! <nul>>b.txt
  22. )
  23. set /a input=1
  24. set /p=!num! <nul >>b.txt
  25. )
  26. )
  27. if !input! equ 1 (
  28. echo. >>b.txt
  29. )
  30. )
  31. start b.txt
  32. del 1.txt&del 2.txt
  33. exit
复制代码

作者: rat    时间: 2009-4-14 00:39

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.   for %%b in (%%a) do (
  4.     call :p %%b
  5.   )
  6. )
  7. for /l %%i in (0,1,9) do (
  8.   if defined f%%i (
  9.     call :sortstr str%%i newstr
  10.     echo !newstr!
  11.   )
  12. )
  13. pause
  14. goto :eof
  15. :p
  16. set s=%1
  17. for /l %%i in (0,1,9) do (
  18.   if "!s:~-1!"=="%%i" (
  19.     if not defined f%%i2 set f%%i2=1&set str%%i=%%i
  20.     set str%%i=!str%%i! %%b
  21.     if not defined f%%i set f%%i=1
  22.     goto :eof
  23.   )
  24. )
  25. goto :eof
  26. :sortstr
  27. setlocal
  28. for %%a in (!%1!) do (
  29. set/ajj+=1
  30. set s!jj!=%%a
  31. )
  32. call :sort s %jj%
  33. for /l %%a in (1,1,%jj%) do (
  34. set ss=!ss! !s%%a!
  35. )
  36. endlocal&set %2=%ss%&goto :eof
  37. :sort arrname %ubound%
  38. set a=%1&set u=%2&set i=2
  39. :sort_1
  40. if %i% gtr %u% goto :eof
  41. set /a %a%0=%a%%i%,j=i-1
  42. :sort_2
  43. if !%a%0! lss !%a%%j%! (
  44. set /a k=j+1
  45. set /a %a%!k!=%a%%j%,j-=1
  46. goto sort_2
  47. )
  48. set /a k=j+1
  49. set /a %a%%k%=%a%0,i+=1
  50. goto sort_1
复制代码

作者: rat    时间: 2009-4-14 01:18

js有个sort方法
作者: 随风    时间: 2009-4-14 04:03

这个题目已经不是新手题了啊。
各位版主也出出手吧,是否应该考虑把terse兄的帖子也打开呢
batman 版主也把自己的代码晒晒吧。
11 楼 tireless 的代码产生了临时文件、效率还行、但不能处理重复数字。
12 楼 gohai 的代码同上。
rat 版主的代码是否能提高下效率。

[ 本帖最后由 随风 于 2009-4-14 04:24 编辑 ]
作者: batman    时间: 2009-4-14 08:08

向各献丑了,变量赋值法:
  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
复制代码

作者: batman    时间: 2009-4-14 08:13

感觉还可以优化,两个大循环可以合并,要开会了,占下位子先。。。
作者: gohai    时间: 2009-4-14 09:39

原帖由 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真是用的经典,学习了。
作者: stuqx    时间: 2009-4-14 09:56

  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
作者: terse    时间: 2009-4-14 10:12

原帖由 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
复制代码

作者: tireless    时间: 2009-4-14 10:29     标题: 回复 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 编辑 ]
作者: batman    时间: 2009-4-14 10:37

原帖由 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 ...

怎么不加上排序?
作者: stuqx    时间: 2009-4-14 11:32

  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  现在写好了   新手   给点鼓励
作者: batman    时间: 2009-4-14 11:37

将我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
复制代码

作者: batman    时间: 2009-4-14 11:54

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

[ 本帖最后由 batman 于 2009-4-14 11:57 编辑 ]
作者: rat    时间: 2009-4-14 13:11     标题: 回复 28楼 的帖子

写错了,效率挺好的,学习
作者: tireless    时间: 2009-4-14 16:39

  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
复制代码

作者: batman    时间: 2009-4-14 19:45

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

[ 本帖最后由 batman 于 2009-4-14 19:56 编辑 ]
作者: tireless    时间: 2009-4-14 20:22     标题: 回复 32楼 的帖子

处理了                                                                                                                   .
作者: batman    时间: 2009-4-14 20:36

你楼上的代码没有处理,如果处理就要在下面这句中用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
复制代码

作者: tireless    时间: 2009-4-14 20:59     标题: 回复 34楼 的帖子

for %%i in (#!var:~-1!) do (
    set "var=!%%i! "
    if "!var: %%a =!"=="!var!"
set %%i=!%%i! %%a
  )

这个 for 处理了重复数字。我没有把每个数字设为变量,只用了这些变量:var、#0 至 #9

[ 本帖最后由 tireless 于 2009-4-14 21:04 编辑 ]
作者: batman    时间: 2009-4-14 21:29

回楼上,事实胜于雄辩,兄弟还是先测试下吧。。。
作者: tireless    时间: 2009-4-14 21:41     标题: 回复 36楼 的帖子

不会显示重复数字啊。
作者: 随风    时间: 2009-4-15 06:44

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

作者: tyc    时间: 2009-4-15 07:55     标题: 我试试

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::先排序,再按尾数取
  4. ::第一步构建一维数组,并给每个元数武值
  5. for /f "delims=*" %%i in (a.txt) do (
  6.   for %%j in (%%i) do (
  7.       set /a n+=1&set _!n!=%%j
  8. )
  9. )
  10. ::用选择法排序
  11. rem echo %n%
  12. for /l %%i in (1,1,%n%) do (
  13.   set /a m=%%i+1
  14.   for /l %%j in (!m!,1,%n%) do (
  15.        if !_%%i! gtr !_%%j! (
  16.             set /a t=_%%i
  17.             set /a _%%i=!_%%j!
  18.             set /a _%%j=t  
  19. )
  20. )
  21. )
  22. ::按尾数取
  23. for /l %%i in (1,1,%n%) do (
  24.      for /l %%j in (0,1,9) do (
  25.        if !_%%i:~-1! ==%%j set a_%%j=!a_%%j! !_%%i!
  26. )
  27. )
  28. ::输出
  29. for /l %%k in (0,1,9) do (
  30. if !a_%%k! neq 0 echo %%k  !a_%%k!
  31. )
  32. rem set a_
  33. rem set _
  34. pause>nul
复制代码
缺点是建一维数组时变量过多,优点是易读易写
作者: tyc    时间: 2009-4-15 08:03     标题: to:随风

随风的贴子测了一下,不能运行,可能和我的win2000系统有关

[ 本帖最后由 tyc 于 2009-4-15 09:33 编辑 ]
作者: 随风    时间: 2009-4-15 10:59     标题: 回复 4楼 的帖子

for 比 call 快多了,但是用 for /l 似乎没必要,白浪费了9次循环,直接用 for 不是更好吗?
for %%i in (%%a) do set .%%a=!.%%a! 。。。。
作者: keen    时间: 2009-4-16 14:04

自己想的,没有实现排序:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0 1 9) do (
  3.     for /f "delims=" %%j in (a.txt) do (
  4.         for %%k in (%%j) do (
  5.             set num=%%k
  6.             if "!num:~-1,1!"=="%%i" set _%%i=!_%%i! !num!
  7. )
  8. )
  9. if "!_%%i!" neq "" echo %%i !_%%i!
  10. )
  11. pause
复制代码

作者: Batcher    时间: 2009-4-16 15:22     标题: 回复 40楼 的帖子

38楼用到的外部命令只有一个sort.exe
如果你机器上没有可以到别人机器上拷贝一个过来
作者: tyc    时间: 2009-4-17 08:21     标题:

谢batcher,虽然用sort,或set变量名进行排序很妙,但传统的排序更有意思,比如选择法,插入法,快速法,堆排序等七种,我水平有限,有些排序的写法写不出来!
作者: Batcher    时间: 2009-4-17 12:31     标题: 回复 44楼 的帖子

对于少量数据的排序,批处理中的set无疑是上上之选。对于大量数据的排序,set可能就不行了,因为一个批处理中是不允许无限制的定义变量的,这时就可以考虑用sort。对于高级语言中的那些传统排序算法,在批处理中往往需要一大段代码(批处理不像高级语言那样可以方便的使用数组、指针等数据结构)来实现,不利于阅读和维护,不到万不得已,还是少用为妙。当然,如果纯粹是挑战自我,玩一玩也未尝不可。
作者: netbenton    时间: 2009-4-28 00:05

分类+排序+排版

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.       for %%b in (%%a) do (
  4.          set "var=      %%b"
  5.          set/a n=n+1
  6.          set #!var:~-5!#!n!=!var:~-1!
  7. )     )
  8. for /f "tokens=1,3 delims==#" %%a in ('set #') do (set #%%b=!#%%b!%%a)
  9. for /l %%a in (0,1,9) do (if defined #%%a echo %%a!#%%a!)
  10. pause
复制代码

作者: netbenton    时间: 2009-4-28 12:43

::分类+排序(比较提取法)

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.       for %%b in (%%a) do (
  4.          set "var=%%b"
  5.         for %%c in (!var:~-1!) do (set #%%c=!#%%c! %%b)
  6. )     )
  7. for /l %%a in (0,1,9) do (if defined #%%a (
  8.         set a=!#%%a!&set r=
  9.         set lb=!a:* =!
  10.         set lb=!lb:* =!
  11.         for %%b in (!lb!) do (
  12.                 set var=!a:1000=!&set a=&set v=1000
  13.                 for %%c in (!var!) do (
  14.                         if !v! leq %%c (set a=%%c !a!) else (set a=!v! !a!&set v=%%c)
  15.                 )
  16.                 set r=!r! !v!
  17.                
  18.         )
  19.         echo.%%a !r! !a:1000=!
  20. ))
  21. pause
复制代码

作者: Seter    时间: 2009-11-6 22:20

嗯...我做出来了(办法很原始)..小水个~我发现我在BATHOME进步了很多啊,我记得我在这里做的第一个新手练习题花了2小时写了N多代码,然后面对大大们的超简洁代码直接扑街了..
作者: keen    时间: 2009-11-6 23:02

等batman兄发出召唤,我们版主或技术组再贴出代码。但是我好像不是版主,也不是技术组的^_^
作者: zhouyongjun    时间: 2009-11-7 14:43

我贴个代码吧
  1. @echo off&amp;setlocal enabledelayedexpansion
  2. for /f &quot;delims=&quot; %%a in (a.txt) do (
  3. for %%b in (%%a) do (
  4. set/a num=%%b%%10
  5. for %%c in (!num!) do set #%%c=!#%%c! %%b
  6. )
  7. )
  8. for /f &quot;tokens=2 delims==&quot; %%a in ('set #') do echo %%a
  9. pause&gt;nul
复制代码

作者: netbenton    时间: 2009-11-7 19:03

不用set /a也可以做到,用  :~-1
作者: vsbat    时间: 2009-11-7 19:06     标题: 回复 5楼 的帖子

可是 batman 要求是尽量不用 set  截取字符啊-----
作者: vsbat    时间: 2009-11-7 21:29

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3. for %%j in (%%i) do (set /a num=%%j%%10
  4. for %%k in  (!num!) do set #%%k=!#%%k! %%j))
  5. for /f "tokens=1,2 delims=#=" %%h in ('set #') do echo %%h %%i
  6. pause
复制代码

新学习的方法----------

[ 本帖最后由 vsbat 于 2009-11-7 21:42 编辑 ]
作者: batman    时间: 2009-11-7 23:16

晕,是我大意了,没想到这题已经出过了(见练习-42),特向大家道歉,并将此贴关闭!
作者: terse    时间: 2009-11-8 00:37

重温一下 前面发过没?前面随风兄提示直接for的  后面冒泡排
  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.        for %%k in (!str:~-1!) do set/a _%%k+=1&set "_%%k_!_%%k!=%%j"
  6.     )
  7. )
  8. for /l %%a in (0,1,9) do if defined _%%a (
  9.    set /a "c=_%%a-1"
  10.        for /l %%i in (1,1,!c!) do (
  11.            set /a "b=%%i+1"
  12.            for /l %%j in (!b!,1,!_%%a!) do (
  13.            if !_%%a_%%i! gtr !_%%a_%%j! set/a "_%%a_%%j=!_%%a_%%i!,_%%a_%%i=!_%%a_%%j!"
  14.         )
  15.     )
  16.     for /l %%i in (1,1,!_%%a!) do set "var=!var! !_%%a_%%i!"
  17.     echo;%%a!var!&set "var="
  18. )
  19. pause
复制代码

作者: Seter    时间: 2009-11-8 13:57

我也来个..
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (in.txt) do for %%b in (%%a) do set b=000%%b&set/a_!b:~-1!_!b:~-3!+=1
  3. for /l %%a in (0,1,9) do (for /f "tokens=1,2,3 delims=_=" %%i in ('set _%%a 2^>nul') do (if not defined _%%a set/p=%%a<nul&set _%%a=1)&set/ai=1%%j-1000&&for /l %%b in (1,1,%%k) do set/p= !i!<nul)&if defined _%%a echo.
  4. pause
复制代码

作者: Seter    时间: 2009-11-8 14:00

郁闷,突然发现batman已经有差不多的代码了




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