[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
做目录索引是为了更方便快捷的的查找定位,排成这样感觉比原始的还不直观。数据多点比一列下来还难找。
关于最后一列的TAB被扩展的问题是否这样理解:
引自8楼Crlf代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a 列数=3,列宽=32
  3. %1 %0 :|more /t%列宽% >$&(for /f "tokens=*" %%a in ($) do echo %%a)>b.txt&del $&exit
  4. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  5. (for /f "delims=" %%a in (a.txt) do set /a n+=1&set /p ar[!n!]=)<a.txt
  6. set /a 行数=(n+列数-1)/ 列数
  7. for /l %%a in (1 1 %行数%) do (
  8.         set "str="
  9.         for /l %%b in (%%a %行数% %n%) do (
  10.                 set "str=!str!%tab%!ar[%%b]!"
  11.         )
  12.         echo;!str!
  13. )
复制代码
话说回来了,set /a 行数=(n+列数-1)/ 列数
这句太牛了,数学没及格过的人飘过......
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 13# pan528
仔细看了一遍,感觉还是像天书般的深奥难懂
下面两句引自你的原文:
2)c≥x,如34行切成11列,34/11=3,余3。
这时c=x,排列时,前三列每列四行,其余8列只能每列三行另加一外空格才对齐。

这是什么算法能得出(c=x):34/11=11,接着还能得出余数是3.
看了一楼例子有点概念了,看了文字说明又糊涂了,要参考你哪个说法呢?没概念!!!

理解楼主好意想尽力表述清晰并提供一定的思路参考,但是生搬硬套的定义一个新概念并要强制灌输给看的人,好像并不是什么好办法。
鉴于目前好像都没人表示看的懂你的意思,你为什么不像一楼那样举个例子,辅以你所说的3种情况分别按15楼terse那样的排版手段列出需要的排版结果呢。

别人能写则写,写了你也就不用去管别人到底是用加减法还是乘除法或者N分法
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

  1. 当文档总行数=26,列数c=5,每列行数x=5,余数=1时
  2. 即:c≥x时,按你15楼理解应该排成这样:(前余数=1列为x+1=6行,后面剩余的列按x行)
  3. 1    7    12   17   22
  4. 2    8    13   18   23
  5. 3    9    14   19   24
  6. 4    10   15   20   25
  7. 5    11   16   21   26
  8. 6
  9. 但是1楼给出的却是:
  10. 当文档总行数=26,列数c=5,每列行数x=5,余数=1时
  11. 1    7    13   19   25
  12. 2    8    14   20   26
  13. 3    9    15   21
  14. 4    10   16   22
  15. 5    11   17   23
  16. 6    12   18   24
  17. 同理当文档总行数=26,列数c=7,每列行数x=3,余数=5时,此时c≥x是应是按以下排版,可对?:
  18. 1    5    9    13   17   21   24
  19. 2    6    10   14   18   22   25
  20. 3    7    11   15   19   23   26
  21. 4    8    12   16   20
  22. 所以按你文字说明,下面的情况应该是按下面前者而非后者,可对?
  23. 当文档总行数=26,列数c=4,每列行数x=6,余数=2时,c<x,这样排:
  24. 1    8    15   22
  25. 2    9    16   23
  26. 3    10   17   24
  27. 4    11   18   25
  28. 5    12   19   26
  29. 6    13   20
  30. 7    14   21
  31. 当文档总行数=26,列数c=4,每列行数x=6,余数=2时,c<x,而非这样排:
  32. 1    8    15   21
  33. 2    9    16   22
  34. 3    10   17   23
  35. 4    11   18   24
  36. 5    12   19   25
  37. 6    13   20   26
  38. 7    14
  39. 如果上面理解正确,那么12/5,34/11,28/9则均属于c>x的情况,即按你15楼给出的(前余数列为x+1行,后面剩余列按x行)
  40. 这有什么特殊呢?
  41. 如果我的描述有误,你就以26行为例,把分割成3,4,5,6,7列的结果排上来看看。整除的就不用了。
  42. 然后把正确描述更新到顶楼吧,目前描述的错误蛮多的。
  43. 草拟了一个代码,不过好像有点繁杂了,等着看看terse的算法...
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

呵呵,大家都用猜的~,把CrLf代码改改成这样。
  1. @echo off&setlocal enabledelayedexpansion
  2. rem 生成测试文件
  3. (for /l %%a in (1,1,26) do echo %%a)>$1
  4. rem 以下主体部分
  5. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  6. (for /f "delims=" %%a in ($1) do set /a n+=1&set /p ar[!n!]=)<$1
  7. set /a 列数=5,列宽=5,m=n/列数,余数=n%%列数,行数=(n+列数-1)/列数,修正递增=行数-1,修正终值=行数*余数
  8. if !修正终值! neq 0 (
  9.   set 有余数=.
  10.   if %列数% leq %m% set /a 修正终值="(列数-1)*行数"
  11.   call :sc "!修正终值!"
  12. ) else (
  13.   call :sc "!n!"
  14. )
  15. more /t%列宽% $t>b.txt
  16. del $?&start b.txt&exit /b
  17. :sc
  18. set /a a=c=行数,b=0,d=%~1
  19. :loop
  20. for /l %%a in (1 1 %a%) do (
  21.     set /a b+=1
  22.     for /l %%b in (!b! %c% %d%) do (
  23.       if "!str%%a!"=="" (
  24.         set "str%%a=!ar[%%b]!"
  25.       ) else (
  26.         set "str%%a=!str%%a!%tab%!ar[%%b]!"
  27.       )
  28.     )
  29. )
  30. if defined 有余数 (
  31.     set /a a=行数-1,b=修正终值,c=修正递增,d=n
  32.     set "有余数="
  33.     goto :loop
  34. )
  35. (
  36. echo 当文档总行数=%n%,列数c=%列数%,每列行数x=%m%,余数=%余数%时
  37. if !列数! leq !m! (echo 即c小于等于x) else echo 即c大于x
  38. for /l %%a in (1,1,%行数%) do echo,!str%%a!
  39. )>$t
  40. goto :eof
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

是21楼代码那样的效果?
呵呵,晕倒,一句话能交代清楚的问题,被你天书般的描述弄的大家头都晕了。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

按我理解,就是下面这意思:
假设总行数n,列数l,则行数h=n/l,余数y=n%%l
一、当余数y=0,则直接输出。
二、  余数y>0,则:
                1、l大于h,则前y列各加一行为h+1,后l-y列为h行
                2、l小于等于h,则前l-1列各加一行为h+1,余者为最后一列即n-(l-1)*(h+1)行

改下代码半小时不到,理解楼主的意思花了两天最后还是靠瞎猜出来的。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 39# terse
话说我的数学就是加减乘除 ,所以算法吃不透,目测26楼代码是按输完一列再接着输下一列的按顺序输出
所以判断是否所谓三分也应该要用n/l来判断,而非0。
扯了3页,就下面两句是亮点:
8楼的set /a 行数=(n+列数-1)/ 列数
26楼的set /a "m=(%%i--~j)%%_i+1"
向两位高手致敬~~
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

返回列表