跳转到内容

Fortran/程序流程控制

来自维基教科书,开放的书籍,开放的世界


If-then(-else) 条件语句

[编辑 | 编辑源代码]

条件执行是使用以下结构中的ifthenelse 语句完成的

 if (logical_expression1) then
    ! Block of code
 else if (logical_expression2) then
    ! Block of code
 else
    ! Block of code
 end if

您可以根据需要添加任意数量的else if 语句。

在创建表达式时可以使用以下运算符

操作 现代 Fortran 旧 FORTRAN
小于 < .LT.
大于 > .GT.
大于或等于 >= .GE.
小于或等于 <= .LE.
等于 == .EQ.
不等于 /= .NE.
逻辑等价 .EQV.
逻辑不等价 .NEQV.
逻辑非 .NOT.
逻辑与 .AND.
逻辑或 .OR.

注意:Fortran 标准要求.EQ..NEQ. 不能与逻辑值一起使用,但某些编译器不会强制执行该标准

要检查多个语句,请使用括号。

if ((a .gt. b) .and. .not. (a .lt. c)) then

以下程序生成一个 0 到 1 之间的随机数,并测试它是否在 0 到 0.3、0.3 到 0.6 或 0.6 到 1.0 之间。

program xif
    implicit none
    real :: x
    real, parameter :: x1 = 0.3, x2 = 0.6

    call random_seed()
    call random_number(x)
    if (x < x1) then
        print *, x, "<",x1
    else if (x < x2) then
        print *, x, "<", x2
    else
        print *, x, ">=", x2
    end if
end program xif

IF 有两种有趣的古老形式

      IF (<logical_expression>) GOTO <statement_label>
      IF (<arithmetic_expression>) <first_label>, <second_label>, <third_label>

在第一种形式中,事情非常简单。在第二种形式中,将评估算术表达式。如果表达式计算结果为负数,则执行将从第一个行号继续。如果表达式计算结果为零,则执行将从第二个行号继续。否则,执行将从第三个行号继续。

case (switch)

[编辑 | 编辑源代码]
select case(...) case (...); ... end select

如果 if 块包含对单个变量的重复测试,则可以使用select case 结构来替换它。例如,以下代码

if (month=="January" .or. month=="December") then
    num_days = 31
else if (month=="February") then
    num_days = 28
else if (month=="March") then
    num_days = 31
else
    num_days = 30
end if

可以替换为

select case (month)
    case ("January", "December")
        num_days = 31
    case ("February")
        num_days = 28
    case ("March")
        num_days = 31
    case default
        num_days = 30
end select

Fortran 不需要 break 语句。

do i=1,10 ... end do

为了进行迭代,Fortran 有一个do 循环。以下循环打印 1 到 10 之间整数的平方

do i=1,10
    print *, i**2
end do

可以使用 exit 提早退出循环,如下面的代码所示,该代码打印整数的平方,直到其中一个平方超过 25。

do i=1,10
    isquare = i**2
    if (isquare > 25) exit
    print *, isquare
end do

循环可以嵌套。以下代码打印 1 到 10 之间整数的 2 到 4 次方

do i=1,10
    do ipower=1,3
        print *, i, ipower, i**ipower
    end do
end do

DO 的一种古老形式中,使用了循环结束的行号。以下是同一个循环,明确声明标签1 是每个循环的最后一行

      DO 1 i=1,10
          DO 1 ipower=1,3
              1 PRINT *, i, ipower, i**ipower

如果使用古老的形式,循环不能以IFGO TO 语句结束。您可以使用CONTINUE 语句作为1 标签的锚点。

在声明do 循环时,还有一个可选的增量参数。以下将以 2 为单位递增。2、4、6、...

do i=2,10,2
    write (*,*) i
end do

do 循环的参数不必是数字,它们可以是程序中其他地方定义的任何整数。firstlastincrement 可以是任何变量名。

do i=first,last,increment
    ! Code goes here
end do

简单语句

[编辑 | 编辑源代码]

goto statement_label 将跳转到指定的语句编号。

stop exit_code 将使用指定的条件代码或退出代码停止。stop 可以不带参数编码。请注意,在许多系统中,stop 0 仍然是失败。还要注意,在 Fortran 2008 之前,条件代码必须是常量表达式,而不是变量。

exit 将离开循环。

continue 可用于在古老的DO 循环中结束循环,否则循环将在IF 上结束。

cycle 将程序控制转移到下一个end do 语句。

return 离开子程序或函数。

华夏公益教科书