仅运行摄氏温度代码时,我得到的结果低于代码:
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
的值。
答案 0 :(得分:1)
您至少有三个问题:
表达式5/9*(t-32)
是从左到右求值的,因此5/9
部分是 integer (截断)除法,总是产生0。与任何有限的零都为零。您可以通过多种方法解决此问题,但是更简单的方法之一就是将表达式重写为5 * (t - 32) / 9
。
您的变量t
和celcius
是标量。他们每次一次只持有一个号码。在第一个循环中,您将为其依次分配多个值。当您以后执行第二个循环以打印结果时,仅可访问分配给每个变量的最后一个值。如果必须将输出推迟到读取所有输入之后,则处理该问题的一种方法是制作t
和celcius
足够大的数组,并将值存储在不同的元素中。 (还要注意:英语单词的正确拼写是“摄氏”。)
在注释中的每个@albert中,在完成索引的do
循环后,如果存在,则迭代变量的值将是该变量在下一次循环中的值。因此,通过同时使用变量n
作为迭代变量和上限,使每个循环之后其值与之前不同。您可以通过多种方式解决此问题,但是我敦促您避免使用n
作为迭代变量。避免使用有目的的迭代变量无法提高效率。
答案 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
一次处理一个输入
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)和混合变量。