跳转至内容

Fortran/程序流程控制

来自维基教科书,开放的书籍,开放的世界
(从 Fortran/Fortran control 重定向)


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 将离开子程序或函数。

华夏公益教科书