Fortran学习笔记(7)

来源:互联网 发布:算法统宗中一百个馒头 编辑:程序博客网 时间:2024/05/06 04:51
!函数与子程序
!语句函数
!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
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天猫新疆不发货怎么办 天猫商城少发货怎么办 下单了卖家不发货怎么办 天猫超市漏发货怎么办 天猫购物几天不发货怎么办 天猫总是不发货怎么办 申请退款后卖家又发货了怎么办 天猫拍后申请退款卖家发货怎么办 淘宝上没下单却收到了货怎么办 被买家投诉三无产品怎么办 阿里巴巴卖家虚假发货怎么办 淘宝捡到便宜但是卖家不发货怎么办 被工商局查到三无产品怎么办 淘宝买到三无产品电器怎么办 天猫商城被投诉怎么办 床板有虫子咬人怎么办 微信充电话费充错怎么办 联通话费充多了怎么办 qq钱包充值要验证码怎么办 在微信qq币充错账号怎么办 微信qq币充错了怎么办 魅蓝e玩游戏卡怎么办 魅蓝5玩游戏卡怎么办 微信qb充错号了怎么办 支付宝qb充错号了怎么办 手机上q币充错了怎么办 q币数值充错了怎么办 微信充值商户电话是假了怎么办 微信冲话费冲错了怎么办 淘宝退款不退邮费怎么办 淘金币买的退款怎么办 淘宝退款不退运费怎么办 拼多多不退运费怎么办 开发商不退团购服务费怎么办 支付宝话费充错了怎么办 电视版本低不支持投屏怎么办 绝地求生刺激战场不支持机型怎么办 手机不支持微信运动怎么办 淘宝虚拟商品买家退货退款怎么办 虚拟品申请啦退货退款怎么办 淘宝充值话费没到账怎么办