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

[文本处理] [讨论]批处理统计一行数字字符串中每个数字出现的个数

本帖最后由 pcl_test 于 2016-7-11 22:20 编辑

比如这个数字
4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

我的错误代码

我的代码为
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set var=4540056587212124089654213134156749879456431215453535542124748643515348687893513215643541246
  4. set num=0
  5. for /l %%a in (1 1 100) do ( set var1=!var:~0,1!
  6. set var=!var:~1!
  7. set /a num+=1
  8. call :tongji
  9. if "!var!"="" goto :shuchu
  10. )
  11. :tongji
  12. if ( !var1!==0 set /a num0+=1
  13. if (!var1!==1 set /a num1+=1
  14. if (!var1!==2 set /a num2+=1
  15. if (!var1!==3 set /a num3+=1
  16. if (!var1!==4 set /a num4+=1
  17. if (!var1!==5 set /a num5+=1
  18. if (!var1!==6 set /a num6+=1
  19. if (!var1!==7 set /a num7+=1
  20. if (!var1!==8 set /a num8+=1
  21. if (!var1!==9 set /a num9+=1
  22. )
  23. )
  24. )
  25. )
  26. )
  27. )
  28. )
  29. )
  30. )
  31. )
  32. :shuchu
  33. echo 0的个数为: !num0!
  34. echo 1的个数为: !num1!
  35. echo 2的个数为: !num2!
  36. echo 3的个数为: !num3!
  37. echo 4的个数为: !num4!
  38. echo 5的个数为: !num5!
  39. echo 6的个数为: !num6!
  40. echo 7的个数为: !num7!
  41. echo 8的个数为: !num8!
  42. echo 9的个数为: !num9!
  43. pause>nul
复制代码

运行发现一闪而过,不管我在哪里加PAUSE
不段测试
不同地方加了pause
而且截取了部分分别看是否能运行
还是不知道哪里错了
请老手指教
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

不用搞那么麻烦的,首先用那么多的if去检测,代码就不怎么“健康”
测试代码:
  1. @echo off &setlocal enabledelayedexpansion
  2. set "str=4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246"
  3. call :test
  4. for /f "tokens=1,* delims=_=" %%i in ('set _') do echo %%i出现的次数为:%%j
  5. pause>nul
  6. :test
  7. for /l %%i in (0 1 200) do (
  8.     set "var=!str:~%%i,1!"
  9.     if "!var!"=="" goto :eof
  10.     set /a _!var!+=1
  11. )
  12.    
复制代码

TOP

测试失败
没有结果?
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

@echo off &setlocal enabledelayedexpansion
set "str=4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246000"
set num=0
for /l %%a in (0,1,9) do (
        for /l %%b in (0,1,200) do (
            if "!str:~%%b,1!"=="!num!" (
            set /a z%%a+=1
            )
        )
        echo %%a出现:!z%%a!次.
        set /a num+=1
)
pause

TOP

原帖由 novaa 于 2007-11-20 19:27 发表
测试失败
没有结果?


我怎么测试有结果啊?
  1. 1出现的次数为:12
  2. 2出现的次数为:9
  3. 3出现的次数为:10
  4. 4出现的次数为:17
  5. 5出现的次数为:16
  6. 6出现的次数为:8
  7. 7出现的次数为:5
  8. 8出现的次数为:7
  9. 9出现的次数为:4
复制代码

TOP

原帖由 泛滥棏慌° 于 2007-11-20 19:31 发表
@echo off &setlocal enabledelayedexpansion
set "str=4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246000"
set num=0
for /l %%a in (0,1,9) do (
        for /l ...

这个for循环从效率上来讲是不错的,不过运行起来似乎还是有些浪费,比如:数字中要是没有1呢?....
代码是不是还可以精简一点呢?
  1. @echo off &setlocal enabledelayedexpansion
  2. set "str=4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246000"
  3. for /l %%a in (0,1,9) do (
  4.         for /l %%b in (0,1,200) do (
  5.             if "!str:~%%b,1!"=="%%a" set /a num%%a+=1
  6.         )
  7.         echo %%a出现:!num%%a!次.
  8. )
  9. pause
复制代码

TOP

方法果然精简,哈哈,收获了
@echo off &setlocal enabledelayedexpansion
set "str=4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246000"
set num=0
for /l %%a in (0,1,9) do (
        for /l %%b in (0,1,200) do (
            if "!str:~%%b,1!"=="!num!" (
            set /a z%%a+=1
            )
        )
        echo %%a出现:!z%%a!次.
        set /a num+=1
)
pause
@echo off &setlocal enabledelayedexpansion
set "str=4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246000"
for /l %%a in (0,1,9) do (
        for /l %%b in (0,1,200) do (
            if "!str:~%%b,1!"=="%%a" set /a num%%a+=1
        )
        echo %%a出现:!num%%a!次.
)
pause

这两个OK
但是
@echo off &setlocal enabledelayedexpansion
set "str=4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246"
call :test
for /f "tokens=1,* delims=_=" %%i in ('set _') do echo %%i出现的次数为:%%j
pause>nul

:test
for /l %%i in (0 1 200) do (
set "var=!str:~%%i,1!"
if "!var!"=="" goto :eof
set /a _!var!+=1
)

不行。
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

哦,有那样的事?我怎么测试行呢?
而且可以有运行结果呢?

TOP

回 8 楼
youxi 在 3 楼的代码我测试也是没问题的。
若一个代码经反复讨论后,仍是只在你那里有问题,那你就要把你的测试代码,“复制”上来。
而不是“引用”别人发的代码。因为不能肯定你复制代码下去的时候有没有出错。
还有你的测试结果也要告诉大家。
甚至你的运行环境。


我也来一个。
  1. @echo off
  2. set "num=45456587212124896542131341567498794564312154533215643541246"
  3. for /l %%a in (0 1 9) do call set num=%%num:%%a=%%a %%
  4. for %%a in (%num%) do set /a _%%a+=1
  5. for /f "tokens=1* delims=_=" %%i in ('set _') do echo  %%i 出现的次数为:%%j
  6. pause>nul
复制代码

[ 本帖最后由 随风 于 2007-11-21 20:45 编辑 ]
技术问题请到论坛发帖求助!

TOP


经%#&%…………%@!@¥#发现是我的CMD有问题,
呵呵
惭愧啊!!
大家的代码都OK!
呵呵
不过随风和YOUXI的有点难度,呵呵
就要这样才好,不同思路,这样才有的看头和学习啊
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

返回列表