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

回复 15楼 的帖子

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

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

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

回复 17楼 的帖子

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

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

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

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

TOP

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

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

大概地模拟了一下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

回复 23楼 的帖子

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

TOP

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

TOP

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

TOP

回复 26楼 的帖子

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

TOP

所谓的“偏方”,其实也是良方
http://www.bathome.net/viewthread.php?tid=1581&page=1#pid8439

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

TOP

还是做了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::第一部分是赋值二维数组模型
  4. set /a a=-1
  5. for /f "tokens=*" %%a in (a.x) do (
  6.    set /a a+=1,b=-1
  7.    for %%b in (%%a) do (
  8.       set /a b+=1
  9.       set str[!a!][!b!]=%%b
  10.    )
  11. )
  12. set /a 项目数=b-2
  13. ::给出某项任务完成的个数,并找出0的局
  14. for /l %%b in (1,1,%项目数%) do (
  15.   for /l %%a in (1,1,%a%) do (
  16.     set /a !str[0][%%b]!+=str[%%a][%%b]
  17.     if "!str[%%a][%%b]!"=="0" (set zero%%b=!zero%%b!!str[%%a][0]!;)
  18.   )
  19.   if "!zero%%b!"=="" (set "zero%%b=无;")
  20.   for %%x in (!str[0][%%b]!) do (set now=!%%x!)
  21.   echo,!str[0][%%b]!!now! , 本次完成0的分局: !zero%%b:~0,-1!
  22. )
  23. ::最后两列,和对应的项目名按顺序,匹配好并列出
  24. set /a last=b-1
  25. :result
  26. set result=!str[0][%last%]!:
  27. for /l %%b in (1,1,%a%) do (
  28.    for /l %%a in (1,1,%a%) do (
  29.      if "!str[%%a][%last%]!"=="%%b" (
  30.        set result=!result! !str[%%a][0]!!str[%%a][%last%]!
  31.      )
  32.    )
  33. )
  34. echo,%result%
  35. if %last% lss %b% (set /a last+=1 &goto :result)
  36. pause
  37. exit
复制代码

[ 本帖最后由 523066680 于 2009-11-20 14:49 编辑 ]
2

评分人数

    • Seter: 找到了C的影子!PB + 10
    • batman: 数组概念用的好!PB + 20

TOP

回复 29楼 的帖子

针对此代码发表点个人意见,不当之处还请误解:
一、优点:
1、在批处理中引入数组概念,拓展了批的处理功能;
2、代码较简洁,这其实也是因为引入了数组,减少了累加赋值的过程;
3、书写较规范,但请注意a.x是不符合题意的。
二、不足之处:
1、因为代码是用数组变量表示的每个单元的值,所以变量用量较大,如达到百行百列时,变
量就要用到一万个,是对系统资源的考验;
2、出现6这个常量,这与题意中未知行未知列是不相符的;
3、代码中使用了goto循环,在效率上比for循环要低。
总之,exist这段代码还是表现出了其高水平的批处理技巧,值得大家学习。
***共同提高***

TOP

返回列表