[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-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 编辑 ]
***共同提高***

TO二楼,文本中本就没有以3结尾的数字。。。
***共同提高***

TOP

TO 楼上,这题对新手有点难,不适宜放在新手练习区的。
***共同提高***

TOP

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

[ 本帖最后由 batman 于 2009-4-13 17:42 编辑 ]
***共同提高***

TOP

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

将我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

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

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

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

回楼上,事实胜于雄辩,兄弟还是先测试下吧。。。
***共同提高***

TOP

晕,是我大意了,没想到这题已经出过了(见练习-42),特向大家道歉,并将此贴关闭!
***共同提高***

TOP

返回列表