batch-file - Windows 10 命令。使用IF GEQ进行比较,得到不好的结果

标签 batch-file math cmd windows-10

我一直在编写一个 CMD BATCH 文件,用 ascii 字符在屏幕上绘制一些内容。我编写了一个非常简单的设置,使用距离公式的变体在屏幕上制作圆圈。但结果并不完全正确。

虽然它(大部分)绘制了圆圈,但顶部和左侧有一些奇怪的情况。为了尝试对此进行调试,我将设置 /A 的实际结果输出到 .csv 中,看起来数学计算正确,并且得到了正确的结果。但是当它使用 if !variable! 时geq 数字,它不能可靠地正确评估(只是大多数时候)。

这是仍然存在问题的代码的精简版本:

SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF
CLS
MODE CON: COLS=100 LINES=102
COLOR 0A
IF EXIST OUTPUT.MAP DEL OUTPUT.MAP
IF EXIST MATHCHECK.CSV DEL MATHCHECK.CSV
SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWCHAR%%X%%Y=.
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 129600 SET DRAWCHAR%%X%%Y=^^
        ECHO 129600,^^^^,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR%%X%%Y!>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 ) 

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 144400 SET DRAWCHAR%%X%%Y=M
        ECHO 144400,M,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR%%X%%Y!>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 )          

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    SET DRAWLINE%%Y=-
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWLINE%%Y=!DRAWLINE%%Y!!DRAWCHAR%%X%%Y!
    )
    SET DRAWLINE%%Y=!DRAWLINE%%Y:~1,79!
    ECHO !DRAWLINE%%Y!>>OUTPUT.MAP
    CLS
    ECHO COMPILING OUTPUT...
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)    

CLS
ECHO +------------------------------------------------------------------------------+-------------------+
FOR /L %%D IN (2,1,79) DO (
    ECHO ^|!DRAWLINE%%D!^|!                   ^|
)
ECHO +------------------------------------------------------------------------------+-------------------+
PAUSE

这是我得到的结果: https://drive.google.com/open?id=1Rwp2YCBwJCArkVunqBNXa3CDuJhTSVSm

它应该看起来像一个 Ms 的正方形,里面有一圈 ^s,然后是一圈 .s。它基本上是正确的,但是顶部和左侧那些额外的 Ms 和 ^s 锯齿不应该在那里。

数学公式应该是正确的。只是A^2+B^2=C^2

为了弄清楚这一点,我吐出了一个 mathcheck.csv 文件,其中包含:

  1. 测试值
  2. 如果 geq 为测试值则要打印的字符
  3. x 和 y 坐标
  4. 计算出的距中心的平方距离
  5. 程序表示要使用的结果字符。

如果滚动浏览该文件,您可以看到结果是计算值大于测试值的实例,即使计算值并非如此。

我尝试过各种各样的东西:使用 lss 而不是 geq (和翻转值),查找并调整 set/a 命令,查找并调整 if,以不同的顺序“绘制”(如果您绘制所有 Ms,然后在顶部绘制较小的圆圈,而不是从 .s 开始并将环放在上面,您会在相同的一般区域中得到非常相似的错误)。

很确定在这一点上我要么在代码中愚蠢地做了一些明显的事情,要么如果数字比较不够可靠以至于无法工作?但这似乎不可能。这一定是代码错误。

最佳答案

XY 坐标的主要问题是,如果不将它们分开,则多个值可能会出现在同一位置。例如,[638] 是 [6,38] 或 [63,8]。不幸的是,如果您不将它们分开,批处理将覆盖任何现有值。使用标准数组语法 !DRAWCHAR[%%X][%%Y]! 可以解决此问题。

SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF
CLS
MODE CON: COLS=100 LINES=102
COLOR 0A
IF EXIST OUTPUT.MAP DEL OUTPUT.MAP
IF EXIST MATHCHECK.CSV DEL MATHCHECK.CSV
SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWCHAR[%%X][%%Y]=.
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 129600 SET DRAWCHAR[%%X][%%Y]=^^
        ECHO 129600,^^^^,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR[%%X][%%Y!]>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 ) 

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 144400 SET DRAWCHAR[%%X][%%Y]=M
        ECHO 144400,M,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR[%%X][%%Y]!>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 )          

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    SET DRAWLINE[%%Y]=-
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWLINE[%%Y]=!DRAWLINE[%%Y]!!DRAWCHAR[%%X][%%Y]!
    )
    SET DRAWLINE[%%Y]=!DRAWLINE[%%Y]:~1,79!
    ECHO !DRAWLINE[%%Y]!>>OUTPUT.MAP
    CLS
    ECHO COMPILING OUTPUT...
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)    

CLS
ECHO +------------------------------------------------------------------------------+-------------------+
FOR /L %%D IN (2,1,79) DO (
    ECHO ^|!DRAWLINE[%%D]!^|!                   ^|
)
ECHO +------------------------------------------------------------------------------+-------------------+
PAUSE

关于batch-file - Windows 10 命令。使用IF GEQ进行比较,得到不好的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808417/

相关文章:

math - 并行任意精度算术库

Git 将系统配置文件视为主文件夹而不是用户主文件夹 (Windows 7)

batch-file - 使用批处理循环移动多个扩展名的文件

windows - 在 PowerShell 和命令提示符上选择某些内容时避免暂停任务

windows - 在 .bat 文件中启动一个进程但隐藏它?

batch-file - 如何将空白作为参数传递给批处理文件

batch-file - 如何将 if 语句与 WMIC 一起使用

javascript - 阵列帮助。如何将数组自身相乘,其中一个没有第一个元素,另一个没有最后一个元素

c++ - 寻求有关 FFT 模板的帮助

.bat 脚本中的 git 克隆