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

回复 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

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

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

不知道是否应该是这个意图
我猜的
  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

呵呵,大家都用猜的~,把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

回复 17# xxpinqz

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

TOP

回复 21# xxpinqz
谢谢!终于有了三分法的切分程序。
慢慢消化,学习学习。

TOP

回复 20# terse

是一个二分法的切分程序。
通过了34/11的情况,但 34/4时,就出错了,第三列和第四列顺序都出错了,结果如下:
1               10              23              31
2               11              24              32
3               12              25              33
4               13              26              34
5               14              19              27
6               15              20              28
7               16              21              29
8               17              22              30
9               18

TOP

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

TOP

还是计算错了 这个也只是简单测试
  1. @echo off&setlocal enabledelayedexpansion
  2. set L=5
  3. set "file=a.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--~j)%%_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)>csm.txt
  15. more /t16 csm.txt >nmn.txt
  16. pause
复制代码

TOP

现在楼主的意图出来了 算是理解了

TOP

本帖最后由 pan528 于 2013-6-5 20:46 编辑

回复 26# terse

测试通过!代码挺精炼的。如果能改成三分法就更完美了。谢谢!

能解释一下,下面代码的含义吗?

for /f "delims=U" %%a in ('cmd /u /c echo 唉') do

TOP

你所谓的 3分法  是什么样的分法
上面取得跳格键

TOP

回复 29# terse

三分法就是:在上面二分法的基础上,对切分列数小于每列行数的情形,用另一种方法排列,即把所有空格放在最后一列。
比如:
二分法:
1        10        19        27
2        11        20        28
3        12        21        29
4        13        22        30
5        14        23        31
6        15        24        32
7        16        25        33
8        17        26        34
9        18
三分法
1    10   19   28
2    11   20   29
3    12   21   30
4    13   22   31
5    14   23   32
6    15   24   33
7    16   25   34
8    17   26
9    18   27

TOP

返回列表