Компилятор не будет вычислять переменную, пока я не напечатаю его "" - PullRequest
0 голосов
/ 23 декабря 2018

Так что, очевидно, в зависимости от того, скажу ли я программе напечатать переменную 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

Таким образом, если вы закомментируете строку, которую я указал, результат «мини» будет другим, чем если бы вы его сохранили, как я уже сказал.Я довольно новичок в Фортране, поэтому я не знаю, делаю ли я что-то не так, или если это как-то связано с компилятором, но мне кажется странным, что установка строки print * в любом случаеизмените значение переменной, и это то, что, по-видимому, происходит.

Например, если вы попробуете это сами, вывод mini, когда строка печати находится, например, набирает 48, равен 29, что верно, это минимальное простое число от 48 до половины, но когда вы наберете 48 и прокомментируете знаменитую строку печати, результат будет -2 вместо 29. Кто-нибудь из вас знает, почему это происходит?

1 Ответ

0 голосов
/ 23 декабря 2018

@ francescalus прав, логика is_prime неверна.

Вы можете узнать, проверив первый результат (print *, is_prime(n)) программы.

Ниже,версия с правильным is_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

РЕДАКТИРОВАТЬ: я должен добавить, что проблема с влиянием оператора печати возникает со временемко времени.Когда он возникает, он указывает на ошибку в логике кода, которая затем становится чувствительной к ситуациям с плохо определенными результатами.

...