Цикл Fortran do не вычисляет введенную переменную - PullRequest
0 голосов
/ 21 февраля 2019

Когда я запускаю код только по Цельсию, я получаю результат под кодом:

    program temperature
! F C temperature conversion
implicit none
real :: celcius=0.0, fahrenheit=0.0

integer:: t,n
print *,'enter the number of lines'
read*, n
do n=1,n
print*,'enter the  value of t: one per line',n
read*, t
celcius=5/9*(t-32)

enddo
do n=1,n
print*, t, celcius
enddo
end program

результат

    enter the number of lines
3
 enter the  value of t: one per line           1
50
 enter the  value of t: one per line           2
20
 enter the  value of t: one per line           3
10
          10   0.00000000E+00
          10   0.00000000E+00
          10   0.00000000E+00
          10   0.00000000E+00

Ясно, что компилятор не выбирает значение t в расчете.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

У вас есть несколько вариантов.

  1. Сохранить входные данные в массиве и обработать массив.

    program temperature
      ! F C temperature conversion
      implicit none
    
      real, allocatable :: fahrenheit(:)
      integer:: n
    
      print *,'enter the number of lines'
      read*, n
      allocate(fahrenheit(n))
      print*,'enter the  value of t: all items on one line'
      read*, fahrenheit
      print *, 'F: ', fahrenheit
      print *, 'C:', fahrenheit_to_celcius(fahrenheit)
    
    contains
    
      pure elemental function fahrenheit_to_celcius(t_f) result(t_c)
        real, intent(in) :: t_f
        real :: t_c
    
        t_c = 5.*(t_f-32.)/9.
    
      end function fahrenheit_to_celcius
    
    end program
    
  2. Обработать входные данные одинза один раз

    program temperature
      ! F C temperature conversion
      implicit none
    
      real :: fahrenheit
      integer:: i, n
    
      print *,'enter the number of lines'
      read*, n
    
      do i = 1, n
         print*,'enter the  value of t: one per line',n
         read*, fahrenheit
         print *, 'F: ', fahrenheit, 'C:', fahrenheit_to_celcius(fahrenheit)
      enddo
    
    contains
    
      pure elemental function fahrenheit_to_celcius(t_f) result(t_c)
        real, intent(in) :: t_f
        real :: t_c
    
        t_c = 5.*(t_f-32.)/9.
    
      end function fahrenheit_to_celcius
    
    end program
    

Обратите внимание, что я использовал ключевое слово elemental для функции.Это означает, что вы можете передать как скаляр, так и массив.Это хорошее решение для прямых вычислений, таких как здесь: подпрограмма fahrenheit_to_celcius идентична в обоих случаях.

Я исправил 5/9 (который возвращает 0) и перепутанные переменные.

0 голосов
/ 21 февраля 2019

У вас есть как минимум три проблемы:

  1. Выражение 5/9*(t-32) вычисляется слева направо, поэтому часть 5/9 представляет собой целое число (усеченное) деление, всегда производящее 0. Произведение нуля на все конечное равно нулю.Есть несколько способов решить эту проблему, но одним из более простых будет переписать выражения как 5 * (t - 32) / 9.

  2. Ваши переменные t и celcius являются скалярами.Они держат только один номер за раз каждый.В вашем первом цикле вы присваиваете несколько значений каждому из них по очереди.При последующем выполнении второго цикла для печати результатов будет доступно только последнее значение, назначенное каждой переменной.Если вы должны отложить вывод до тех пор, пока не прочтете все входные данные, то одним из способов справиться с этим будет создание массивов t и celcius достаточного размера и сохранение ваших значений в разных элементах.(Также обратите внимание: правильное написание английского слова - «по Цельсию».)

  3. За @albert в комментариях, после того как индексированный цикл do завершится, значение переменной итерацииэто то, что было бы в следующей итерации цикла, если бы он был.Поэтому, используя переменную n в качестве итерационной переменной и вашей верхней границы, вы заставляете ее значение после каждого цикла отличаться от того, что было раньше.Есть несколько способов решить эту проблему, но я призываю вас просто избегать повторного использования n в качестве переменной итерации.Нельзя добиться эффективности, избегая специальной итерационной переменной.

...