鍍金池/ 教程/ Java/ Fortran過(guò)程
Fortran還原功能
Fortran關(guān)系運(yùn)算符
Fortran運(yùn)算符優(yōu)先級(jí)
Fortran基本語(yǔ)法
Fortran文件輸入輸出
Fortran嵌套select case結(jié)構(gòu)
Fortran變量
Fortran Cycle語(yǔ)句
Fortran語(yǔ)言環(huán)境設(shè)置
Fortran數(shù)據(jù)類(lèi)型
Fortran數(shù)組
Fortran字符
Fortran if...else if...else 語(yǔ)句
Fortran調(diào)試程序
Fortran編程風(fēng)格
Fortran if...then語(yǔ)句結(jié)構(gòu)
Fortran嵌套循環(huán)
Fortran常量
Fortran循環(huán)
Fortran導(dǎo)出數(shù)據(jù)類(lèi)型
Fortran字符串
Fortran操作函數(shù)
Fortran do...while循環(huán)結(jié)構(gòu)
Fortran內(nèi)部函數(shù)
Fortran數(shù)字精度
Fortran選擇決策
Fortran重塑函數(shù)
Fortran運(yùn)算符
Fortran構(gòu)造函數(shù)
Fortran模塊
Fortran位置函數(shù)
Fortran數(shù)字
Fortran指針
Fortran算術(shù)運(yùn)算符
Fortran exit語(yǔ)句
Fortran動(dòng)態(tài)數(shù)組
Fortran嵌套if結(jié)構(gòu)
Fortran select case結(jié)構(gòu)
Fortran向量和矩陣乘法函數(shù)
Fortran邏輯運(yùn)算符
Fortran if...then...else 結(jié)構(gòu)
Fortran教程
Fortran過(guò)程
Fortran Stop語(yǔ)句
Fortran基本輸入輸出
Fortran do循環(huán)結(jié)構(gòu)
Fortran查詢(xún)函數(shù)

Fortran過(guò)程

過(guò)程是一組執(zhí)行一個(gè)明確定義的任務(wù),可以從程序調(diào)用語(yǔ)句。信息(或數(shù)據(jù))被傳遞給調(diào)用程序,以過(guò)程作為參數(shù)。

有兩種類(lèi)型的程序:

  • 函數(shù)
  • 子程序

函數(shù)

函數(shù)是返回一個(gè)數(shù)量的過(guò)程。函數(shù)不修改其參數(shù)。

返回?cái)?shù)值被稱(chēng)為函數(shù)值,并將其表示為函數(shù)名。

語(yǔ)法:

函數(shù)的語(yǔ)法如下:

function name(arg1, arg2, ....)  
   [declarations, including those for the arguments]   
   [executable statements] 
end function [name]

下面的示例演示一個(gè)函數(shù)名為area_of_circle。它計(jì)算半徑為 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

當(dāng)編譯并執(zhí)行上述程序,它會(huì)產(chǎn)生以下結(jié)果:

The area of a circle with radius 2.0 is
   12.5663710   

請(qǐng)注意:

  • 必須指定隱含都不在這兩個(gè)在主程序和過(guò)程中。

  • 在被調(diào)用函數(shù)的參數(shù)r被稱(chēng)為 dummy argument.

結(jié)果選項(xiàng)

如果想返回的值存儲(chǔ)在函數(shù)名的其他名稱(chēng),則可以使用result選項(xiàng)。

可以根據(jù)指定返回變量名:

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

子程序

子程序沒(méi)有返回值,但可以修改其參數(shù)。

語(yǔ)法

subroutine name(arg1, arg2, ....)    
   [declarations, including those for the arguments]    
   [executable statements]  
end subroutine [name]

調(diào)用子程序

需要使用call語(yǔ)句來(lái)調(diào)用一個(gè)子程序。

下面的例子演示了一個(gè)子程序交換,改變其參數(shù)值的定義和使用。

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

當(dāng)編譯并執(zhí)行上述程序,它會(huì)產(chǎn)生以下結(jié)果:

Before calling swap
a = 2.00000000    
b = 3.00000000    
After calling swap
a = 3.00000000    
b = 2.00000000   

指定參數(shù)的意圖

意圖屬性允許指定與參數(shù)的過(guò)程中使用的意向。下表提供intent屬性的值:

使用為 解釋
in intent(in) 用作輸入值,而不是在函數(shù)中改變
out intent(out) 用作輸出值,它們將被覆蓋
inout intent(inout) 參數(shù)都使用和覆蓋

下面的例子演示了這一概念:

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

當(dāng)編譯并執(zhí)行上述程序,它會(huì)產(chǎn)生以下結(jié)果:

The value of the discriminant is
   17.0000000    

遞歸過(guò)程

遞歸發(fā)生在一個(gè)編程語(yǔ)言可以調(diào)用同一個(gè)函數(shù)在函數(shù)內(nèi)。這就是所謂的函數(shù)的遞歸調(diào)用。

當(dāng)一個(gè)過(guò)程調(diào)用本身,直接或間接地被稱(chēng)為遞歸過(guò)程。應(yīng)該通過(guò)其聲明之前的字前面遞歸聲明這種類(lèi)型的程序。

當(dāng)一個(gè)函數(shù)被遞歸使用,則 result 選項(xiàng)要被使用。

以下是一個(gè)例子,它計(jì)算階乘用于使用一個(gè)遞歸過(guò)程:

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

內(nèi)部過(guò)程

當(dāng)一個(gè)過(guò)程被包含在程序中,它被稱(chēng)為程序的內(nèi)部程序。包含一個(gè)內(nèi)部程序的語(yǔ)法如下:

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   

當(dāng)編譯并執(zhí)行上述程序,它會(huì)產(chǎn)生以下結(jié)果:

Before calling swap
a = 2.00000000    
b = 3.00000000    
After calling swap
a = 3.00000000    
b = 2.00000000