Board logo

标题: 给新人出的一道字符排序题(加分题): [打印本页]

作者: bat-zw     时间: 2008-5-21 10:22    标题: 给新人出的一道字符排序题(加分题):

有一组字符:13 z 113 -3 778 10004 f k a 119 -101 8 -19 m
要求通过批处理进行排序输出: -101 -19 -3 8 13 113 119 778 10004 a f k m z
请尽量采用不生成临时文件的办法。
PS:第一个做出来的新人,我加15分。
----------------------------------------------------------------------------------------------------------
我的答案:
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set str=13 z 113 -3 778 10004 f k a 119 -101 8 -19 m
echo 排序前:%str%
for %%i in (%str%) do call,set var=!var! #%%i#
for %%i in (%var%) do set a=%%i&call :lp
echo 排序后:%var:#=%
pause>nul&goto :eof
:lp
for %%i in (%var%) do (
    set b=%%i&set b=!b:#=!&set c=!a:#=!
    if !b! lss !c! (
       set var=!var:%a% =!
       set var=!var:%%i=%%i %a%!
       ) else (
       set var=!var!
    )
)
[ Last edited by zw19750516 on 2008-5-21 at 08:19 PM ]
作者: bat-zw     时间: 2008-5-21 12:05
晕,我是出给新人做的!让大家活跃下思维啊。
作者: jia332     时间: 2008-5-21 12:51
@echo on
set var=13 z 113 -3 778 10004 f k a 119 -101 8 -19 m
for /f %%a in ('%var%') do (
  set /a var1=%%a,var2=%%b, var3=%%c,var4=%%d,var5=%%e,var6=%%f,var7=%%g,var8=%%h, /a var9=%%i,var10=%%j,var11=%%k,var12=%%l,var13=%%m,var14=%%n
)
echo %var11% %var13% %var4% %var12% %var1% %var3% %var10% %var5% %var6% %var9% %var7% %var8% %var14% %var2%
pause

为什么这样取不出值, 请高手指点

[ Last edited by jia332 on 2008-5-21 at 12:53 PM ]
作者: bat-zw     时间: 2008-5-21 12:55
1 你的代码有误:连续set赋值时之间只能用&格开,如set a=1&set b=2。
2 象这样不如直接:echo -101 -19 -3 8 13 113 119 778 10004 a f k m z
作者: jia332     时间: 2008-5-21 12:58
set /a a=1+1,b=2+1,c=3+1  
echo %a% %b% %c%
问什么这样就可以,zw19750516能否教小弟一下
作者: terse     时间: 2008-5-21 13:06
我把前面发的改一下应该就可以
作者: bat-zw     时间: 2008-5-21 13:11
请terse兄留给新人多思考啊
作者: clian76     时间: 2008-5-21 13:17
太难了..
作者: terse     时间: 2008-5-21 13:32


  Quote:
Originally posted by zw19750516 at 2008-5-21 13:11:
请terse兄留给新人多思考啊

所以我没发出来  这两天股票跌S我  没心情了  还是去看一会盘面
作者: zlmjh     时间: 2008-5-21 14:01
我怎么不会呀
作者: jmz573515     时间: 2008-5-21 14:41
我只能写成这样了...
CODE:  [Copy to clipboard]
@echo off
setlocal enabledelayedexpansion
set i=1
set text="13 z 113 -3 778 10004 f k a 119 -101 8 -19 m"
:loop
for /f "tokens=1,* delims= " %%i in (%text%) do (
        set a%i%=%%i
        set text="%%j"
        set /a i+=1
)
if !text! neq "" goto loop
set /a i-=1
for /l %%a in (1,1,%i%) do (
        for /l %%b in (1,1,%i%) do (
                if !a%%a! lss !a%%b! (
                        set tm=!a%%a!
                        set a%%a=!a%%b!
                        set a%%b=!tm!
                )
        )
)
for /l %%c in (1,1,%i%) do set  /p=!a%%c! <nul
echo.
pause

作者: 26933062     时间: 2008-5-21 14:43
作的出这个题的,最多只是论坛新人,绝不会是批处理新人。
作者: bat-zw     时间: 2008-5-21 15:01
同意兄的说法,其实我的最终目的还是让论坛能活跃起来。
ps:jmz573515的代码还可以简化。
作者: bat-zw     时间: 2008-5-21 16:04    标题: 提示:

