If statement Do循环忽略if语句

If statement Do循环忽略if语句,if-statement,fortran,do-loops,If Statement,Fortran,Do Loops,我试图在do循环中使用if语句,它应该生成素数。为此,我使用了模来分类数字。在它找到一个素数之后,我希望它更进一步,添加1,以便可以找到下一个素数并将其添加到数组pzahl。我的问题是,循环似乎忽略了在找到素数之后,它应该进一步使用plauf,这样它就可以一直运行到无穷大。。。我试图重新排列循环和if语句的内容,但它就是不起作用。代码如下: PROGRAM Primzahlen IMPLICIT NONE INTEGER :: start, plauf, n, a INTE

我试图在do循环中使用if语句,它应该生成素数。为此,我使用了模来分类数字。在它找到一个素数之后,我希望它更进一步,添加1,以便可以找到下一个素数并将其添加到数组
pzahl
。我的问题是,循环似乎忽略了在找到素数之后,它应该进一步使用
plauf
,这样它就可以一直运行到无穷大。。。我试图重新排列循环和if语句的内容,但它就是不起作用。代码如下:

PROGRAM Primzahlen

   IMPLICIT NONE

   INTEGER :: start, plauf, n, a
   INTEGER, ALLOCATABLE, DIMENSION(:) :: pzahlen !array into which the  prime numbers should be added
   INTEGER :: input
   INTEGER, DIMENSION(:), ALLOCATABLE :: alle 

   PRINT *, "How many prime numbers should be listed"
   READ (*,*) input
   ALLOCATE (pzahlen(input))
   pzahlen(1) = 1 
   start = 2
   plauf = 1

 loop1: DO 

   ALLOCATE(alle(start))

    loop2: DO n = 1,start
       alle(n)= MODULO(start,n)
    END DO loop2

   IF (minval(alle) /= 0) THEN  ! This is what it seems to ignore.
    plauf= plauf + 1 
    pzahlen(plauf) = start
    PRINT *, plauf
   END IF

  start = start + 1

 IF (plauf == eingabe) then
    EXIT
 END IF
 PRINT *,  alle
 DEALLOCATE(alle)

END DO loop1

PRINT *, "prime numbers:" , pzahlen(1:input)

END PROGRAM Primzahlen 

我使用gfortran编译器,并在Emacs中编写它,如果这有助于了解情况的话。

它并没有忽略它,而是正确执行:

loop2: DO n = 1,start
   alle(n)= MODULO(start,n)
END DO loop2
无论什么是
start
alle(1)
都将始终为零,因为每个整数都可以被1整除。这意味着
minval(alle)
也将始终为零,这意味着条件
minval(alle)/=0
永远不会为真,语句也永远不会执行


添加:最后一个值,
alle(start)
,也将是零,因为每个数字本身都是可等分的。

它没有忽略它,而是正确执行:

loop2: DO n = 1,start
   alle(n)= MODULO(start,n)
END DO loop2
无论什么是
start
alle(1)
都将始终为零,因为每个整数都可以被1整除。这意味着
minval(alle)
也将始终为零,这意味着条件
minval(alle)/=0
永远不会为真,语句也永远不会执行


添加:最后一个值,
alle(start)
,也将是零,因为每个数字本身都是可等分的。

您不应该结束DO loop1吗?结束DO loop1在结尾处。但是我不完全确定我是否应该早点使用它。你不应该结束DO loop1吗?END DO loop1在结尾处。但是我不完全确定我是否应该早点使用它。谢谢你的提示!我已经改变了这一点,现在它至少起了一半作用。虽然它还不是完美的,但是在你的代码中有一些东西是不必要的。例如,您总是检查所有数字,而您可以在第一次匹配后停止。如果在到达目标的平方根之前还没有找到除数,可以停止,因为不会有更大的除数。我将向loop2添加一个if语句以避免出现这种情况。我刚开始学习Fortran,所以你能帮忙真是太好了:)谢谢你的提示!我已经改变了这一点,现在它至少起了一半作用。虽然它还不是完美的,但是在你的代码中有一些东西是不必要的。例如,您总是检查所有数字,而您可以在第一次匹配后停止。如果在到达目标的平方根之前还没有找到除数,可以停止,因为不会有更大的除数。我将向loop2添加一个if语句以避免出现这种情况。我刚开始学习Fortran,所以你能帮忙真是太好了:)