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

请原谅,是我粗心。
“这时c=x,排列时,前三列每列四行,其余8列只能每列三行另加一外空格才对齐。”这句算错了。
应为:“这时c=x,排列时,前一列每列四行,其余10列只能每列三行另加一外空格才对齐。”

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

不知道是否应该是这个意图
我猜的
  1. @echo off&setlocal enabledelayedexpansion
  2. set L=11
  3. set "file=test.txt"
  4. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  5. for /f "usebackq tokens=*" %%i in ("%file%") do set /a N+=1&set #!N!=%%i
  6. set /a h=(n+l-1)/l,j=(n%%l)*H,i=h-1
  7. if !j! leq 0 set j=n
  8. for /l %%i in (1 1 %n%) do (
  9.     if %%i leq %j% (
  10.        set /a "m=(%%i-1)%%h+1"
  11.     ) else set /a "m=-~%%i %% i+1"
  12.       for %%j in (!m!) do set "$%%j=!$%%j!%tab%!#%%i!"
  13. )
  14. (for /l %%i in (1 1 %h%) do for /f "tokens=*" %%j in ("!$%%i!") do echo %%j)>$T.em
  15. more /t16 $T.em >n.txt
  16. del $T.em
  17. pause
复制代码

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

唉 ~  终于有个大致算法  看还有什么变数

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

回复 15# terse

我想要的是一个切分程序,总行数和要切分的列数是不定的,这样程序就有通用性。
我想这个程序首先要解决数学问题,我在一楼、三楼、十三楼分别说到了一些。如果要枚举,我在一楼已举了三个例子。其中“切分为五列”在最后一列补空,是比较符合阅读习惯的方法。其实,这个例子也可以从第二列开始,每列补一个空。如果对所有不能整除的总行数,只采用“每列补一个空”的方法,我称它为“二分法”,如果只对特殊情形“c≥x”(切分的列大于或等于切分后每列的行数)时,才用这种方法,其他的只在最后一列补空,我称它为“三分法”。

再说特殊例子:34行切成11列。
如果对这个例子只对最后一列补空行,就会成为你所列的情况。即:只能看到九列,其他二行不见了!这就是特殊情形!
对这种情况要分成十一列,只能采用对所有不能整除的总行数,用“每列补一个空”的方法来完成!

如下:
1行 5行  8行 11行 14行 17行 20行 23行 26行 29行 32行
2行 6行  9行 12行 15行 18行 21行 24行 27行 30行 33行
3行 7行 10行 13行 16行 19行 22行 25行 28行 31行 34行
4行

我的表达不标准,不知道你听明白了没有?

TOP

如你所说 34行切成11列 在你看来特殊的
那你理想排列是怎样的呢
  1. 1行 5行  9行 13行 17行 21行 25行 29行 33行
  2. 2行 6行 10行 14行 18行 22行 26行 30行 34行
  3. 3行 7行 11行 15行 19行 23行 27行 31行
  4. 4行 8行 12行 16行 20行 24行 28行 32行
复制代码

TOP

楼主到底想要什么 我理解问题吗
是想余数为0吗?
不要说2分 N分
能简单举几个例及你认为的特殊情况 怎么排列最好 你最后的理想结果是什么

TOP

回复 11# xxpinqz

谢谢!你这个代码又进了一步,最后一列的空格被取消了。但:
当c≥x时,如34行切成11列、12行切成5列,就会出现空列。

切分涉及到一些数学问题。
我想这里还有是采用二分法还是三分法的问题。

数学问题我不是很懂,可否这样考虑:
设总行数=k,切分列数=c,每列行数=x=k/c,余数=y
切分后无非出现这几种情形:
1、k/c=整数,不用添加空格,按x列直接导出索引即可;
2、k/c≠整数,即有余数,这有二种情形:
1)c<x,可直接在最后一列补空格,使每列对齐,这符合一般的阅读习惯,这种情形是绝大多数;
2)c≥x,如34行切成11列,34/11=3,余3。
这时c=x,排列时,前三列每列四行,其余8列只能每列三行另加一外空格才对齐。如果空格补在最后的列,最后二列就成了空列,看起来就少了二列,或者说只有9列了。

如果切分用二分法:
即:
k/c=整数时,直接切分。
k/c≠整数时,c-y列直接切分,y列每列加一空行。

如果切分用三分法:
即:
k/c=整数时,直接切分。
c<x时,直接在最后一列补空格。
c≥x时,c-y列直接切分,y列每列加一空行。

二分法切分要简单一些,三分法实际把“c≥x”作为特殊情况,另分一次。
因为特殊情况很少,所以三分法会更符合阅读习惯。

TOP

for 放在下面 可以省掉临时文件

TOP

做目录索引是为了更方便快捷的的查找定位,排成这样感觉比原始的还不直观。数据多点比一列下来还难找。
关于最后一列的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

头绪比较乱,找不到合适的数学模型,坐等高人

TOP

本帖最后由 pan528 于 2013-6-2 09:46 编辑

回复 8# CrLf

谢谢,这个代码解决了竖排和“c<x”的问题,但:
1、c≥x时,如34行切成11列,就会出现空列。
2、最后一列的空格是多余的,如果在网页显示上会被挤出一列,即多出一个空列,因此,最好能在最后一列不加空格。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a 列数=3,列宽=32
  3. %1 %0 :|more /t%列宽% >b.txt&pause&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!!ar[%%b]!%tab%"
  11. )
  12. echo;!str!
  13. )
复制代码

TOP

返回列表