2016-03-21 40 views
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 –

回答

0

沒有嘗試它自己,它看起來像一旦你到:從AVG:一個循環中,則分爲:EXITLOOP,其退出一批。

+1

問題不是他得到exitloop,而是他的代碼錯誤出來之前,它甚至達到。 –

0

在使用它之前,您沒有設置%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

0

我會把你的邏輯檢查爲零高於你的邏輯檢查55.除零比55檢查更危險。在做任何事情之前,確保數據是有效的。

似乎也沒有辦法從AVG回來。之後它纔會退出批處理文件。

+0

因爲當第一個或第二個數字是55時,並不是真的有必要。 –

+0

可能沒有必要,但最好先驗證最危險的方案。儘管如此,他們真正的問題在於AVG標籤缺乏回報。 – ManoDestra

+1

不,回報不是問題,但腳本確實真的被打破。他設置了錯誤的變量,他的循環不起作用,並且有一些語法錯誤,我在回答中詳細介紹了這些錯誤。 –

0

你正在做一些錯誤的事情。

首先,你設置了一個名爲平均值,而不是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