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.语句函数的定义(一条语句足以定义时)
函数名(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
- Fortran学习笔记(7)
- Fortran学习笔记
- Fortran学习笔记(4)
- Fortran学习笔记(5)
- Fortran学习笔记(6)
- Fortran学习笔记(1-3)
- Fortran学习笔记(一)
- Fortran 与 C/C++ 混编学习笔记
- Fortran学习笔记2(变量声明)
- Fortran学习笔记4(循环语句)
- Fortran学习笔记5(数组Array)
- Fortran学习笔记6(函数、子程序)
- fortran学习
- FORTRAN的数组-笔记
- 一些Fortran的笔记
- Fortran学习记录1(Fortran数据类型)
- fortran 学习记录2
- Fortran 字符串学习
- iOS的计步实现
- java按行读取文件内容
- Codeforces 626D 暴力
- Vmware虚拟机安装安卓4.0系统教程
- 脉络清晰的BP神经网络讲解,赞
- Fortran学习笔记(7)
- AppCompatActivity使用
- 关于iOS获取音乐库的音乐信息 (获取本地音乐文件)
- TYPE Directive in FOR XML Queries(FOR XML查询中的TYPE指令)
- Mac 下配置 Git 服务器
- 简单分析一下socket中的bind
- 打包提示"此证书的签发者无效"--系统认证证书(AppleWWDRCA.cer)过期
- 基于c++控制台的Socket通信源码
- 像QQ空间的Android沉浸式通知栏