Fortran循环不计算输入的变量

时间:2019-02-21 14:01:18

标签: fortran do-loops

仅运行摄氏温度代码时,我得到的结果低于代码:

    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 :(得分:1)

您至少有三个问题:

  1. 表达式5/9*(t-32)是从左到右求值的,因此5/9部分是 integer (截断)除法,总是产生0。与任何有限的零都为零。您可以通过多种方法解决此问题,但是更简单的方法之一就是将表达式重写为5 * (t - 32) / 9

  2. 您的变量tcelcius是标量。他们每次一次只持有一个号码。在第一个循环中,您将为其依次分配多个值。当您以后执行第二个循环以打印结果时,仅可访问分配给每个变量的最后一个值。如果必须将输出推迟到读取所有输入之后,则处理该问题的一种方法是制作tcelcius足够大的数组,并将值存储在不同的元素中。 (还要注意:英语单词的正确拼写是“摄氏”。)

  3. 在注释中的每个@albert中,在完成索引的do循环后,如果存在,则迭代变量的值将是该变量在下一次循环中的值。因此,通过同时使用变量n作为迭代变量和上限,使每个循环之后其值与之前不同。您可以通过多种方式解决此问题,但是我敦促您避免使用n作为迭代变量。避免使用有目的的迭代变量无法提高效率。

答案 1 :(得分:1)

您有几种选择。

  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)和混合变量。