批量模数问题

时间:2016-03-03 03:14:42

标签: windows batch-file modulus

对于作业,我们的任务是从批处理中制作一个FOR循环,并从(1到100 mod 5)+ 3计算总计。我被卡住并可以使用一些帮助。

@ECHO off

:MAIN
FOR /L %%i IN (1,1,100) DO (

SET A=%%i
SET B=5
SET /A C=A%%B
IF %C%==0 GOTO TOTAL

:TOTAL
SET NUM=C+3

)

非常感谢!

1 个答案:

答案 0 :(得分:4)

@ECHO OFF
SETLOCAL

:MAIN
SET /a C=0
FOR /L %%i IN (1,1,100) DO (
SET /A C+=%%i
)
SET /a NUM=C %% 5 +3
ECHO num=%num%

GOTO :EOF

第一个问题:没有setlocal,您的环境在运行之间会持续存在。因此,您在任何变量set a b c(批量大部分不区分大小写)中拥有num的任何值都将成为您的起始值接下来在同一个cmd会话中运行批处理。

包含setlocal表示批量结束时您将对环境所做的任何更改都将被丢弃。

下一个问题:目前还不清楚你的意思是((1到100之和)mod 5)+ 3或(1到(100 mod 5)之和)+ 3。我从{{1}开始就假设了前者} = 0,从1到0的总和没什么意义(对我来说)。

下一步:100 mod 5循环在“块”(带括号的行序列)中不能包含标签,因为它会终止块。

下一步:整个块首先for(检查语法有效性)然后执行。批量替换块中的任何parsed及其值解析时间,因此%var%将替换为 nothing ,因为%C%不是在达到c命令时定义。因此,该命令将替换为

for

因此,作为IF ==0 GOTO TOTAL 语句的批处理对象应为if。因此,它看到if string1 operator string2 action所需的运算符(如goto)并生成错误消息。

由于你并非绝对知道任何变量都不会被定义,所以谨慎地初始化你的变量(因此我发布的替换中的==。)

下一步 - 如果SET /a C=0成为c,您为何要摆脱循环?似乎没有原因来做到这一点。这是可能的 - 但是您需要使用0来访问循环中的值,因为它会发生变化(运行时值。)这超出了您所知道的范围。到目前为止,如果您感兴趣,delayedexpansion上有数百篇SO文章。

所以 - 我发布的代码的工作方式是将delayedexpansion设置为0,以便将其设置为已知值,以防万一它恰好是开头的其他内容。

然后,对于{1}的每个值,从1到100,将c添加到%%i。另一个有效的方法是

%%i

然后将c设置为(c mod 5)并添加3,然后显示它。

批量指定 set /a c=c+%%i num运算符)的优先级高于%,因此在mod运算后执行添加。您还可以对元素进行分组:

mod

这些空间仅仅是为了便于阅读。

+是必需的,因为 set /a num=(c %% 5) + 3 需要%% - 也就是说,批量中的特殊含义需要关闭,因此%之前是escaped另一个%因为%%的转义字符。如果您需要转义其他字符,则需要使用插入符号%)。