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