Board logo

标题: 【练习-043】批处理找出文本中的重复数值并计算出现次数 [打印本页]

作者: batman    时间: 2009-4-14 21:39     标题: 【练习-043】批处理找出文本中的重复数值并计算出现次数

&&有文本a.txt里全是正整数数字,内容如下:
  1. 4 7 25 48 10 32 4 43 45 38
  2. 4 19 37 5 23 47 11 30 18 40
  3. 37 16 37 10 9 19 1 30 42 6
  4. 28 26 21 24 45 25 28 48 10 9
  5. 32 20 34 33 38 42 1 19 15 42
  6. 26 10 29 29 12 13 19 31 3 25
  7. 36 6 18 43 17 23 33 43 49 39
  8. 17 20 39 49 14 43 46 16 2 14
  9. 25 4 24 18 18 1 15 33 47 11
  10. 43 11 23 2 25 9 25 0 46 4
  11. 32 40 26 4 44 3 25 24 1 43
  12. 18 25 16 25 13 14 38 2 24 15
  13. 19 38 3 4 40 15 19 30 7 38
  14. 35 15 5 42 37 21 43 22 31 42
  15. 30 10 43 20 30 36 27 11 9 13
  16. 11 33 0 28 5 14 25 5 43 26
  17. 21 49 44 12 30 46 30 45 0 15
  18. 6 5 33 32 9 7 13 8 24 17
  19. 41 34 42 47 39 37 25 39 4 39
  20. 22 17 32 16 49 15 10 23 26 36
复制代码
  要求用批处理找出最大的数值,并列出重复次数最多的数字及其出现次数。
  满分10分,视情况加分(以思路为重)。
  注:
  1、并不知道数值的大小范围;
  2、此题请先留给新人们发挥。
作者: keen    时间: 2009-4-14 22:49

只会求出最大的数:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f  "delims=" %%i in (a.txt) do (
  3.     for %%j in (%%i) do set /a n+=1&set a!n!=%%j
  4. )
  5. set max=0
  6. :lp
  7. set /a m+=1
  8. if %m%==%n% goto end
  9. if !a%m%! geq %max% (set max=!a%m%!&goto lp) else (set max=%max%&goto lp)
  10. :end
  11. echo 最大的数是%max%
  12. pause
复制代码

作者: rat    时间: 2009-4-14 23:45

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set max=0
  4. for /f "delims=" %%a in (a.txt) do (
  5.         for %%b in (%%a) do (
  6.                 if %%b gtr !max! set max=%%b
  7.                 set/a_%%b+=1
  8.         )
  9. )
  10. echo Max: %max%
  11. set max=0
  12. for /f "tokens=1,2 delims=_=" %%a in ('set _') do (               
  13.         if %%b gtr !max! set max=%%b
  14. )
  15. for /f "tokens=1,2 delims=_=" %%a in ('set _') do (
  16.         if %%b equ %max% echo Number: %%a, Count: %%b
  17. )
  18. pause
复制代码

[ 本帖最后由 rat 于 2009-4-14 23:47 编辑 ]
作者: batman    时间: 2009-4-14 23:51

修改下二楼的:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.      for %%b in (%%a) do (
  4.            if not defined max set /a max=%%b
  5.            if !max! lss %%b set /a max=%%b
  6.  )
  7. )
  8. echo 最大数为:%max%&pause>nul
复制代码

作者: tireless    时间: 2009-4-15 00:48

if not defined max set /a max=%%b 这句不要也行。

不过感觉有些奇怪 ——
  1. @echo off&setlocal enabledelayedexpansion
  2. echo !max!
  3. if 1 gtr !max! set max=1
  4. echo %max%
  5. pause
复制代码
结果是:
ECHO 处于关闭状态。
1
请按任意键继续. . .

作者: GodInHell    时间: 2009-4-15 11:16

  1. @echo off
  2. Setlocal Enabledelayedexpansion
  3. set /a most=1,max=1
  4. for /f "delims=" %%a in (a.txt) do (
  5.   for %%i in (%%a) do (
  6.     set /a _%%i+=1
  7.     if !_%%i! gtr !most! (set most=!_%%i!&set num=%%i)
  8.     if %%i gtr !max! set max=%%i
  9.   )
  10. )
  11. echo.出现最多的是:!num!   出现次数为:!most!   最大数是:!max!&pause
复制代码

作者: someone    时间: 2009-4-15 15:36     标题: 稍稍修改了下六楼的

  1. @echo off
  2. Setlocal Enabledelayedexpansion
  3. set /a most=0,max=0
  4. for /f "delims=" %%a in (a.txt) do (
  5.   for %%i in (%%a) do (
  6.     set /a _%%i+=1
  7.     if !_%%i! gtr !most! set most=!_%%i!&set num=%%i
  8.     if !_%%i! gtr !most! set num=!num! %%i
  9.     if %%i gtr !max! set max=%%i
  10.   )
  11. )
  12. echo.出现最多的是:!num!   出现次数为:!most!   最大数是:!max!&pause>nul
复制代码

作者: keen    时间: 2009-4-15 16:26

六楼的强!
想问一下, _%%i 中下划线的作用,是标识符嘛,是的话,别的符号可以不?
作者: Batcher    时间: 2009-4-15 16:34     标题: 回复 8楼 的帖子

没有什么特殊含义,只是变量名的一个组成部分而已,可以换成别的符号。
作者: rat    时间: 2009-4-15 23:32

6L的不能处理同时出现最多次的多个数的情况;7L貌似有这个解决的意图,但改得不对
作者: 随风    时间: 2009-4-16 04:34

是否应该扩展下此题
1、显示最大的数及它出现的次数
2、显示出现最多的数及它出现的次数
3、需考虑出现最多的数不止一个数的情况,
   比如:假设出现最多数次数为3次,分别是 20 50 80 90,最大的数是120出现2次。
   则显示:
   最大的数是 120 共出现 2 次
   出现次数最多的为 3 次,分别是 20 50 80 90




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