返回列表 发帖

【练习-042】批处理将文本数值按尾数分类

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

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

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

TOP

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

TOP

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

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

TOP

向各献丑了,变量赋值法:
@echo off&setlocal enabledelayedexpansion
for /l %%a in (0,1,9) do (
    for /f "delims=" %%b in (b.txt) do (
         for %%c in (%%b) do (
              set /a num=%%c-%%a,num=num%%10
              if !num! equ 0 set "_%%a=!_%%a! %%c"
         )
    )
)
for /f "tokens=1,2 delims==_" %%a in ('set _') do (
     set /p=%%a <nul&setlocal enabledelayedexpansion
     for %%c in (%%b) do (
          set "str=000%%c"&set "str=!str:~-3!"
            if defined #!str! (
            call,set "#!str!=%%#!str!%% %%c"
            ) else (
            set "#!str!=%%c"  
        )
     )
     for /f "tokens=2 delims==" %%d in ('set #') do set /p=%%d <nul
     echo.&endlocal
)  
pause>nulCOPY
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楼的代码简化并提效如下:
@echo off&setlocal enabledelayedexpansion
for /l %%a in (0,1,9) do (
    for /f "delims=" %%b in (b.txt) do (
         for %%c in (%%b) do (
              set /a num=%%c-%%a,num=num%%10
              if !num! equ 0 (
                 set "str=000%%c"&set "str=%%a!str:~-3!"
                 if defined _!str! (
                   call,set "_!str!=%%_!str!%% %%c"
                   ) else (
                   set "_!str!=%%c"
                 )
               )        
          )
     )
)
for /f "tokens=1,2 delims==_" %%a in ('set _') do (
     set "str=%%a"&set "str=!str:~,1!"
     if not defined !str! (
       echo.&set /p=!str! %%b <nul&set "!str!=a"
       ) else (
       set /p=%%b <nul
     )
)
pause>nulCOPY
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!
你这样就是将相同值多次赋值,只保留下最后的一次赋值,也就
是说无论数字中有多少个值相同,结果也只会有一个数字被输出
,如下面这一段代码:
@echo off
for %%a in (1 1 2 3 3 4 4) do set "_%%a=%%a"
set _
pause>nul COPY
***共同提高***

TOP

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

TOP

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

TOP

返回列表