# Fortran過程

• 函式
• 子程式

## 函式

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

```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.

```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]```

```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   ```

## 指定引數的意圖

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    ```

## 遞迴過程

```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  ```