Fortran 程序

程序是一组执行明确任务的语句,可以从程序中调用。信息(或数据)作为参数传递给调用程序。

有两种类型的程序:

  • Functions
  • Subroutines

函数

函数是一个返回单个数量的过程。函数不应修改其参数。

返回的数量称为函数值,由函数名表示。

语法
  1. function name(arg1, arg2, ....)
  2. [declarations, including those for the arguments]
  3. [executable statements]
  4. end function [name]

以下实例演示了一个名为 area_of_circle 的函数,它计算半径为 r 的圆的面积:

  1. program calling_func
  2. real :: a
  3. a = area_of_circle(2.0)
  4. Print *, "The area of a circle with radius 2.0 is"
  5. Print *, a
  6. end program calling_func
  7. ! this function computes the area of a circle with radius r
  8. function area_of_circle (r)
  9. ! function result
  10. implicit none
  11. ! dummy arguments
  12. real :: area_of_circle
  13. ! local variables
  14. real :: r
  15. real :: pi
  16. pi = 4 * atan (1.0)
  17. area_of_circle = pi * r**2
  18. end function area_of_circle

结果为:

  1. The area of a circle with radius 2.0 is
  2. 12.5663710
注意
  • 您必须在主程序和过程中都指定隐式 none
  • 被调用函数中的参数 r 称为伪参数。
结果选项

如果希望将返回值存储在函数名以外的其他名称中,可以使用 result 选项。

您可以将返回变量名称指定为:

  1. function name(arg1, arg2, ....) result (return_var_name)
  2. [declarations, including those for the arguments]
  3. [executable statements]
  4. end function [name]

子程序

子程序不返回值,但可以修改其参数。

语法
  1. subroutine name(arg1, arg2, ....)
  2. [declarations, including those for the arguments]
  3. [executable statements]
  4. end subroutine [name]
调用子程序

您需要使用 call 语句调用子程序。

以下实例演示了更改其参数值的子程序交换的定义和使用。

  1. program calling_func
  2. implicit none
  3. real :: a, b
  4. a = 2.0
  5. b = 3.0
  6. Print *, "Before calling swap"
  7. Print *, "a = ", a
  8. Print *, "b = ", b
  9. call swap(a, b)
  10. Print *, "After calling swap"
  11. Print *, "a = ", a
  12. Print *, "b = ", b
  13. end program calling_func
  14. subroutine swap(x, y)
  15. implicit none
  16. real :: x, y, temp
  17. temp = x
  18. x = y
  19. y = temp
  20. end subroutine swap

结果为:

  1. Before calling swap
  2. a = 2.00000000
  3. b = 3.00000000
  4. After calling swap
  5. a = 3.00000000
  6. b = 2.00000000

指定参数的 intent 属性

intent 属性让您可以指定在过程中使用参数的意图。下表提供了 intent 属性的值:

使用说明
inintent(in)用作输入值,不在函数中更改
outintent(out)用作输出值时,它们会被覆盖
inoutintent(inout)参数既被使用又被覆盖

比如下面的实例:

  1. program calling_func
  2. implicit none
  3. real :: x, y, z, disc
  4. x = 1.0
  5. y = 5.0
  6. z = 2.0
  7. call intent_example(x, y, z, disc)
  8. Print *, "The value of the discriminant is"
  9. Print *, disc
  10. end program calling_func
  11. subroutine intent_example (a, b, c, d)
  12. implicit none
  13. ! dummy arguments
  14. real, intent (in) :: a
  15. real, intent (in) :: b
  16. real, intent (in) :: c
  17. real, intent (out) :: d
  18. d = b * b - 4.0 * a * c
  19. end subroutine intent_example

结果为:

  1. The value of the discriminant is
  2. 17.0000000

递归程序

当编程语言允许您调用同一函数内的函数时,就会发生递归。这被称为函数的递归调用。

当一个过程直接或间接地调用自身时,称为递归过程。您应该在声明递归一词之前声明这类过程。

当递归使用函数时,必须使用 result 选项。

以下是一个实例,它使用递归过程计算给定数字的阶乘:

  1. program calling_func
  2. implicit none
  3. integer :: i, f
  4. i = 15
  5. Print *, "The value of factorial 15 is"
  6. f = myfactorial(15)
  7. Print *, f
  8. end program calling_func
  9. ! computes the factorial of n (n!)
  10. recursive function myfactorial (n) result (fac)
  11. ! function result
  12. implicit none
  13. ! dummy arguments
  14. integer :: fac
  15. integer, intent (in) :: n
  16. select case (n)
  17. case (0:1)
  18. fac = 1
  19. case default
  20. fac = n * myfactorial (n-1)
  21. end select
  22. end function myfactorial

内部程序

当程序中包含一个程序时,它被称为程序的内部程序。包含内部程序的语法如下:

  1. program program_name
  2. implicit none
  3. ! type declaration statements
  4. ! executable statements
  5. . . .
  6. contains
  7. ! internal procedures
  8. . . .
  9. end program program_name

实例如下:

  1. program mainprog
  2. implicit none
  3. real :: a, b
  4. a = 2.0
  5. b = 3.0
  6. Print *, "Before calling swap"
  7. Print *, "a = ", a
  8. Print *, "b = ", b
  9. call swap(a, b)
  10. Print *, "After calling swap"
  11. Print *, "a = ", a
  12. Print *, "b = ", b
  13. contains
  14. subroutine swap(x, y)
  15. real :: x, y, temp
  16. temp = x
  17. x = y
  18. y = temp
  19. end subroutine swap
  20. end program mainprog

结果如下:

  1. Before calling swap
  2. a = 2.00000000
  3. b = 3.00000000
  4. After calling swap
  5. a = 3.00000000
  6. b = 2.00000000

分类导航