Fortran学习笔记(7)

!函数与子程序
!语句函数
!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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trisyp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值