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

回复 26楼 的帖子

我现在用的方法可不是排序哦,严格上来讲应属于变量赋值法。
***共同提高***

TOP

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

如果要算法来排序,可能会选择用选择排序吧。。。。。。
排序可是个出过的题。你们用set 变量名, 用冒泡,用选择,用希尔,然后呢?

TOP

回复 23楼 的帖子

后面的两行才是本题的重点哦。。。
***共同提高***

TOP

大概地模拟了一下2维数组,确实是一道“复合题”,后面的两行,我就不弄了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a a=-1
  4. for /f "tokens=*" %%a in (a.x) do (
  5.    set /a a+=1,b=-1
  6.    for %%b in (%%a) do (
  7.       set /a b+=1
  8.       set str[!a!][!b!]=%%b
  9.    )
  10. )
  11. for /l %%b in (1,1,6) do (
  12.   for /l %%a in (1,1,%a%) do (
  13.     set /a !str[0][%%b]!+=str[%%a][%%b]
  14.     if "!str[%%a][%%b]!"=="0" (set zero%%b=!zero%%b!!str[%%a][0]!;)
  15.   )
  16.   if "!zero%%b!"=="" (set "zero%%b=无;")
  17.   for %%x in (!str[0][%%b]!) do (set now=!%%x!)
  18.   echo,!str[0][%%b]!!now! , 本次完成0的分局: !zero%%b:~0,-1!
  19. )
  20. pause
  21. exit
复制代码

TOP

本人的解

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.     set /a hang+=1,lie=0
  4.     for %%b in (%%a) do (
  5.         set /a lie+=1&set "str=%%b"
  6.         if not defined fj if "!str:~,1!" equ "当" set /a fj=lie
  7.         if !hang! equ 1 (
  8.            if !lie! neq 1 set "_!lie!=%%b#:"
  9.            ) else (
  10.            if !lie! equ 1 (
  11.               set "ju=%%b"
  12.               ) else (
  13.               for %%c in (!lie!) do (
  14.                   if %%c lss !fj! (
  15.                      set /a num_%%c+=%%b
  16.                      if !str! equ 0 set "_%%c=!_%%c!!ju!,"
  17.                      ) else (
  18.                      if not defined %%c_%%b (
  19.                         set "%%c_%%b=!ju!%%b,"
  20.                         ) else (
  21.                         set "%%c_%%b=!%%c_%%b!!ju!%%b,"
  22.                      )
  23.                   )
  24.                )
  25.             )
  26.          )
  27.     )
  28. )
  29. cd.>b.txt
  30. for /l %%a in (2,1,%lie%) do (
  31.     set "str=!_%%a!"
  32.     if %%a lss %fj% (
  33.        for %%b in (!num_%%a!) do (
  34.            if "!str:~-1!" neq ":" (
  35.               set "str=!str:~,-1!"&echo !str:#=%%b,完成为0的局!>>b.txt
  36.               ) else (
  37.               echo !str:#=%%b,完成为0的局!无>>b.txt
  38.            )
  39.        )
  40.        ) else (
  41.        for /l %%b in (1,1,%hang%) do if defined %%a_%%b set "str=!str! !%%a_%%b!"
  42.        set "str=!str:#=!"&echo !str:~,-1!>>b.txt
  43.     )
  44. )
  45. start b.txt
复制代码


[ 本帖最后由 batman 于 2009-11-21 11:57 编辑 ]
***共同提高***

TOP

前面数据整理不怎么耗时,主要是不想用临时文件而将排序模块整合在一起造成的。
如果不担心分局数和项目数加起来会超过变量最大长度,两次排序其实可以goto一次完成,将_day_ranking和_month_ranking分别不同的前缀补位,然后拼接,goto时还可省略%3,排序后分开时再加判断。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

楼上的效率显然有问题。。。这就是用^|sort造成的

[ 本帖最后由 batman 于 2009-11-19 23:50 编辑 ]
***共同提高***

TOP

达到要求的输出格式使得步骤多了点。
(显然,Ctrl+A可见)
  1. @echo off
  2. %1 %2
  3. setlocal enableDelayedExpansion
  4. set n=0
  5. for /f "tokens=1* delims==" %%a in ('"set /p head=<1.txt& set head"') do ^
  6. for %%i in (%%b) do set _!n!=%%i& set /a n+=1
  7. set /a items=n-3, day_ranking=n-1, month_ranking=n
  8. for /f "skip=1 delims=" %%a in (1.txt) do set m=0&for %%i in (%%a) do (
  9.     if "!m!"=="0" set department=%%i
  10.     for %%x in (_!m!) do (
  11.         if "%%i"=="0" set %%x_0=!%%x_0! !department!
  12.         set /a !%%x! += %%i
  13.     )
  14.     set /a m+=1
  15.     set serial=0000%%i& set serial=!serial:~-4!
  16.     if !m!==!day_ranking! set _day_ranking=!_day_ranking! !serial!.!department!
  17.     if !m!==!month_ranking! set _month_ranking=!_month_ranking! !serial!.!department!
  18. )
  19. for /l %%a in (1 1 %items%) do (
  20.     if "!_%%a_0!"=="" set _%%a_0= 无
  21.     set #%%a=!_%%a! ^^!!_%%a!^^!, 完成为0的局:!_%%a_0!
  22. )
  23. for /f "tokens=1* delims==" %%a in ('set #') do echo %%b
  24. for /f "tokens=* delims=0" %%a in ('%~s0 goto sort_ "!_day_ranking!"^|sort') do set #day_ranking=!#day_ranking!,%%~xa%%~na
  25. for /f "tokens=* delims=0" %%a in ('%~s0 goto sort_ "!_month_ranking!"^|sort') do set #month_ranking=!#month_ranking!,%%~xa%%~na
  26. set #day_ranking=!#day_ranking:~1!
  27. set #month_ranking=!#month_ranking:~1!
  28. echo 当日排名: !#day_ranking:.=!
  29. echo 当月累计排名: !#month_ranking:.=!
  30. pause&exit/b
  31. :sort_
  32. for /f "delims=" %%a in ("%~3") do for %%i in (%%~a) do echo %%i
  33. goto :eof
复制代码


[ 本帖最后由 batman 于 2009-11-21 11:58 编辑 ]
1

评分人数

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 17楼 的帖子

还请就此题给出完整代码
***共同提高***

TOP

回复 16楼 的帖子

交换位置后:
0001 一分局
0002 二分局
0003 三分局
0005 四分局
0007 五分局
0006 六分局
0003 七分局
......
0123 一百五十分局

(前面的0是添加的,再截取后4位)
既然无需调整名次序号,那不就结了,直接sort

[ 本帖最后由 zqz0012005 于 2009-11-19 22:13 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 15楼 的帖子

为什么要调成第四名,说了有并列名次出现的情况。。。

[ 本帖最后由 batman 于 2009-11-19 22:10 编辑 ]
***共同提高***

TOP

回复 14楼 的帖子

晕,我也没说此题无解,12楼只是对11楼的补充,同时都是对7楼的解释。

而且题目给的结果并未处理啊:
当月累计排名:一分局1,二分局2,三分局3,七分局3,四分局5,六分局6,五分局7
两个第三名后,直接是第五名,没有将名次序号调成4
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 12楼 的帖子

我没说此题无解吧,晕,我只是一再在强调出现同名次的情况需要处理
***共同提高***

TOP

这个排序问题其实也不错:
以A3列的大小为主要排序,A2列的大小为次要排序,应该怎么实现?
http://bbs.verybat.org/viewthread.php?tid=17101
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表