跳轉到內容

Fortran 2003

0% developed
來自華夏公益教科書

Fortran 2003是Fortran的一個標準。本書將重點介紹現代Fortran,不會涵蓋Fortran 77和更早標準中過時的功能。

Hello World

[編輯 | 編輯原始碼]

以下是用Fortran編寫的Hello World程式。

program hello
   implicit none
   write (*,*) "Hello, world."
end program hello

"implicit none"語句強制程式設計師宣告所有變數,這被認為是良好的程式設計風格。Fortran具有整數、字元、實數、複數和邏輯資料型別。以下程式演示了它們的使用。

program data_types
   implicit none
   integer :: i
   real :: x
   logical :: tf
   complex :: z
   i = 3
   x = 3.0
   z = (3.0,3.0)
   tf = .true.
   write (*,*) "i =",i," x =",x," z =",z," tf = ",tf
end program data_types

輸出:i = 3 x = 3. z = (3.,3.) tf = T

算術運算子

[編輯 | 編輯原始碼]

Fortran具有算術運算子+、-、/、*和**(用於求冪)。以下程式的輸出為

program xx
   implicit none
   write (*,*) 2+3,2-3,2/3,4*3,2**3
end program xx

5 -1 0 12 8

Fortran 90及更高版本在陣列方面具有強大的功能。以下程式演示了陣列的一些功能。預設情況下,陣列元素從1開始編號,而不是像C或C++那樣從0開始編號。

program xarray
   ! demonstrate array constructor and intrinsic functions
   implicit none
   integer, parameter :: n = 3
   integer :: vec(n)
   vec = (/9,4,1/)          ! set vec(1) to 9, vec(2) to 4, vec(3) to 1
   write (*,*) "vec = ",vec ! print each element of vec
   write (*,*) "vec(1) = ",vec(1),", vec(3) =",vec(3) ! print the 1st and 3rd elements
   write (*,*) "size(vec), sum(vec), product(vec) = ", &
                size(vec), sum(vec), product(vec)
   write (*,*) "minval(vec), maxval(vec) = ",minval(vec),maxval(vec)
   vec = vec + 2            ! add 2 to each element of vec
   write (*,*) "vec = ",vec ! print each element of vec
   vec = vec**2             ! square each element of vec
   write (*,*) "vec = ",vec ! print each element of vec
end program xarray

輸出

vec =  9 4 1
vec(1) =  9 , vec(3) = 1
size(vec), sum(vec), product(vec) =  3 14 36
minval(vec), maxval(vec) =  1 9
vec =  11 6 3
vec =  121 36 9

Fortran使用do迴圈進行迭代。例如,程式

program xloop
   implicit none
   integer :: i
   do i=1,3
      write (*,*) i,i**2
   end do
   write (*,*) "i=",i
   do i=1,4,2
      write (*,*) i
   end do
   write (*,*) "i=",i
end program xloop

輸出

1 1
2 4
3 9
i= 4
1
3
i= 5

因為在第一個迴圈中,變數i以1為步長在1到3之間取值,在第二個迴圈中,步長為2。迴圈結束後,i的值為離開迴圈之前i的最後一個值加上步長。

比較運算子

[編輯 | 編輯原始碼]

Fortran具有比較運算子< <= /= == >= >,其中/=表示“不等於”,其他運算子具有通常的含義。程式

program xcompare
   implicit none
   write (*,*) 1<0,1<=0,1==0,1/=0,1>=0,1>0
end program xcompare

輸出

F F F T T T

可以有一個沒有計數變數的DO迴圈,在這種情況下,將需要一個EXIT語句來退出迴圈,如以下程式所示

program xfibonacci
   ! print Fibonacci numbers up to max_fib
   implicit none
   integer, parameter :: max_fib = 10
   integer            :: i,fib,fib1,fib2
   i    = 0
   fib  = 0
   fib1 = 0
   fib2 = 0
   write (*,*) "Fibonacci numbers <= ",max_fib
   do
      if (fib > max_fib) exit
      write (*,*) fib
      i = i + 1
      if (i > 1) then
         fib  = fib1 + fib2
      else
         fib = 1
      end if
      fib2 = fib1
      fib1 = fib
   end do
end program xfibonacci

宣告max_fib為引數意味著它的值在程式的其餘部分中不能更改。

巢狀迴圈

[編輯 | 編輯原始碼]

迴圈可以巢狀,如以下程式所示

program xnest
   implicit none
   integer :: i,j
   do i=1,3
      do j=1,2
         write (*,*) "i,j=",i,j
      end do
   end do
end program xnest

輸出

i,j= 1 1
i,j= 1 2
i,j= 2 1
i,j= 2 2
i,j= 3 1
i,j= 3 2

函式和返回值

[編輯 | 編輯原始碼]

函式可以用來根據零個或多個引數返回一個值。下面的程式碼顯示了一個將華氏度轉換為攝氏度的函式。

module convert_mod
   implicit none
contains
   function cels_from_fahr(degrees_fahr) result(degrees_cels)
   real, intent(in) :: degrees_fahr
   real             :: degrees_cels
   degrees_cels = (degrees_fahr-32)/1.8
   end function cels_from_fahr
end module convert_mod

program xtemperature
   use convert_mod, only: cels_from_fahr
   real    :: deg
   integer :: i
   write (*,"(2a10)") "degrees_F","degrees_C"
   do i=12,100,20
      deg = real(i)
      write (*,"(2f10.1)") deg,cels_from_fahr(deg)
   end do
end program xtemperature

輸出

degrees_F degrees_C
     12.0     -11.1
     32.0       0.0
     52.0      11.1
     72.0      22.2
     92.0      33.3

子例程

[編輯 | 編輯原始碼]

子例程不能在表示式中使用,並且透過呼叫語句呼叫,如以下程式所示,該程式與上面的程式產生相同的輸出。

module convert_mod
   implicit none
contains
   subroutine cels_from_fahr(degrees_fahr,degrees_cels)
   real, intent(in)  :: degrees_fahr
   real, intent(out) :: degrees_cels
   degrees_cels = (degrees_fahr-32)/1.8
   end subroutine cels_from_fahr
end module convert_mod

program xtemperature
   use convert_mod, only: cels_from_fahr
   real    :: deg_f,deg_c
   integer :: i
   write (*,"(2a10)") "degrees_F","degrees_C"
   do i=12,100,20
      deg_f = real(i)
      call cels_from_fahr(deg_f,deg_c)
      write (*,"(2f10.1)") deg_f,deg_c
   end do
end program xtemperature

另請參閱

[編輯 | 編輯原始碼]
華夏公益教科書