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

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

[复制链接]
发表于 2009-4-14 20:59:46 | 显示全部楼层

回复 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 编辑 ]
 楼主| 发表于 2009-4-14 21:29:21 | 显示全部楼层
回楼上,事实胜于雄辩,兄弟还是先测试下吧。。。
发表于 2009-4-14 21:41:50 | 显示全部楼层

回复 36楼 的帖子

不会显示重复数字啊。
发表于 2009-4-15 06:44:28 | 显示全部楼层
  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
复制代码

评分

参与人数 1PB +6 收起 理由
pusofalse + 6

查看全部评分

发表于 2009-4-15 07:55:48 | 显示全部楼层

我试试

  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
复制代码
缺点是建一维数组时变量过多,优点是易读易写
发表于 2009-4-15 08:03:28 | 显示全部楼层

to:随风

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

[ 本帖最后由 tyc 于 2009-4-15 09:33 编辑 ]
发表于 2009-4-15 10:59:18 | 显示全部楼层

回复 4楼 的帖子

for 比 call 快多了,但是用 for /l 似乎没必要,白浪费了9次循环,直接用 for 不是更好吗?
for %%i in (%%a) do set .%%a=!.%%a! 。。。。
发表于 2009-4-16 14:04:59 | 显示全部楼层
自己想的,没有实现排序:
  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
复制代码
发表于 2009-4-16 15:22:50 | 显示全部楼层

回复 40楼 的帖子

38楼用到的外部命令只有一个sort.exe
如果你机器上没有可以到别人机器上拷贝一个过来
发表于 2009-4-17 08:21:04 | 显示全部楼层

谢batcher,虽然用sort,或set变量名进行排序很妙,但传统的排序更有意思,比如选择法,插入法,快速法,堆排序等七种,我水平有限,有些排序的写法写不出来!
发表于 2009-4-17 12:31:58 | 显示全部楼层

回复 44楼 的帖子

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

  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
复制代码
发表于 2009-4-28 12:43:20 | 显示全部楼层
::分类+排序(比较提取法)

  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
复制代码
发表于 2009-11-6 22:20:37 | 显示全部楼层
嗯...我做出来了(办法很原始)..小水个~我发现我在BATHOME进步了很多啊,我记得我在这里做的第一个新手练习题花了2小时写了N多代码,然后面对大大们的超简洁代码直接扑街了..
发表于 2009-11-6 23:02:06 | 显示全部楼层
等batman兄发出召唤,我们版主或技术组再贴出代码。但是我好像不是版主,也不是技术组的^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:42 , Processed in 0.021277 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表