2015-10-27 118 views
0

我不知道发生了什么事的批处理脚本关闭几乎immediantly当我尝试运行它。它很简单,它应该测试一个数字(num)是否是素数。如果不是,则持续到num1大于num未知的批处理脚本错误

echo off 
title Prime Numbers 
cls 
set /a prime=7 
set /a num1=2 
set /a num2=2 
:do1 
if %prime% == %num1% * %num2% goto do_if_1 
if else %prime% LSS %num1% * %num2% set /a num2=%num2%+1 
if else %prime% GTR %num1% * %num2% goto do_if_2 
if else %prime% LSS %num1% * 1 goto do_if_3 
goto do1 
:do_if_1 
set /a prime=%prime%+1 
set /a num1=2 
set /a num2=2 
goto do1 
:do_if_2 
set /a num1=%num1%+1 
set /a num2=2 
goto do2 
:do_if_3 
echo %prime% 
goto do_if_1 
+1

你不能在IF语句中做数学运算。你只能用SET/A进行算术运算。这不是IF ELSE语句的正确语法。阅读SET和IF命令的帮助。 – Squashman

回答

1

想我可能会接受挑战。

@echo off 
setlocal enabledelayedexpansion 

if "%~1"=="" goto usage 
for /f "delims=" %%I in ("%~1") do goto usage 

set /a limit = %~1 - 1 

for /L %%I in (2,1,%limit%) do (
    set /a modulo = %~1 %% %%I 
    if !modulo! equ 0 (
     echo %~1 is composite ^(divisible by %%I^). 
     goto :EOF 
    ) 
) 

echo %~1 is prime. 
goto :EOF 

:usage 
echo Usage: %~nx0 integer 

你下了多米尼克的回答说:“那我怎么解决这个问题?”把你的脚本的第一部分:

set /a prime=7 
set /a num1=2 
set /a num2=2 
:do1 
if %prime% == %num1% * %num2% goto do_if_1 

既然你已经被这两个Squashman和自己,if %prime% == %num1% * %num2%是行不通的,你打算,现在你应该知道,你需要插入额外的set /a上述通知您的if声明执行%num1% * %num2%

set /a prime=7 
set /a num1=2 
set /a num2=2 
:do1 
set /a product = num1 * num2 
if %prime% == %product% goto do_if_1 

让我们继续......

... 
if %prime% == %product% goto do_if_1 
if else %prime% LSS %num1% * %num2% set /a num2=%num2%+1 

这里有两个直接的问题。 #1,我想你可能是指else if,不if else。 #2,在批处理脚本,else需要包括作为if命令的一部分,你是else -ing。这意味着else或者需要追加到前一行的末尾,否则应该使用一些括号。重写它是这样的:

if %prime% == %product% (
    goto do_it_1 
) else if %prime% LSS %product% (
    set /a num2 += 1 
) else etc... 
+0

,那是我的批处理脚本是如何羞辱XD – TheGamerLord

+0

对不起时,我问他,我甚至没有注意到你的编辑抱歉,但thxs它是有用的 – TheGamerLord

+0

@TheGamerLord如果我的回答对您有所帮助,请考虑将其标记为接受,或者在最不起作用的。 [见本页](http://meta.stackexchange.com/questions/5234/)解释为什么这很重要。 – rojo

1

我劝你的第一件事情,就是要摆脱echo off的,这样你可以按照你的剧本是这样做的:

D:\>set /a prime=7 
D:\>set /a num1=2 
D:\>set /a num2=2 
D:\>if 7 == 2 * 2 goto do_if_1 
7 was unexpected at this time. => this is causing your problem! 
D:\>if else 7 LSS 2 * 2 set /a num2=2+1 
D:\> 
+0

7是如何意外的? – TheGamerLord

+0

这对我来说当然是一个惊喜。我认为多米尼克的主要观点是,负责解决的投掷错误的脚本的第一步是离开'echo'启用,所以你可以看到该脚本的一部分,是造成悲痛。在这种情况下,'if 7 == 2 * 2'不会引发错误,但它不会执行您认为的操作。如果脚本遇到'if else 7',则会引发错误。它将'else'视为字符串文字,而不是关键字。它的治疗'7'作为比较运营商,并抱怨'7'既不是''=='也不也不equ''gtr'也不了解任何其他操作。 – rojo

+0

那么我该如何解决这个问题?即使当我打开回声时,它也会让我无法真正阅读它所说的内容。 – TheGamerLord