当我只运行摄氏度的代码时,我得到了下面的代码结果:
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
的值。
发布于 2019-02-21 22:12:13
您至少有三个问题:
5/9*(t-32)
的求值顺序是从左到右,因此5/9
部分是一个整数(截断)除法,始终生成0。零点与任何有限点的乘积是零。有几种方法可以解决这个问题,但更简单的方法之一是重写表达式,因为5 * (t - 32) / 9
.t
和celcius
是标量。他们每个人一次只持有一个号码。在您的第一个循环中,您将多个值按顺序分配给每个循环。当您稍后执行第二次循环以打印结果时,只能访问分配给每个变量的最后一个值。如果您必须将输出推迟到读取所有输入之后,那么处理它的一种方法是使t
和celcius
数组具有足够的大小,并将值存储在不同的元素中。(还要注意:英语单词的正确拼写是"celsius".)do
循环结束后,迭代变量的值是它在下一次循环迭代中的值(如果有的话)。因此,通过将变量n
同时用作迭代变量和上限,可以使每次循环后的值与以前不同。有几种方法可以解决这个问题,但我强烈建议您简单地避免重用n
作为迭代变量。避免有目的的迭代变量并不能提高效率。发布于 2019-02-22 04:19:23
您有几个选项。
程序温度!F C温度转换隐式无实数,可分配::华氏(:)整数::n打印*,‘输入行数’读取*,n分配(华氏(N))打印*,‘输入t的值:一行上的所有项目’读取*,华氏打印*,'F:',华氏打印*,'C:',fahrenheit_to_celcius(华氏)包含纯元素函数fahrenheit_to_celcius(t_f) fahrenheit_to_celcius(T_c) real,
程序温度!F C温度转换隐式无实数::华氏整数::i,n打印*,‘输入行数’读取*,n do i= 1,n打印*,‘输入t的值:每行一个',n读取*,华氏打印*,'F:’,华氏,'C:',fahrenheit_to_celcius(华氏) enddo包含纯元素函数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)和混合变量。
https://stackoverflow.com/questions/54808847
复制相似问题