FORTRAN 程式概述

来源:百度文库 编辑:神马文学网 时间:2024/04/29 13:16:52
Introduction to Fortran 90     by K.T. Lee
K. T. Lee  Sept. 1998
FORTRAN 90 程式概述
Fortran 是由Formula Translate 两个字所组合而成,因此该电脑语言是为理工方面之计算所发展出来。1957年发展出第一套Fortran语言,而后1977年改进成为较具结构化特性之语言,称为Fortran 77。1991年则加入物件导向的观念与提供指标,并同时加强阵列的功能,大幅改进旧版Fortran的型式,称为Fortran 90。
程式编辑
program test
! Fortran 90 example program
implicit none
character(5) :: watershed
real :: flow(365), ftotal, fmean
integer :: year, n
open(unit=1, file=’test.dat’)
open(unit=2, file=’test.out’)
read(1,a5)watershed
read(1,i4)year
read(1,’(8f10.2)’)(flow(n),n=1,365)
ftotal=0.
do n=1,365
ftotal=ftotal+flow(n)
enddo
fmean=ftotal/365.
write(2,’(a16,a5)’) ‘watershed name =’, watershed
write(2,’(a6,i4)’) ‘year =’, year
write(2,’(2f10.2)’) ftotal, fmean
stop
end
* 档案开启
open(unit=1,file=’test.dat’)
unit=1         档案代号
test.dat  档案名称
* 程式宣告
real :: flow(365)
integer  :: year, n
character(5) :: watershed
real         实数
integer      整数
flow(365)    以 flow 为名之变数的数据共有365个
character(5)              以 watershed 为名之 字元有5个字母 (ex. Wu-tu)
*输入与输出
Ex      read(1,’(i4)’) year
由档案 1 输入, year 之输入格式 为 4 位整数
Ex.     read (1,’(8f10.2)’) (flow(n), n=1,365)
由档案1 输入, flow(n) 之数据共365个,输入格式为 10  位实数,但其中有2位小数,
且每一行有8个数据。
Ex.   write(2,’(a16,a5)’) ‘watershed name =’, watershed
由档案2 输出watershed name, 输出格式为5 位字元
Ex      write(2,’(a5,i4)’) ‘year=’, year
由档案 2 输出, year之输出格式 为 4 位整数
Ex.     write(2,’(2f10.2)’) ftotal, fmean
由档案 2 输出, ftotal 与 fmean 以10  位实数,但其中有2 位小数。
Ex.     write(2,10) ftotal, fmean
10 format(‘ftotal=’,f10.2,2x,’fmean=’,f10.2)
由档案 2 输出, ftotal 与 fmean 以10  位实数,但其中有2 位小数。
Ex.     read(1,*) (flow(n),n=1,365)
由档案 1 以"自由格式"方式输入 flow(n) 共365个
Ex.   指数型式输入与输出
x=100.023
write(2,’(e9.3)’) x                   0.100E+03
write(2,’(e11.5)’) x   0.10002E+03
Ex.     real :: flow(3,365)
read(1,*) ((flow(m,n),n=1,365), m=1,3)
flow共有3’365个数据,先读m=1, n=1,365;再读m=2, n=1,365;余此类推。
* 基本运算
Ex.   a+b, a-b, a*b, a/b
a**b       a 的 b 次方
sqrt(a)    a 的开根号
exp(a*b) 自然指数的 a*b 次方
* 运算回圈
Ex.  计算总流量 ftotal 与平均流量 fmean
ftotal=0.
do n=1,365,1
ftotal=ftotal+flow(n)
enddo
fmean=ftotal/365.
* 逻辑叙述
Ex.   .EQ. = = equivalent   .NE. /= not equivalent
.GT. > greater than  .GE. >= greater or equivalent
.LT. < less than  .LE. <= less or equivalent
Ex.   if (index.eq.1) then
dpdy=2.
else
dpdy=2.*sqrt(1+s*s)
endif
如果 index=1 则 dpdy=2. , 否则 dpdy= 2.*sqrt(1+s*s)
Ex.   nf=0
do 100 n=1, 365
if(flow(n).lt. 20.0 ) goto 100
nf=nf+1
100 continue
如果 flow(n) 小于 20.0 则直接转至编号 100 之叙述 , 否则 nf=nf+1
* 副程式
program main
implicit none
integer :: n
.   real :: rain(50), flow(100), rtotal,rmean,ftotal,fmean
open(unit=1,file=’test.dat’')
open(unit=2,file=’test.out’)
read(1,*)(rain(n),n=1,50)
read(1,*)(flow(n),n=1,100)
call stat(50,rain,rtotal,rmean)
call stat(100,flow,ftotal,fmean)
write(2,10)rtotal,rmean,ftotal,fmean
10 format(‘rtotal=',f10.3,2x,'rmean=',f10.3,2x,'ftotal=',f10.3, &
2x,'fmean=',f10.3)
stop
end
subroutine stat(num,a,total,mean)
!  statistical method
implicit none
integer :: num, n
real :: a(100),mean,total
total=0.
do n=1,num
total=total+a(n)
enddo
mean=total/num
return
end
。利用副程式 stat 计算总雨量、平均雨量与总流量、平均流量
。在上述程式中只要程式与输入档案 test.dat 即可执行程式
Step 1:   compile   程式   →  系统将产生  main.obj
Step 2:   build        程式  →  系统将产生  main.exe
Step 3:   execute    程式   →  系统将产生输出档案  test.out
Ex   可调矩阵
program main
implicit none
real, allocatable :: rain(:), flow(:)
real :: rtotal,rmean,ftotal,fmean
integer :: nrain,nflow,n
open(unit=1,file=’test.dat’)
open(unit=2,file=’test.out’)
read(1,*)nrain, nflow
allocate (rain(nrain),flow(nflow))
read(1,*)(rain(n),n=1,nrain)
read(1,*)(flow(n),n=1,nflow)
call stat(nrain,rain,rtotal,rmean)
call stat(nflow,flow,ftotal,fmean)
write(2,10)rtotal,rmean,ftotal,fmean
10 format(‘rtotal=',f10.3,2x,'rmean=',f10.3,2x,'ftotal=',f10.3, &
2x,'fmean=',f10.3)
stop
end
Ex.           program   find the maximum daily rainfall for the rainfall record
implicit none
real, allocatable ::  rain(:)
real :: maxrain
integer :: nrain, i
open(unit=1,file=’test.dat’)
open(unit=2,file=’test.out’)
read(1,*)nrain
allocate (rain(nrain))
read(1,*)(rain(i), i=1, nrain)
maxrain=rain(1)
do i=2,nrain
if(rain(i).gt.maxrain)  maxrain=rain(i)
enddo
write(2,10)maxrain
format(‘maximum rainfall intensity =’, f10.1,’mm’)
stop
end
Ex.           program   find the maximum daily rainfall for the rainfall record
implicit none
real, allocatable ::  rain(:)
real :: maxrain
integer :: nrain, i
open(unit=1,file=’test.dat’)
open(unit=2,file=’test.out’)
read(1,*)nrain
allocate (rain(nrain))
read(1,*)(rain(i), i=1, nrain)
maxrain=maxval(rain)
write(2,’(a8,f10.1,a2)’)’maxrain=’, maxrain, ‘mm’
stop
end