Fortran - Thủ tục
A procedurelà một nhóm các câu lệnh thực hiện một tác vụ được xác định rõ và có thể được gọi từ chương trình của bạn. Thông tin (hoặc dữ liệu) được chuyển tới chương trình gọi, tới thủ tục dưới dạng đối số.
Có hai loại thủ tục -
- Functions
- Subroutines
Chức năng
Hàm là một thủ tục trả về một số lượng duy nhất. Một hàm không nên sửa đổi các đối số của nó.
Số lượng trả lại được gọi là function value, và nó được biểu thị bằng tên hàm.
Syntax
Cú pháp cho một hàm như sau:
function name(arg1, arg2, ....)
[declarations, including those for the arguments]
[executable statements]
end function [name]
Ví dụ sau minh họa một hàm có tên area_of_circle. Nó tính diện tích của một hình tròn có bán kính 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
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
The area of a circle with radius 2.0 is
12.5663710
Xin lưu ý rằng -
Bạn phải chỉ định implicit none trong cả chương trình chính cũng như thủ tục.
Đối số r trong hàm được gọi là dummy argument.
Lựa chọn kết quả
Nếu bạn muốn giá trị trả về được lưu trữ trong một số tên khác với tên hàm, bạn có thể sử dụng result Lựa chọn.
Bạn có thể chỉ định tên biến trả về là -
function name(arg1, arg2, ....) result (return_var_name)
[declarations, including those for the arguments]
[executable statements]
end function [name]
Chương trình con
Một chương trình con không trả về giá trị, tuy nhiên nó có thể sửa đổi các đối số của nó.
Syntax
subroutine name(arg1, arg2, ....)
[declarations, including those for the arguments]
[executable statements]
end subroutine [name]
Gọi một chương trình con
Bạn cần gọi một chương trình con bằng cách sử dụng call tuyên bố.
Ví dụ sau minh họa định nghĩa và cách sử dụng hoán đổi chương trình con, thay đổi giá trị của các đối số của nó.
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
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
Before calling swap
a = 2.00000000
b = 3.00000000
After calling swap
a = 3.00000000
b = 2.00000000
Xác định ý định của các đối số
Thuộc tính ý định cho phép bạn chỉ định ý định mà các đối số được sử dụng trong thủ tục. Bảng sau cung cấp các giá trị của thuộc tính ý định:
Giá trị | Được dùng như | Giải trình |
---|---|---|
trong | ý định (trong) | Được sử dụng làm giá trị đầu vào, không thay đổi trong hàm |
ngoài | ý định (ra ngoài) | Được sử dụng làm giá trị đầu ra, chúng bị ghi đè |
inout | ý định (inout) | Đối số vừa được sử dụng vừa bị ghi đè |
Ví dụ sau thể hiện khái niệm -
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
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
The value of the discriminant is
17.0000000
Thủ tục đệ quy
Đệ quy xảy ra khi một ngôn ngữ lập trình cho phép bạn gọi một hàm bên trong cùng một hàm. Nó được gọi là lời gọi đệ quy của hàm.
Khi một thủ tục gọi chính nó, trực tiếp hoặc gián tiếp, được gọi là một thủ tục đệ quy. Bạn nên khai báo loại thủ tục này bằng cách đứng trước từrecursive trước khi tuyên bố của nó.
Khi một hàm được sử dụng đệ quy, result tùy chọn phải được sử dụng.
Sau đây là một ví dụ, tính toán giai thừa cho một số nhất định bằng thủ tục đệ quy:
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
Thủ tục nội bộ
Khi một thủ tục được chứa trong một chương trình, nó được gọi là thủ tục nội bộ của chương trình. Cú pháp để chứa một thủ tục nội bộ như sau:
program program_name
implicit none
! type declaration statements
! executable statements
. . .
contains
! internal procedures
. . .
end program program_name
Ví dụ sau thể hiện khái niệm -
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
Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:
Before calling swap
a = 2.00000000
b = 3.00000000
After calling swap
a = 3.00000000
b = 2.00000000