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
!语句函数
!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
相关文章推荐
- 【推荐】50本Fortran电子书教程资源pdf免费下载
- 当我不再编程的时候
- 日记
- 程序设计
- 用于线性代数的Ruby模块linalg 0.32发布收藏(来自ruby-talk)
- 解决visual assist 与 visual fortran 冲突的问题
- 记一些 fortran 编译命令
- 计算机各类考试
- c++的现状和未来
- 指针
- GCC的简单使用规则
- 我所了解的多核处理器与OpenMP并行计算
- C++之路
- Fortran内删除文件的方式
- make学习笔记(一)
- 汇编中参数的传递和堆栈修正
- 《The Elements of Programming Style 》老人言
- JNA实现Java调用Fortran
- 函数调用方式介绍
- 比UltraEdit更好用的免费记事本软件下载