Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 编译器赢得';除非我打印变量,否则不要计算变量”&引用;_Fortran_Fortran90 - Fatal编程技术网

Fortran 编译器赢得';除非我打印变量,否则不要计算变量”&引用;

Fortran 编译器赢得';除非我打印变量,否则不要计算变量”&引用;,fortran,fortran90,Fortran,Fortran90,显然,根据我是否告诉程序打印变量i,我得到的结果不同,这与我是否打印变量i无关 PROGRAM hello IMPLICIT NONE integer :: n,i, mini logical :: leave = .false. read*, n print*, is_prime(n) !!--------------------------------------------------------------------- do i=n, n/2, -1 print*,

显然,根据我是否告诉程序打印变量i,我得到的结果不同,这与我是否打印变量i无关

 PROGRAM hello
IMPLICIT NONE
integer :: n,i, mini
logical :: leave = .false.
read*, n
print*, is_prime(n)   

!!---------------------------------------------------------------------

do i=n, n/2, -1
    print*, "I= ", i                !!if you comment out this line, the result will be different than if you were to keep it, try it out yourselves
    if(is_prime(i)) then
        mini = i
    end if
end do

print*, "the lowest prime number between your number and its half is: ", mini

!!----------------------------------------------------------

CONTAINS

logical function is_prime(n)
    integer::n,i

    do i=2,n
        if(mod(n,i) == 0 .and. (i/=1 .and. i/=n) ) then
            is_prime = .false.
        elseif(mod(n,i) /=0 .and. i == n-1 .and. is_prime .neqv. .false.) then
            is_prime = .true.
        end if
    end do
    return
end function
END PROGRAM
因此,如果你要评论我指出的那句话,“mini”的结果将不同于我说过的保留它的结果。 我对fortran相当陌生,所以我不知道我是否做错了什么,或者这是否与编译器有关,但对我来说,放一个print*,行无论如何都会改变variabe的值,这似乎真的很奇怪

例如,如果您自己尝试,当打印行在中时,mini的输出是,例如,输入48是29,这是正确的,它是48到ts一半之间的最小素数,但是当您输入48并且著名的打印行被注释掉时,输出将是-2,而不是29。
你们知道为什么会这样吗

弗朗西斯卡勒斯是对的,
的逻辑是错误的

您可以通过检查程序的第一个结果(打印*,
is_prime(n)
)来判断

下面,带有正确
的版本是\u prime
。当测试为真时,我首先将
.true.
分配给结果,并将其无效化为
.false.

PROGRAM hello
  IMPLICIT NONE
  integer :: n,i, mini

  read*, n
  print*, is_prime(n)

!!---------------------------------------------------------------------

  do i=n, n/2, -1
     print*, "I= ", i
     if(is_prime(i)) then
        mini = i
     end if
  end do

  print*, "the lowest prime number between your number and its half is: ", mini

!!----------------------------------------------------------

CONTAINS

  logical function is_prime(n)
    integer, intent(in) :: n
    integer :: i

    is_prime = .true.
    do i=2,n
       if(mod(n,i) == 0 .and. (i/=1 .and. i/=n) ) then
          is_prime = .false.
       end if
    end do
  end function is_prime

END PROGRAM

编辑:我应该补充一点,受打印声明影响的问题不时出现。当它出现时,它指向代码逻辑中的一个缺陷,然后该缺陷对定义不清的结果变得敏感。

@francescalus是对的,
的逻辑是错误的

您可以通过检查程序的第一个结果(打印*,
is_prime(n)
)来判断

下面,带有正确
的版本是\u prime
。当测试为真时,我首先将
.true.
分配给结果,并将其无效化为
.false.

PROGRAM hello
  IMPLICIT NONE
  integer :: n,i, mini

  read*, n
  print*, is_prime(n)

!!---------------------------------------------------------------------

  do i=n, n/2, -1
     print*, "I= ", i
     if(is_prime(i)) then
        mini = i
     end if
  end do

  print*, "the lowest prime number between your number and its half is: ", mini

!!----------------------------------------------------------

CONTAINS

  logical function is_prime(n)
    integer, intent(in) :: n
    integer :: i

    is_prime = .true.
    do i=2,n
       if(mod(n,i) == 0 .and. (i/=1 .and. i/=n) ) then
          is_prime = .false.
       end if
    end do
  end function is_prime

END PROGRAM

编辑:我应该补充一点,受打印声明影响的问题不时出现。当它出现时,它指向代码逻辑中的一个缺陷,然后对定义不清的结果变得敏感。

你说得对,弗朗西斯,刚刚编辑过,再次抱歉你说得对,弗朗西斯,刚刚编辑过,再次抱歉