&&可直接用比较大小的方法,排序时请注意字符的定位和唯一性。
作者: pusofalse     时间: 2008-5-21 17:01
我的思路。。。
先提取出数字,并分别赋予变量,set自动排序
然后判断哪些没有被赋予变量,没有被赋予的就是字母,同上,set第二次排序。。
或者新建文件,分别以这些字母命名,然后dir /b o:n 输出命令结果~
作者: bat-zw     时间: 2008-5-21 17:09    标题: 感觉想复杂了:

兄弟不妨写出来看看。
作者: pusofalse     时间: 2008-5-21 17:38
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set "str=13 z 113 -3 778 10004 f k a 119 -101 8 -19 m"
for %%a in (%str%) do (
        if %%a lss a (
        set "var=!var!%%a "
        set str=!str: %%a=!
)
)
for %%a in (%var%) do (
        set str1=0000000000%%a
        set .!str1:~-10!=a
)
for /f "delims=.=" %%i in ('set .') do (
        for /f "tokens=* delims=0" %%a in ("%%i") do set/p= %%a<nul&set %%a=A
)
for %%a in (%str%) do (
        if not defined %%a (
        set str2=0000000000%%a
        set #!str2:~-10!=a
)
)
for /f "delims==#" %%i in ('set #') do (
        for /f "tokens=* delims=0" %%a in ("%%i") do set/p= %%a<nul
)
很繁琐,只能做到如此程度了,完全是抄袭的~ - -||
作者: qdloverr     时间: 2008-5-21 18:25
for /f "tokens=1-14" %%a in ("13 z 113 -3 778 10004 f k a 119 -101 8 -19 m") do echo %%k %%m %%d %%l %%a %%c %%j %%e %%f %%i %%g %%h %%n %%b
pause

pause
最苯,最简单的方法
排下版就行了....................
哈哈 表骂偶

[ Last edited by qdloverr on 2008-5-21 at 06:27 PM ]
作者: bat-zw     时间: 2008-5-21 18:25
加分以鼓励.
作者: pusofalse     时间: 2008-5-21 18:30


  Quote:
Originally posted by zw19750516 at 2008-5-21 06:25 PM:
加分以鼓励.

前辈加错分了啊! 我都说过是抄袭的了~ 以前有过这样一关于排序的贴子啊,貌似是terse前辈的~
作者: netbenton     时间: 2009-1-1 06:51    标题: 我是新手,可以加分吗

@echo off&setlocal enabledelayedexpansion

set str= 13 z 113 -3 778 10004 f k a 119 -101 8 -19 m

for %%a in (%str%) do (
        if %%a lss 999999 set cc=/%%a
        if %%a lss 99999 set cc=//%%a
        if %%a lss 9999 set cc=//%%a
        if %%a lss 999 set cc=///%%a
        if %%a lss 99 set cc=////%%a
        if %%a lss 9 set cc=/////%%a
        if %%a lss 1 set cc=/%%a
        if not %%a lss 999999 set cc=/%%a
        set bb!cc!=1
)

FOR /f "tokens=1 delims= " %%i IN ('SET bb ^| SORT /r') DO (
        SET abc=%%i
        SET abc=!abc:*/=!
        SET abc=!abc:/=!
        SET abc=!abc:~0,-2!
        set ok=!abc! !ok!
)
echo. & echo 原数组:!str! & echo 排序输出:!ok!

pause
作者: netbenton     时间: 2009-1-2 00:07    标题: 不好意思,再精简一下

@echo off&setlocal enabledelayedexpansion

set str= 13 z 113 -3 778 10004 f k a 119 -101 8 -19 m

for %%a in (!str!) do (

if %%a geq a (set cc=/%%a) else set cc=///////////%%a
  set cc=!cc:~-10!
  set bb!cc!=1
)

FOR /f "tokens=1 delims= " %%i IN ('SET bb') DO (
        SET abc=%%i
        SET abc=!abc:*/=!
        SET abc=!abc:/=!
        SET abc=!abc:~0,-2!
        set ok=!ok! !abc!
)
echo. & echo 原数组:!str! & echo 排序输出:!ok!

pause




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5