标题: [文本处理] [讨论]批处理统计一行数字字符串中每个数字出现的个数 [打印本页]
作者: novaa 时间: 2007-11-20 08:12 标题: [讨论]批处理统计一行数字字符串中每个数字出现的个数
本帖最后由 pcl_test 于 2016-7-11 22:20 编辑
比如这个数字
4545658721212489654213134156749879456431215453535542124748643515348687893513215643541246
作者: novaa 时间: 2007-11-20 09:04 标题: 我的错误代码
我的代码为- @echo off
- setlocal enabledelayedexpansion
- set var=4540056587212124089654213134156749879456431215453535542124748643515348687893513215643541246
- set num=0
- for /l %%a in (1 1 100) do ( set var1=!var:~0,1!
- set var=!var:~1!
- set /a num+=1
- call :tongji
- if "!var!"="" goto :shuchu
- )
- :tongji
- if ( !var1!==0 set /a num0+=1
- if (!var1!==1 set /a num1+=1
- if (!var1!==2 set /a num2+=1
- if (!var1!==3 set /a num3+=1
- if (!var1!==4 set /a num4+=1
- if (!var1!==5 set /a num5+=1
- if (!var1!==6 set /a num6+=1
- if (!var1!==7 set /a num7+=1
- if (!var1!==8 set /a num8+=1
- if (!var1!==9 set /a num9+=1
- )
- )
- )
- )
- )
- )
- )
- )
- )
- )
- :shuchu
- echo 0的个数为: !num0!
- echo 1的个数为: !num1!
- echo 2的个数为: !num2!
- echo 3的个数为: !num3!
- echo 4的个数为: !num4!
- echo 5的个数为: !num5!
- echo 6的个数为: !num6!
- echo 7的个数为: !num7!
- echo 8的个数为: !num8!
- echo 9的个数为: !num9!
- pause>nul
复制代码
运行发现一闪而过,不管我在哪里加PAUSE
不段测试
不同地方加了pause
而且截取了部分分别看是否能运行
还是不知道哪里错了
请老手指教
作者: youxi01 时间: 2007-11-20 12:06
不用搞那么麻烦的,首先用那么多的if去检测,代码就不怎么“健康”
测试代码:- @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
- )
-
复制代码
作者: novaa 时间: 2007-11-20 19:27
测试失败
没有结果?
作者: foxJL 时间: 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 %%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
作者: youxi01 时间: 2007-11-20 21:25
原帖由 novaa 于 2007-11-20 19:27 发表
测试失败
没有结果?
我怎么测试有结果啊?
- 1出现的次数为:12
- 2出现的次数为:9
- 3出现的次数为:10
- 4出现的次数为:17
- 5出现的次数为:16
- 6出现的次数为:8
- 7出现的次数为:5
- 8出现的次数为:7
- 9出现的次数为:4
复制代码
作者: youxi01 时间: 2007-11-20 21:41
原帖由 泛滥棏慌° 于 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呢?....
代码是不是还可以精简一点呢?
- @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
复制代码
作者: novaa 时间: 2007-11-21 09:05
方法果然精简,哈哈,收获了
@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
)
不行。
作者: youxi01 时间: 2007-11-21 10:04
哦,有那样的事?我怎么测试行呢?
而且可以有运行结果呢?
作者: 随风 时间: 2007-11-21 17:03
回 8 楼
youxi 在 3 楼的代码我测试也是没问题的。
若一个代码经反复讨论后,仍是只在你那里有问题,那你就要把你的测试代码,“复制”上来。
而不是“引用”别人发的代码。因为不能肯定你复制代码下去的时候有没有出错。
还有你的测试结果也要告诉大家。
甚至你的运行环境。
我也来一个。- @echo off
- set "num=45456587212124896542131341567498794564312154533215643541246"
- for /l %%a in (0 1 9) do call set num=%%num:%%a=%%a %%
- for %%a in (%num%) do set /a _%%a+=1
- for /f "tokens=1* delims=_=" %%i in ('set _') do echo %%i 出现的次数为:%%j
- pause>nul
复制代码
[ 本帖最后由 随风 于 2007-11-21 20:45 编辑 ]
作者: novaa 时间: 2007-11-21 21:24
哎
经%#&%…………%@!@¥#发现是我的CMD有问题,
呵呵
惭愧啊!!
大家的代码都OK!
呵呵
不过随风和YOUXI的有点难度,呵呵
就要这样才好,不同思路,这样才有的看头和学习啊
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |