Fortran过程 - Fortran教程
过程是一组执行一个明确定义的任务,可以从程序调用语句。信息(或数据)被传递给调用程序,以过程作为参数。
有两种类型的程序:
- 函数
- 子程序
函数
函数是返回一个数量的过程。函数不修改其参数。
返回数值被称为函数值,并将其表示为函数名。
语法:
函数的语法如下:
function name(arg1, arg2, ....)
[declarations, including those for the arguments]
[executable statements]
end function [name]
下面的示例演示一个函数名为area_of_circle。它计算半径为 r 的圆的面积。
program calling_func
real :: a
a = area_of_circle(2.0)
Print *, "The area of a circle with radius 2.0 is"
Print *, a
end program calling_func
! this function computes the area of a circle with radius r
function area_of_circle (r)
! function result
implicit none
! dummy arguments
real :: area_of_circle
! local variables
real :: r
real :: pi
pi = 4 * atan (1.0)
area_of_circle = pi * r**2
end function area_of_circle
当编译并执行上述程序,它会产生以下结果:
The area of a circle with radius 2.0 is
12.5663710
请注意:
必须指定隐含都不在这两个在主程序和过程中。
在被调用函数的参数r被称为 dummy argument.
结果选项
如果想返回的值存储在函数名的其他名称,则可以使用result选项。
可以根据指定返回变量名:
function name(arg1, arg2, ....) result (return_var_name)
[declarations, including those for the arguments]
[executable statements]
end function [name]
子程序
子程序没有返回值,但可以修改其参数。
语法
subroutine name(arg1, arg2, ....)
[declarations, including those for the arguments]
[executable statements]
end subroutine [name]
调用子程序
需要使用call语句来调用一个子程序。
下面的例子演示了一个子程序交换,改变其参数值的定义和使用。
program calling_func
implicit none
real :: a, b
a = 2.0
b = 3.0
Print *, "Before calling swap"
Print *, "a = ", a
Print *, "b = ", b
call swap(a, b)
Print *, "After calling swap"
Print *, "a = ", a
Print *, "b = ", b
end program calling_func
subroutine swap(x, y)
implicit none
real :: x, y, temp
temp = x
x = y
y = temp
end subroutine swap
当编译并执行上述程序,它会产生以下结果:
Before calling swap
a = 2.00000000
b = 3.00000000
After calling swap
a = 3.00000000
b = 2.00000000
指定参数的意图
意图属性允许指定与参数的过程中使用的意向。下表提供intent属性的值:
值 | 使用为 | 解释 |
---|---|---|
in | intent(in) | 用作输入值,而不是在函数中改变 |
out | intent(out) | 用作输出值,它们将被覆盖 |
inout | intent(inout) | 参数都使用和覆盖 |
下面的例子演示了这一概念:
program calling_func
implicit none
real :: x, y, z, disc
x= 1.0
y = 5.0
z = 2.0
call intent_example(x, y, z, disc)
Print *, "The value of the discriminant is"
Print *, disc
end program calling_func
subroutine intent_example (a, b, c, d)
implicit none
! dummy arguments
real, intent (in) :: a
real, intent (in) :: b
real, intent (in) :: c
real, intent (out) :: d
d = b * b - 4.0 * a * c
end subroutine intent_example
当编译并执行上述程序,它会产生以下结果:
The value of the discriminant is
17.0000000
递归过程
递归发生在一个编程语言可以调用同一个函数在函数内。这就是所谓的函数的递归调用。
当一个过程调用本身,直接或间接地被称为递归过程。应该通过其声明之前的字前面递归声明这种类型的程序。
当一个函数被递归使用,则 result 选项要被使用。
以下是一个例子,它计算阶乘用于使用一个递归过程:
program calling_func
implicit none
integer :: i, f
i = 15
Print *, "The value of factorial 15 is"
f = myfactorial(15)
Print *, f
end program calling_func
! computes the factorial of n (n!)
recursive function myfactorial (n) result (fac)
! function result
implicit none
! dummy arguments
integer :: fac
integer, intent (in) :: n
select case (n)
case (0:1)
fac = 1
case default
fac = n * myfactorial (n-1)
end select
end function myfactorial
内部过程
当一个过程被包含在程序中,它被称为程序的内部程序。包含一个内部程序的语法如下:
program program_name
implicit none
! type declaration statements
! executable statements
. . .
contains
! internal procedures
. . .
end program program_name
下面的例子演示了这一概念:
program mainprog
implicit none
real :: a, b
a = 2.0
b = 3.0
Print *, "Before calling swap"
Print *, "a = ", a
Print *, "b = ", b
call swap(a, b)
Print *, "After calling swap"
Print *, "a = ", a
Print *, "b = ", b
contains
subroutine swap(x, y)
real :: x, y, temp
temp = x
x = y
y = temp
end subroutine swap
end program mainprog
当编译并执行上述程序,它会产生以下结果:
Before calling swap
a = 2.00000000
b = 3.00000000
After calling swap
a = 3.00000000
b = 2.00000000