Повторное выполнение операторов в Fortran 95

Извините за нубский вопрос, но мне нужна помощь в выяснении того, как вернуть выполнение обратно к началу подпрограммы после завершения логического блока, проверяющего ввод пользователя.

Program FibSequence 
Integer(2) :: n_terms
print*, "Please Enter number 0-99"
read*,n_terms
call check_term()
End Program
Subroutine check_term()

if n_terms <= 0 then 
!print stuff
read*, n_terms
return
else if n_terms > 99 then
!print stuff
read*, n_terms
return
else
print*, "you have chosen " , n_terms
end

Программа выполняется успешно, но не делает того, что должна делать.

Я подозреваю, что программа вводит проверку тогда, когда она это делает, если число выбрано неправильно, так что число > 99 или ‹= 0, тогда оно «перечитывает» n_terms для пользовательского ввода, а затем возвращает выполнение в основную программу, что приводит к в завершении программы.

Результатом должно быть то, что когда число выбрано неправильно, подпрограмма запускается полностью СНОВА вместо перехода к следующей строке выполнения из основной, что было бы концом программы.

Помощь будет оценена спасибо!


person HRD1997BFBE    schedule 18.06.2020    source источник
comment
Почему вы ожидаете, что он снова запустится? Вы ничего не сделали, чтобы он снова заработал. Вам нужно вызвать его в цикле, и вам нужно check_term(), чтобы указать успех или неудачу, чтобы вы знали, когда выйти из цикла.   -  person Carey Gregory    schedule 18.06.2020
comment
@CareyGregory Это хорошее наблюдение, мои извинения за вопрос новичка, лол   -  person HRD1997BFBE    schedule 19.06.2020


Ответы (1)


Должна быть возможность использовать альтернативный возврат, но альтернативный возврат находится в списке устаревших функций. Возможно, самый простой способ добиться того, что вы хотите сделать, — это использовать бесконечный цикл DO, который завершается при правильном вводе.

Program FibSequence 
  Integer(2) :: n_terms   ! Note, non-portable kind type parameter
  print*, "Please Enter number 0-99"
  do
     read*,n_terms
     if (n_terms > -1 .and. n_terms < 100) exit
  end do
  ! Do something with n_terms.
End Program
person evets    schedule 18.06.2020
comment
Элегантно и точно, если я хочу сохранить подпрограмму, должен ли я вложить проверку в подпрограмму или она должна существовать в main() программы? - person HRD1997BFBE; 19.06.2020
comment
Конечно, вы можете переместить цикл DO в подпрограмму. Обратите внимание, что приглашение печатается только один раз. - person evets; 19.06.2020
comment
Круто, GOTO тоже устарел? - person HRD1997BFBE; 19.06.2020
comment
GOTO по-прежнему является частью языка. Некоторые здесь, в SO, не одобряют его использование, потому что слышали, что кто-то однажды написал статью, в которой утверждалось, что GOTO плохой. - person evets; 19.06.2020
comment
Да, goto устарело :-) Есть очень мало случаев, когда это лучший оператор для использования, и много-много случаев, когда он имеет тенденцию к коду, который трудно понять человеку. - person High Performance Mark; 19.06.2020