您的位置:首页 > 其它

Fortran学习笔记(7)

2016-02-18 17:22 330 查看
!函数与子程序

!语句函数

!1.语句函数的定义(一条语句足以定义时)

函数名(x1,x2,...)=表达式

!例如:root1(a,b,c)=(-b+sqrt(b**2-4.0*a*c))/(2.0*a)

!2.语句函数的调用

函数名(实参表)

!举例

!1.求正直角柱体的对角线长度

program exam3

real a(5),b(5),h(5),d(5)

diag(x,y)=sqrt(x**2+y**2)

do i=1,5

 read*,a(i),b(i),h(i)

enddo

do i=1,5

 c=diag(a(i),b(i))

 d(i)=diag(c,h(i))

enddo

print 100

100 format(9x,'A',9x,'B',9x,'C',9x,'D')

print 110,(a(i),b(i),h(i),d(i),i=1,5)

110 format(5x,4f9.3)

end

!2.求函数ln(a+sqrt(1+a**2))在a点处导数的近似值

program exam4

logical work

f(a)=alog(a+sqrt(1+a**2))

fun(a,h)=(f(a+h)-f(a-h))/(2.0*h)

read*,a

print*,'a=',a

n=0;x0=0.0

work=.TRUE.

do while(work.AND.n.LE.15)

 h=1.0/2.0**n

 x=fun(a,h)

 if(abs(x-x0).LT.1e-5) work=.FALSE.

 x0=x

 n=n+1

enddo

if(n.LE.15)then

 print*,'n=',n

 print*,'the value of difference quotient is:',x

else

 print*,'n>15'

endif

end

!函数子程序

!定义:

[类型说明符] function 函数名[虚参表] 

 函数体

end[function[函数名]]

!例子:

program exam5

logical cprime

print*,"请输入一个正整数"

read*,n

if(cprime(n))then

 print*,n,"是素数"

else

 print*,n,"不是素数"

endif

end

logical function cprime(n)

cprime=.FALSE.

j=sqrt(1.0*n)

do i=2,j

 if(mod(n,i)==0)return

enddo

cprime=.TRUE.

end

!子例行程序(没有虚参时括号可以省略)

!定义:

subroutine 子例行程序名(虚参表)

 程序体

end[subroutine[子例行程序名]]

!调用:

call 子例行程序名(实参表)

!例子:定义一个冒泡排序的子例行程序

PROGRAM exam7

PARAMETER(n=10)

INTEGER a(n)

read*,iseed

do i=1,n

 a(i)=INT(RAN(iseed)*100)

enddo

PRINT*,"排序前:"

PRINT "(<n>i4)",(a(i),i=1,n)

CALL sort(n,a)

PRINT*,"排序后:"

PRINT "(<n>i4)",(a(i),i=1,n)

end

subroutine sort(n,a)

INTEGER a(n),t

DO i=1,n-1

 DO j=1,n-1

  IF(a(j)>a(j+1))THEN

   t=a(j)

   a(j)=a(j+1)

   a(j+1)=t

  ENDIF

 ENDDO

ENDDO

END

!程序单元之间的数据传递:虚实结合

!子程序中变量的生存周期:被调用执行的这一段时间

!save可以将变量的生存周期延长到整个程序的执行过程

!递归子程序:递归函数和递归子例行程序(关键字recursive)

!递归函数的一般形式:recursive function 函数名([形参表])result(函数结果名表)

!例子:计算n!

PROGRAM exam8

READ*,n

PRINT*,facto(n)

end

RECURSIVE FUNCTION facto(n) RESULT(fac)

INTEGER n

IF(n<0)THEN

 fac=-1

ELSE IF(n==1.OR. n==0)THEN

 fac=1

ELSE 

 fac=n*facto(n-1)

ENDIF

END

!内部子程序

program main

...

call localsub

call localfun

...

contains

 subroutine localsub

 ...

 end subroutine

 function localfun

 ...

 end function

end

!数据共用存储单元与数据块子程序

!等价语句:让同一个程序单元中的两个或更多变量共用同一个存储单元

equivalence(变量表1),(变量表2),...

!公用语句(common语句):

!1.无名公用区:commo 变量表,...

!2.有名公用区:common /公用区1/变量表1,...

!数据块子程序

!common中的变量不能直接在子程序或主程序中使用data来赋初值

!需要通过在block data程序模块中使用data语句赋初值

block data [子程序名]

 变量定义语句

 common语句

 data语句

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fortran