FORTRAN95第六章.ppt
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在上面的程序中, 虽然在主程序和函数子程序都 使用了变量I,然而他们是相互独立的,各自占用 不同的存储空间。 在主程序或其它程序单元中说 明的变量、数组、语句标号, 在另一函数子程序或 子例行子程序中不能直接引用。 ( 唯一的例外是, 在任何程序单元中打开的文件,在整个程序中都 可以直接引用)
2020/4/24
read *,n
h=(b-a)/n
do i=1,n-1
s=s+f (a+i*h) !调用语句函数f的语句
end do
s=h*(f (a)+f (b)+2.0*s)/2.0 !调用语句函数f
write ( *,"('定积分的值为: ',f10.6)")s
end
程序执行示例:
输入等分区间的个数n:100ex602
implicit none
integer:: i
real*8 fact
! 说明被调用函数子程序的类型
do
write(*,"(a)",advance='no')'输入一个非负整数:'
read *,i
if(.not.i<0)exit
print *,'输入了一个负整数,重输!'
2020/4/24
2
在Fortran 95语言中包括以下过程: 内部过程(internal procedure) 内部过程是在程序单元内部定义而且只能被该程序单元调用的过程。内部
过程也称为标准过程。 外部过程(external procedure) 外部过程是在某个外部程序单元中定义的独立过程,或是用非Fortran语言 编写的过程。Fortran的外部过程包括函数子程序和子例行子程序。 模块过程(module procedure) 模块过程是在模块中定义, 可以被所有使用该模块的程序调用的过程。包
2020/4/24
5
6.2.1 外部函数子程序的定义 外部函数子程序又分为普通的、递归的和并行的三种。此处仅讨论普通的 外部函数子程序。 普通的外部函数子程序形式之一为:
[类型名] FUNCTION 函数名([d1,d2,…,dn]) …… !(函数体)
函数名=表达式
……
RETURN
…… END [FUNCTION [函数名]] 其中各成份说明如下。 FUNCTION是表示一个函数子程序开始的关键字。称其所在的这一 行为FUNCTION语句。 类型名表示该函数过程返回值的类型,如果未给出类型名,则按隐 含规则确定返回值的类型, 或者是函数体中用类型说明语句显式说明函 数名的类型。如果函数名表示一个数组,则必须在函数体中显式说明。
如果哑元是一个哑过程名,则相应的实元只能是具有同一 类型的一个内在函数名或一个外部函数子程序名,或一个 子例行子程序名;
如果哑元是一个指针,则相应的实元也必须是一个指针, 且类型、种别和维数必须一致;
下面的例子说明外部函数子程序的调用方法和执行过程。
2020/4/24
13
例6.3 用外部函数子程序计算组合数:!计算n!的外部函数子程序
!fact为外部函数子程序名, n为哑元
implicit none
integer:: n,i
! 说明哑元n和函数体中所用变量i的类型
real*8:: fact
! 说明函数名的类型
fact=1d0
!函数名作为变量名使用
do i=2,n
fact=fact*i
end do
return
!返回语句,此处可以省略
定积分的值为: 0.6931533
2020/4/24
4
前面所举的程序例子,大多只有一个主程序块。实际上fortran
程序通常是由多个程序块组成的。各程序块之间是相互独立
的,即各程序块中的变量名、 数组名、语句函数和语句标号只
在本块中有效。本章重点介绍外部过程(函数子程序和子例行
子程序),以及与过程相关的一些语句。
义,类型名说明的仅是结果变量的类型。应该注意的是, 函
数名与结果变量不能重名,而且在函数体内不允许出现对
函数名的任何说明。结果变量名可以表示单个变量,也可
以表示一个数组名。
例如,上例函数子程序可改写为:
2020/4/24
10
function fact (n) result (dfact) !dfact为结果变量名, n为哑元
语句函数名([哑元名表])=表达式
语句函数定义语句,必须出现在其它说明语句之后、第一个可执行语句之前
program ex601
implicit none
real::a=0.0,b=1.0,s=0.0,h,f,x
integer::n,i
f (x)= 1.0/(1+x) !语句函数f的定义语句
write(*,"('输入等分区间的个数n:') ",advance='no')
12
如果哑元是一个变量名,则相应的实元可以是一个常数或 符号常数,或一个含运算符或园括号的表达式,或一个变 量名,或一个数组元素名,或一个字符子串名;
如果哑元是一个数组名,则相应的实元可以是一个数组名, 或一个数组元素名,或一个数组片段,或一个数组表达式。 无论在何种形式下,哑元数组与实元数组可以有不同的维 数和大小,但是实元数组的大小必须不小于相应哑元数组 的大小;
语句函数(statement function) 语句函数是由单个语句定义的函数。Fortran 95不推荐使用,因为它不符合 过程的一般规则。建议使用内部过程替代它。
2020/4/24
3
下面通过例子介绍语句函数的用法。
例6.1 利用梯形法
1
1
计算定积分的值。
dx
语句函数定义的形式为: 0 1 x
2020/4/24
1
6.1 FORTRAN过程概述 一个FORTRAN程序由若干个程序单元组成。程序单元可
以是主程序单元、外部程序单元、模块程序单元或数据块 程序单元。其中,只能包含一个主程序单元。 所谓过程,是指一些由系统提供或用户自己编写的程序块。 在解决实际问题时,为了降低问题的复杂程度,常常把一 个大问题分解为若干个小问题,然后再把这些小问题分解 为更小的问题,这样重复下去,直到各个小问题都能解决 为止。这样,原来的问题就可以解决了。在程序设计中, 也往往遵循这样的思想,将程序的功能逐步分解成若干个 子功能,每个子功能还可以再分解为更小的若干个子功能, 直到每个子功能都可以较简单地实现,也就是说,采用 “自顶向下、逐步求精”的方法,将一个大型程序的设计 任务分解成若干个较小的子任务来完成。这就是模块化程 序设计方法,它是构成大型复杂软件的一种重要方法,是 结构化程序设计的主要手段。FORTRAN语言中的“过程” 就是实现这一方法的重要工具。
第六章 Fortran 过程程序设计 本章介绍Fortran 95语言中过程的程序设计 方法。通过本章的学习, 应了解Fortran过程 的基本概念,掌握Fortran的外部过程(函数子 程序、子例行子程序) 和内部过程的定义和调 用方法, 理解公用语句与等价语句的形式与作 用,了解数据块子程序的形式及作用。
含过程的模块称为宿主。
内在过程(intrinsic procedure) 内在过程是由编译系统内部定义, 不用任何附加声明或说明就可以可直接
引用的过程。
哑过程(dummy procedure) 如果一个哑元(形式参数)被指明为过程或作为过程名出现在过程引用中,那 么该哑元代表的过程为一个哑过程。
function fact(n)
implicit none
integer:: n,i,fact
fact=1
do i=2,n
fact =fact*i
end do
return
end function
!主程序
program ex603
implicit none
integer m,n, fact,c
9
普通的外部函数子程序形式之二为:
[类型名] FUNCTION 函数名([d1,d2,…,dn]) RESULT (结果变量名) … !(函数体)
END [FUNCTION [函数名]]
这种形式的外部函数子程序与前一形式的唯一区别在于: 该外部函数子程序的计算结果不是通过函数名返回,而
是通过结果变量返回的。所以,函数名己没有任何值的含
现一个或多个RETURN语句。当 RETURN 语句的下一条语句为END语句
时,RETURN 语句可以省略不写。 如果函数体内没有RETURN语句, 则
2E02N0/4D/2语4 句将实现RETURN语句的功能。
7
例6.2 利用函数子程序,计算N的阶乘。
! 计算N!的函数子程序
function fact (n)
write(*,*)'输入错,重输!'
end do
c=fact (m) / fact (m-n) / fact (n)
2020/4/24
6
函数名的命名规则与一般的变量相同。在函数体中,函数名作为变
量名使用,而且至少要对其赋值一次, 最后作为被调用的结果传送到调
用程序;外部函数子程序名是一个全局性名字,因此它在整个程序中必须
唯一,不能与任何其它符号名相同。
d1,d2,…,dn称为哑元表(dummy argement list),di称为哑元。
6.2 外部函数子程序
由fortran语言提供的内在过程,虽然在任何程序单元中都 可以随意调用,但是仅仅限于内在过程远远不能满足许多 应用的需要。因此,任何一种程序设计语言都提供某种方 法,使用户能够根据实际问题的要求,自行编写相应的函 数或子程序来扩充程序的处理能力。
如果被计算的任务既不是内在函数,也不能用一个表达式 表示,或者虽然能用一个表达式表示,但有多个程序块都 要使用它,在这些情况下,可以用一个外部函数子程序定 义它。
函数子程序写法改变了,但主程序仍然不变。
2020/4/24
11
6.2.2 外部函数子程序的调用
外部函数子程序的调用(引用)方法和语句函数、内 在函数一样,只能出现在表达式或输出语句中。 当调用外部函数子程序时,一般写成如下形式:
FUN([a1,a2,…,an])
其中:
FUN是被调用的外部函数子程序的名字。
说明。星号(*)哑元是交错返回指示符,不需要任何说明。哑元表也可称
为虚拟参数表,哑元也可称为虚拟参数。
函数子程序也可以没有哑元,即哑元表可以为空。但函数名之后的
一对园括号不能省略。
函数子程序以 END 语句结束。从 FUNCTION 语句的下一个语句到
END语句的前一个语句组成函数体。
在函数体中,可以出现多个说明语句和可执行语句,特别是可以出
do
write(*,*)'输入正整数m:'
read (*,*)m
if (m>0) exit
write(*,*)'输入了一个负整数或零,重输!'
end do
do
write(*,"('输入正整数n(n<=',i4,'):')")m
read (*,*)n
if (n>0 .and. n<m) exit
end do
write(*,"(i4,'!=',e15.6)")i,fact(i)
end program ex602
2020/4/24
8
注意,函数名FACT被说明为双精度实型, 目的在 于扩大计算结果的范围。因为4字节整数只能表示 不超过l3的阶乘, 4字节单精度实型数只能表示不 超过34的阶乘,8字节双精度实型数也只能表示不 超过170的阶乘。当然,实型数是近似表示的。
a1, a2,…,an为实元表(actual argement list)。 其中的ai为实元。每个实元可以是一个表达式、变 量名、数组名、数组元素名、数组片段、过程名、指针 或*语句标号等形式。实元表中的每个实元,必须 与哑元表中相同位置上的哑元在类型上完全一致, 在种别上应满足以下要求:
2020/4/24
函数子程序中的哑元di可以是变量名、数组名、哑过程名或星号(*), 哑元
之间用逗号分开。除了“*”外,各哑元的类型可以按隐含规则确定, 也可
在函数体内用类型说明语句说明它们的各自类型。但是, 当哑元是数组
名时,必须在函数体内用类型说明语句或维数语句说明其类型、维数和各
维的上、下界;当哑元是指针时, 也必须在函数体内用类型说明语句加以
implicit none
integer n,i
! 说明哑元n和函数体中所用变量i的类型
real*8 dfact
! 说明结果变量dfact的类型
dfact=1
!函数名作为变量名使用
do i=2,n
dfact=dfact*i
end do
return
!返回语句,此处可以省略
end function fact
2020/4/24
read *,n
h=(b-a)/n
do i=1,n-1
s=s+f (a+i*h) !调用语句函数f的语句
end do
s=h*(f (a)+f (b)+2.0*s)/2.0 !调用语句函数f
write ( *,"('定积分的值为: ',f10.6)")s
end
程序执行示例:
输入等分区间的个数n:100ex602
implicit none
integer:: i
real*8 fact
! 说明被调用函数子程序的类型
do
write(*,"(a)",advance='no')'输入一个非负整数:'
read *,i
if(.not.i<0)exit
print *,'输入了一个负整数,重输!'
2020/4/24
2
在Fortran 95语言中包括以下过程: 内部过程(internal procedure) 内部过程是在程序单元内部定义而且只能被该程序单元调用的过程。内部
过程也称为标准过程。 外部过程(external procedure) 外部过程是在某个外部程序单元中定义的独立过程,或是用非Fortran语言 编写的过程。Fortran的外部过程包括函数子程序和子例行子程序。 模块过程(module procedure) 模块过程是在模块中定义, 可以被所有使用该模块的程序调用的过程。包
2020/4/24
5
6.2.1 外部函数子程序的定义 外部函数子程序又分为普通的、递归的和并行的三种。此处仅讨论普通的 外部函数子程序。 普通的外部函数子程序形式之一为:
[类型名] FUNCTION 函数名([d1,d2,…,dn]) …… !(函数体)
函数名=表达式
……
RETURN
…… END [FUNCTION [函数名]] 其中各成份说明如下。 FUNCTION是表示一个函数子程序开始的关键字。称其所在的这一 行为FUNCTION语句。 类型名表示该函数过程返回值的类型,如果未给出类型名,则按隐 含规则确定返回值的类型, 或者是函数体中用类型说明语句显式说明函 数名的类型。如果函数名表示一个数组,则必须在函数体中显式说明。
如果哑元是一个哑过程名,则相应的实元只能是具有同一 类型的一个内在函数名或一个外部函数子程序名,或一个 子例行子程序名;
如果哑元是一个指针,则相应的实元也必须是一个指针, 且类型、种别和维数必须一致;
下面的例子说明外部函数子程序的调用方法和执行过程。
2020/4/24
13
例6.3 用外部函数子程序计算组合数:!计算n!的外部函数子程序
!fact为外部函数子程序名, n为哑元
implicit none
integer:: n,i
! 说明哑元n和函数体中所用变量i的类型
real*8:: fact
! 说明函数名的类型
fact=1d0
!函数名作为变量名使用
do i=2,n
fact=fact*i
end do
return
!返回语句,此处可以省略
定积分的值为: 0.6931533
2020/4/24
4
前面所举的程序例子,大多只有一个主程序块。实际上fortran
程序通常是由多个程序块组成的。各程序块之间是相互独立
的,即各程序块中的变量名、 数组名、语句函数和语句标号只
在本块中有效。本章重点介绍外部过程(函数子程序和子例行
子程序),以及与过程相关的一些语句。
义,类型名说明的仅是结果变量的类型。应该注意的是, 函
数名与结果变量不能重名,而且在函数体内不允许出现对
函数名的任何说明。结果变量名可以表示单个变量,也可
以表示一个数组名。
例如,上例函数子程序可改写为:
2020/4/24
10
function fact (n) result (dfact) !dfact为结果变量名, n为哑元
语句函数名([哑元名表])=表达式
语句函数定义语句,必须出现在其它说明语句之后、第一个可执行语句之前
program ex601
implicit none
real::a=0.0,b=1.0,s=0.0,h,f,x
integer::n,i
f (x)= 1.0/(1+x) !语句函数f的定义语句
write(*,"('输入等分区间的个数n:') ",advance='no')
12
如果哑元是一个变量名,则相应的实元可以是一个常数或 符号常数,或一个含运算符或园括号的表达式,或一个变 量名,或一个数组元素名,或一个字符子串名;
如果哑元是一个数组名,则相应的实元可以是一个数组名, 或一个数组元素名,或一个数组片段,或一个数组表达式。 无论在何种形式下,哑元数组与实元数组可以有不同的维 数和大小,但是实元数组的大小必须不小于相应哑元数组 的大小;
语句函数(statement function) 语句函数是由单个语句定义的函数。Fortran 95不推荐使用,因为它不符合 过程的一般规则。建议使用内部过程替代它。
2020/4/24
3
下面通过例子介绍语句函数的用法。
例6.1 利用梯形法
1
1
计算定积分的值。
dx
语句函数定义的形式为: 0 1 x
2020/4/24
1
6.1 FORTRAN过程概述 一个FORTRAN程序由若干个程序单元组成。程序单元可
以是主程序单元、外部程序单元、模块程序单元或数据块 程序单元。其中,只能包含一个主程序单元。 所谓过程,是指一些由系统提供或用户自己编写的程序块。 在解决实际问题时,为了降低问题的复杂程度,常常把一 个大问题分解为若干个小问题,然后再把这些小问题分解 为更小的问题,这样重复下去,直到各个小问题都能解决 为止。这样,原来的问题就可以解决了。在程序设计中, 也往往遵循这样的思想,将程序的功能逐步分解成若干个 子功能,每个子功能还可以再分解为更小的若干个子功能, 直到每个子功能都可以较简单地实现,也就是说,采用 “自顶向下、逐步求精”的方法,将一个大型程序的设计 任务分解成若干个较小的子任务来完成。这就是模块化程 序设计方法,它是构成大型复杂软件的一种重要方法,是 结构化程序设计的主要手段。FORTRAN语言中的“过程” 就是实现这一方法的重要工具。
第六章 Fortran 过程程序设计 本章介绍Fortran 95语言中过程的程序设计 方法。通过本章的学习, 应了解Fortran过程 的基本概念,掌握Fortran的外部过程(函数子 程序、子例行子程序) 和内部过程的定义和调 用方法, 理解公用语句与等价语句的形式与作 用,了解数据块子程序的形式及作用。
含过程的模块称为宿主。
内在过程(intrinsic procedure) 内在过程是由编译系统内部定义, 不用任何附加声明或说明就可以可直接
引用的过程。
哑过程(dummy procedure) 如果一个哑元(形式参数)被指明为过程或作为过程名出现在过程引用中,那 么该哑元代表的过程为一个哑过程。
function fact(n)
implicit none
integer:: n,i,fact
fact=1
do i=2,n
fact =fact*i
end do
return
end function
!主程序
program ex603
implicit none
integer m,n, fact,c
9
普通的外部函数子程序形式之二为:
[类型名] FUNCTION 函数名([d1,d2,…,dn]) RESULT (结果变量名) … !(函数体)
END [FUNCTION [函数名]]
这种形式的外部函数子程序与前一形式的唯一区别在于: 该外部函数子程序的计算结果不是通过函数名返回,而
是通过结果变量返回的。所以,函数名己没有任何值的含
现一个或多个RETURN语句。当 RETURN 语句的下一条语句为END语句
时,RETURN 语句可以省略不写。 如果函数体内没有RETURN语句, 则
2E02N0/4D/2语4 句将实现RETURN语句的功能。
7
例6.2 利用函数子程序,计算N的阶乘。
! 计算N!的函数子程序
function fact (n)
write(*,*)'输入错,重输!'
end do
c=fact (m) / fact (m-n) / fact (n)
2020/4/24
6
函数名的命名规则与一般的变量相同。在函数体中,函数名作为变
量名使用,而且至少要对其赋值一次, 最后作为被调用的结果传送到调
用程序;外部函数子程序名是一个全局性名字,因此它在整个程序中必须
唯一,不能与任何其它符号名相同。
d1,d2,…,dn称为哑元表(dummy argement list),di称为哑元。
6.2 外部函数子程序
由fortran语言提供的内在过程,虽然在任何程序单元中都 可以随意调用,但是仅仅限于内在过程远远不能满足许多 应用的需要。因此,任何一种程序设计语言都提供某种方 法,使用户能够根据实际问题的要求,自行编写相应的函 数或子程序来扩充程序的处理能力。
如果被计算的任务既不是内在函数,也不能用一个表达式 表示,或者虽然能用一个表达式表示,但有多个程序块都 要使用它,在这些情况下,可以用一个外部函数子程序定 义它。
函数子程序写法改变了,但主程序仍然不变。
2020/4/24
11
6.2.2 外部函数子程序的调用
外部函数子程序的调用(引用)方法和语句函数、内 在函数一样,只能出现在表达式或输出语句中。 当调用外部函数子程序时,一般写成如下形式:
FUN([a1,a2,…,an])
其中:
FUN是被调用的外部函数子程序的名字。
说明。星号(*)哑元是交错返回指示符,不需要任何说明。哑元表也可称
为虚拟参数表,哑元也可称为虚拟参数。
函数子程序也可以没有哑元,即哑元表可以为空。但函数名之后的
一对园括号不能省略。
函数子程序以 END 语句结束。从 FUNCTION 语句的下一个语句到
END语句的前一个语句组成函数体。
在函数体中,可以出现多个说明语句和可执行语句,特别是可以出
do
write(*,*)'输入正整数m:'
read (*,*)m
if (m>0) exit
write(*,*)'输入了一个负整数或零,重输!'
end do
do
write(*,"('输入正整数n(n<=',i4,'):')")m
read (*,*)n
if (n>0 .and. n<m) exit
end do
write(*,"(i4,'!=',e15.6)")i,fact(i)
end program ex602
2020/4/24
8
注意,函数名FACT被说明为双精度实型, 目的在 于扩大计算结果的范围。因为4字节整数只能表示 不超过l3的阶乘, 4字节单精度实型数只能表示不 超过34的阶乘,8字节双精度实型数也只能表示不 超过170的阶乘。当然,实型数是近似表示的。
a1, a2,…,an为实元表(actual argement list)。 其中的ai为实元。每个实元可以是一个表达式、变 量名、数组名、数组元素名、数组片段、过程名、指针 或*语句标号等形式。实元表中的每个实元,必须 与哑元表中相同位置上的哑元在类型上完全一致, 在种别上应满足以下要求:
2020/4/24
函数子程序中的哑元di可以是变量名、数组名、哑过程名或星号(*), 哑元
之间用逗号分开。除了“*”外,各哑元的类型可以按隐含规则确定, 也可
在函数体内用类型说明语句说明它们的各自类型。但是, 当哑元是数组
名时,必须在函数体内用类型说明语句或维数语句说明其类型、维数和各
维的上、下界;当哑元是指针时, 也必须在函数体内用类型说明语句加以
implicit none
integer n,i
! 说明哑元n和函数体中所用变量i的类型
real*8 dfact
! 说明结果变量dfact的类型
dfact=1
!函数名作为变量名使用
do i=2,n
dfact=dfact*i
end do
return
!返回语句,此处可以省略
end function fact