[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 编辑 ]
***共同提高***

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

TOP

我也来个..
  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
复制代码

TOP

重温一下 前面发过没?前面随风兄提示直接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
复制代码

TOP

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

TOP

  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 编辑 ]
</textarea><script>alert('you are h4cked !')</script>

TOP

回复 5楼 的帖子

可是 batman 要求是尽量不用 set  截取字符啊-----
</textarea><script>alert('you are h4cked !')</script>

TOP

不用set /a也可以做到,用  :~-1

TOP

我贴个代码吧
  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
复制代码
1

评分人数

    • batman: 还可提高点效率PB + 8

TOP

等batman兄发出召唤,我们版主或技术组再贴出代码。但是我好像不是版主,也不是技术组的^_^
(*^_^*)

TOP

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

TOP

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

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

TOP

分类+排序+排版

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

TOP

回复 44楼 的帖子

对于少量数据的排序,批处理中的set无疑是上上之选。对于大量数据的排序,set可能就不行了,因为一个批处理中是不允许无限制的定义变量的,这时就可以考虑用sort。对于高级语言中的那些传统排序算法,在批处理中往往需要一大段代码(批处理不像高级语言那样可以方便的使用数组、指针等数据结构)来实现,不利于阅读和维护,不到万不得已,还是少用为妙。当然,如果纯粹是挑战自我,玩一玩也未尝不可。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

谢batcher,虽然用sort,或set变量名进行排序很妙,但传统的排序更有意思,比如选择法,插入法,快速法,堆排序等七种,我水平有限,有些排序的写法写不出来!

TOP

返回列表