替换.or。在for循环中使用if的语句

时间:2015-02-21 15:33:16

标签: fortran fortran90

我正在尝试用.or.循环中的if语句替换do语句。但是当使用第二种方法时,我没有在第一种方法中得到结果。 我在这里做错了吗?

do j =1,115
   if (positions(i,1) .eq. j) .or. positions(i,2) .eq. j)then
    write(24,201) 47, atoms(j,2),atoms(j,3),atoms(j,4)
   endif
enddo


do j =1,115
 do m =1,2
   if (int(positions(i,m)) .eq. j)then
    write(24,201) 47, atoms(j,2),atoms(j,3),atoms(j,4)
   endif
 enddo
enddo

1 个答案:

答案 0 :(得分:1)

您提供的两个陈述在逻辑上是不同的(忽略仅在第二种情况下发生的转换为int):

  • 在第一个代码段中,如果第一个或第二个条件为真,则打印一行,从而产生一行输出或无。

  • 在第二种情况下,您执行两次检查,每次检查可以打印到单位24。如果两个条件均为真,则会得到两行输出行。

如果您想简化第一个语句,您可以例如使用any

do j=1,115
  if ( any(positions(j,1:2) == j) ) then
    write(24,201) 47, atoms(j,2),atoms(j,3),atoms(j,4)
  endif
enddo

请注意,我使用循环计数器i替换了循环中的j,因为没有迹象表明可以定义i。当然,这是纯粹的猜测。