Fortran do循环不计算输入的变量

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

当我运行Celsius的代码时,我得到的结果是代码:

    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计算中的值。

提问于
用户回答回答于

你有几个选择。

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

用户回答回答于

你有两个问题:

  1. 表达式5/9*(t-32)从左到右进行求值,因此该5/9部分是一个整数(截断)除法,始终产生0.零和任何有限的乘积为零。有几种方法可以解决这个问题,但更简单的方法之一就是将表达式重写为5 * (t - 32) / 9
  2. 你的变量tcelcius标量。它们每次只能保留一个数字。在第一个循环中,您可以按顺序为每个循环分配多个值。稍后执行第二个循环以打印结果时,只能访问分配给每个变量的最后一个值。如果必须延迟输出,直到读取所有的输入,然后处理的一种方式后,将是使tcelcius足够大小的数组,并存储在不同的元素你的价值观。(另请注意:英文单词的正确拼写是“摄氏”。)

扫码关注云+社区

领取腾讯云代金券