Windows批处理文件,两个数字的划分,用于划分为0的错误陷阱

问题描述:

我正在尝试编写一个windows批处理文件,该文件实现了除了第二个数字为0的情况下的一些错误陷阱的划分。如果用户输入55它应该进入一个循环,找到从1-100模5,+ 3 计算每个数字的所有结果的总数循环结束后,它应该显示所有结果的平均值并将它们附加到一个txt文件。Windows批处理文件,两个数字的划分,用于划分为0的错误陷阱

当我尝试,分区,屏幕弹出并消失。如果我输入55,永远不会到达循环。任何帮助表示感谢,谢谢!

:FORLOOP 
cls 
PAUSE 

SET COUNTER=0 
SET MODNUM=5 
SET ADDNUM=3 
SET RESULT=0 
SET TOTAL=0 
SET AVG=0 
GOTO LOOP 

:LOOP 
SET /A COUNTER=COUNTER+1 
SET /A "RESULT=((%LOOP% %% %MODNUM%) + %ADDNUM%)" 
ECHO %COUNTER% MOD %MODNUM% PLUS %ADDNUM% IS %RESULT% 
SET /A "TOTAL=%TOTAL% + %RESULT%" 
IF %COUNTER%==100 
GOTO AVG 



:AVG 
ECHO. 
SET /A "AVERAGE=(%TOTAL%/100)" 
ECHO AVERAGE OF RESULTS IS %AVG% 
ECHO. 
@ECHO AVERAGE OF RESULTS IS %AVG% >> results.txt 
GOTO EXITLOOP 

:EXITLOOP 
PAUSE EXIT /B 
+1

请记住,一旦你完成这项工作,你的分割结果将仍然限于整数。 'cmd'没有任何处理小数值的方法,所以它们被舍入到最接近的整数。在'cmd'窗口中尝试:'set/a results = 3/4' –

+0

整个数字都是我需要的这个程序的全部数据,但是为了将来的参考,我将如何得到小数值? – javaGuy123456

+0

请尝试在这里:http://stackoverflow.com/questions/18689450/decimals-in-batch-script –

没有尝试它自己,它看起来像一旦你到:从AVG:一个循环中,则分为:EXITLOOP,其退出一批。

+1

问题不是他得到exitloop,而是他的代码错误出来之前,它甚至达到。 –

在使用它之前,您没有设置%loop%。

C:\Users\me>SET /A "RESULT=((% 5) + 3)" 
Missing operand. 

这意味着,3线后你会得到一个语法错误:

IF %LOOP%==100 

该炸弹,因为

IF ==100 

是无效的语法。

您是不是想要使用%COUNTER%而不是%LOOP%?
调试时,删除您的'cls'命令,以便您可以看到您的错误。
您也可以从cmd.exe窗口运行脚本,然后脚本结束时输出不会消失。
如果您%COUNTER%取代%LOOP%的两个实例,然后再修复语法错误,那里的

IF %COUNTER%==100 

之间的换行符
GOTO AVG 

那么至少它完成没有错误。我会让你确定它是否正常工作。

+0

我刚才意识到我有变量循环而不是计数器,那会是问题吗? – javaGuy123456

+0

好的,谢谢我只是改变了它,但是当我到达循环,出现“按任意键继续”,我按下回车键,它闪过一个屏幕,并消失 – javaGuy123456

+0

你是否还把'IF%COUNTER%== 100'和'GOTO AVG'在同一行上,所以你得到一行看起来像这样的:'IF%COUNTER%== 100 GOTO AVG'? – LinuxDisciple

我会把你的逻辑检查为零高于你的逻辑检查55.除零比55检查更危险。在做任何事情之前,确保数据是有效的。

似乎也没有办法从AVG回来。之后它才会退出批处理文件。

+0

因为当第一个或第二个数字是55时,并不是真的有必要。 –

+0

可能没有必要,但最好先验证最危险的方案。尽管如此,他们真正的问题在于AVG标签缺乏回报。 – ManoDestra

+1

不,回报不是问题,但脚本确实真的被打破。他设置了错误的变量,他的循环不起作用,并且有一些语法错误,我在回答中详细介绍了这些错误。 –

你正在做一些错误的事情。

首先,你设置了一个名为平均值,而不是AVG变量,所以AVG总是会为0。其次,你拼错师,你IF NOT %SECONDNUM%==55 GOTO DIVISON

而且,LinuxDisciple在他的回答中提到,批处理文件是逐行解释的,所以你不能在两个不同的行上使用if和goto。

最后,你有一些错误的逻辑。我想你想做到这一点:

@echo off 

@ECHO Carlos Deleon >> results.txt 
@ECHO %date% %time% >> results.txt 


:MAIN 
cls 

:FIRSTNUM 
ECHO. 
ECHO ENTER FIRST NUMBER 
SET /P FIRSTNUM=Enter a number and press ENTER : 
IF %FIRSTNUM%==55 GOTO FORLOOP 
GOTO SECONDNUM 

:SECONDNUM 
ECHO. 
ECHO ENTER SECOND NUMBER 
SET /P SECONDNUM=Type a different number and press enter : 
IF %SECONDNUM%==55 GOTO FORLOOP 
IF %SECONDNUM%==0 GOTO ASKAGAIN 
IF NOT %SECONDNUM%==55 GOTO DIVISION 
IF NOT %SECONDNUM%==0 GOTO DIVISION 

:ASKAGAIN 
ECHO. 
ECHO INVALID ENTRY, CANNOT DIVIDE BY ZERO, ENTER TWO NEW NUMBERS 
GOTO FIRSTNUM 

:DIVISION 
ECHO. 
SET /A RESULT=%FIRSTNUM%/%SECONDNUM% 
ECHO %FIRSTNUM% divided by %SECONDNUM% is %RESULT% 
@ECHO %FIRSTNUM% divided by %SECONDNUM% is %RESULT% >> results.txt 
GOTO FIRSTNUM 

:FORLOOP 
cls 
PAUSE 

SET COUNTER=0 
SET MODNUM=5 
SET ADDNUM=3 
SET RESULT=0 
SET TOTAL=0 
SET AVG=0 
GOTO LOOP 

:LOOP 
SET /A COUNTER=COUNTER+1 
SET /A "RESULT=((%COUNTER% %% %MODNUM%) + %ADDNUM%)" 
ECHO %COUNTER% MOD %MODNUM% PLUS %ADDNUM% IS %RESULT% 
SET /A "TOTAL=%TOTAL% + %RESULT%" 
IF %COUNTER% lss 100 GOTO LOOP 



:AVG 
ECHO. 
ECHO %TOTAL% 
SET /A "AVG=(%TOTAL%/100)" 
ECHO AVERAGE OF RESULTS IS %AVG% 
ECHO. 
@ECHO AVERAGE OF RESULTS IS %AVG% >> results.txt 
GOTO EXITLOOP 

:EXITLOOP 
PAUSE EXIT /B 

注意,如果LSS意味着它不断循环,而计数器小于100,这是你想要什么,如果计数器是不是仅仅循环已经有100