Fortran 2003
外觀
| 一位華夏公益教科書使用者建議將本書或章節合併到Fortran中。 請在討論頁面上討論是否應該進行此合併。 |
Fortran 2003是Fortran的一個標準。本書將重點介紹現代Fortran,不會涵蓋Fortran 77和更早標準中過時的功能。
以下是用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