今天拜读彭国伦老师的经典著作《Fortran95程序设计》一书,偶然发现第十一章中ex1108.F90有点小错误,在这里指出来,供后面阅读的朋友借鉴。 首先要说是著书立学是一件很不容易的事情,任何一本书都难免会有失误(据说《毛泽东语录》没有失误)。彭国伦老师的《Fortran95程序设计》一书作为Fortran初学者入门必读的经典著作,指引我进入Fortran语言的殿堂,可谓是我的启蒙老师,对于她的价值,我是持完全肯定的。无论现在还是将来我都会认为她是一本难得的经典著作。 其次,感谢群主---臭石头雪球大哥对我的支持,对你的Fortran编程水平我一直是很膜拜的,但是最难能可贵的是你一直不厌其烦的回答群友的问题,让我在Fcode中找到了难得的归属感,当然对于群中可爱的群友们在这里也一并表示感谢了。 下面开始正文,彭书331页、EX1108.F90是一个实现:自定义时间类型;完成自定义时间类型与实数相加;实数与自定义时间类型相加;时间类型之间互相比较大小的程序。出问题的地方在于时间类型互相比较大小时的子程序,原程序如下所示: [Fortran] 纯文本查看 复制代码 logical functiontime_lt_time( a, b )
implicit none
type(time), intent(in) :: a,b
if (a%hour < b%hour ) then
time_lt_time = .true.
return
end if
if (a%minute < b%minute ) then
time_lt_time = .true.
return
end if
time_lt_time = .false.
return
end function 按照主程序中输入的变量值 [Fortran] 纯文本查看 复制代码 a=0.5 ! a =time(0,30)
b=0.1+a ! b = time(0,36)
write(*,*)a<b
按照书上的数据程序可以得到正确的结果,但是子程序中隐含着一个错误,先让我们来看看子程序是怎么工作的,进而来指出这个错误: 走上来是先判定a变量的小时数是否小于b变量的小时数,成立则time_lt_time为T,判断结束,否则(a%hour>=b%hour)进入第二个if判断,a的分钟数是否小于b的分钟数,如果a的分钟数小于b的分钟数则time_lt_time = .true.结束第二个if判断。至此细心的你是不是发现问题的所在了那?执行第二个if判断的前提是a%hour>=b%hour,此时如果我的a%hour>b%hour,结果应该是已经确定的了,time_lt_time = .False.第二个if本就不必再执行,而且若是a%minute<b%minute则原程序第二个if判断会给出错误的结果。因此这个子程序并不能正确的完成比较大小的任务。 建议修改为: [Fortran] 纯文本查看 复制代码 logical functiontime_lt_time( a, b )
implicit none
type(time), intent(in) :: a,b
if (a%hour < b%hour ) then
time_lt_time = .true.
return
end if
if ( a%hour==b%hour.and.a%minute < b%minute ) then
time_lt_time = .true.
return
end if
time_lt_time =.false.
return
end function
即在第二个if判断条件中加入条件a%hour==b%hour,经测试修改后的程序可以正确的实现判断功能。
|