第11章子程序 §1函数子程序 §2子例程子程序 §3实参和虚参之间的数据传送 §4程序举例 2021/2/24
1 2021/2/24 §1 函数子程序 §2 子例程子程序 §3 实参和虚参之间的数据传送 §4 程序举例 第11章 子程序
引言 子程序是相对于主程序而言的,到目前为止, 我们涉及到的程序都只有主程序。 一个 Fortran程序可以由一个主程序和若干个 子程序组成。程序中可以只有主程序而没有子程 序,但不能没有主程序而只有子程序。 程序在运行时,总是从主程序开始执行,由主 程序调用子程序,最后在主程序中结束整个程序 的运行
2 子程序是相对于主程序而言的,到目前为止, 我们涉及到的程序都只有主程序。 一个Fortran程序可以由一个主程序和若干个 子程序组成。程序中可以只有主程序而没有子程 序,但不能没有主程序而只有子程序。 程序在运行时,总是从主程序开始执行,由主 程序调用子程序,最后在主程序中结束整个程序 的运行。 ❖引言
Fortran的子程序有三种:函数子程序、子例程 子程序、数据块子程序。 通常我们将函数子程序和子例程子程序统称为 子程序,数据块子程序仅用于给公用区中的变量赋 初值。本章提到的“子程序”即指函数子程序或子 例程子程序。 子程序可以被主程序调用,也可以被其它子程 序调用。但标准 Fortran77的子程序不能直接或间 接地调用自己,即不允许递归调用
3 Fortran的子程序有三种:函数子程序、子例程 子程序、数据块子程序。 通常我们将函数子程序和子例程子程序统称为 子程序,数据块子程序仅用于给公用区中的变量赋 初值。本章提到的“子程序”即指函数子程序或子 例程子程序。 子程序可以被主程序调用,也可以被其它子程 序调用。但标准Fortran77的子程序不能直接或间 接地调用自己,即不允许递归调用
§1函数子程序(P234238) 【引例】求函数(x)=x2+x+1在x=1,2,3时的值。 函数用一条语句即可实现,既可采用语句函数的形式, 也可采用函数子程序的形式。 write ( * )f(1.0), f(2.0), f(3.0) function f(x) end 仁x*x+X+1 end +1(x>0 【例111】计算函数:y=10(x=0)的值。 l(x<0 函数用一条语句无法实现,只能采用函数子程序的形 式。 51子程序 2021/2/24
4 2021/2/24 §1 函数子程序(p234-238) 【例11.1】计算函数: 的值。 − = + = ( ) ( ) ( ) 1 0 0 0 1 0 x x x y 【引例】求函数f(x)=x 2+x+1在x =1, 2, 3时的值。 函数用一条语句即可实现,既可采用语句函数的形式, 也可采用函数子程序的形式。 write(* , *)f(1.0), f(2.0), f(3.0) end function f(x) f=x*x+x+1 end 函数用一条语句无法实现,只能采用函数子程序的形 式。 §1 子程序
5 函数子程序: ②主程序:④ function y(x) write (*, Asinput x if(xgt. 0.o)then le read(", "x y=1.0 wrte()y=’,y(x) else if(x.eg. 0.0)then end 0.0 else y=-1.0 end if end ④4 51子程序 2021/2/24
5 2021/2/24 function y(x) if(x.gt.0.0) then y=1.0 else if(x.eq.0.0) then y=0.0 else y=-1.0 end if end write(* , *)‘input x’ read(* , *)x write(* , *)‘y=’, y(x) end 函数子程序: 主程序: §1 子程序 ② ① ③ ④
函数子程序的定义「函数头,也称为unom语句 定义形式: [类型说明] function函数名(虚参) 函数体 注: end ()函数名既是该函数的名字又代表该函数的函数值, 故函数名有类型,其类型既可隐式说明也可显式定义 (2)函数名后圆括号中为函数的虚参,多个虚参用逗号 隔开,没有虚参时括号不能省略。 虚参的类型既可隐式说明也可显式定义。显式完义时, 虚参的类型定义语句是放在函数体中的。 虚参可以是变量、数组或子程序名。 51子程序 2021/2/24
6 2021/2/24 一、函数子程序的定义 定义形式: 注: ⑴ 函数名既是该函数的名字又代表该函数的函数值, 故函数名有类型,其类型既可隐式说明也可显式定义。 ⑵ 函数名后圆括号中为函数的虚参,多个虚参用逗号 隔开,没有虚参时括号不能省略。 虚参的类型既可隐式说明也可显式定义。显式定义时, 虚参的类型定义语句是放在函数体中的。 虚参可以是变量、数组或子程序名。 [类型说明] function 函数名(虚参) end 函数体 函数头,也称为function语句 §1 子程序
函数子程序的定义「函数头,也称为unom语句 定义形式: [类型说明] function函数名(虚参) 函数体 注 end ()函数体中语句排列顺序与主程序相同,即说明语句 在前,执行语句在后。 个程序单元(主程序或子程序)中语句的具体顺序参 见教材p328附录工。 51子程序 2021/2/24
7 2021/2/24 一、函数子程序的定义 定义形式: 注: ⑶ 函数体中语句排列顺序与主程序相同,即说明语句 在前,执行语句在后。 一个程序单元(主程序或子程序)中语句的具体顺序参 见教材p328附录Ⅱ。 [类型说明] function 函数名(虚参) end 函数体 函数头,也称为function语句 §1 子程序
附录工一个程序单元中语句的顺序 8 program, function, subroutine, block data语句 注 implici语句 释 ormat parameter语句 其它说明语句 行语句 data语句 语句函数语句 可执行语句 end语句 交出句可以任地与mp句和基资明 data语句可以任意地与语句函数语句和可执行语句交替 出现。 51子程序 2021/2/24
8 2021/2/24 §1 子程序 注 释 行 program, function, subroutine, block data语句 format 语句 parameter语句 implicit语句 其它说明语句 data语句 语句函数语句 可执行语句 end语句 附录Ⅱ 一个程序单元中语句的顺序 parameter语句可以任意地与implicit语句和其它说明 语句交替出现。 data语句可以任意地与语句函数语句和可执行语句交替 出现
函数子程序的定义「函数头,也称为 Function语句 定义形式: 类型说明] function函数名(虚参, 函数体 注 end (4)函数体下面的end语句表示结束本子程序,返回到调 用它的程序单元。 若在函数体中间返回,需用 return语句 (5)在返回前,须将需要返回的计算结果赋给函数名。 即函数名至少要在函数体中被赋值一次。 赋值形式:函数名=计算结果 51子程序 2021/2/24
9 2021/2/24 一、函数子程序的定义 定义形式: 注: ⑷ 函数体下面的end语句表示结束本子程序,返回到调 用它的程序单元。 若在函数体中间返回,需用return语句。 ⑸ 在返回前,须将需要返回的计算结果赋给函数名。 即函数名至少要在函数体中被赋值一次。 赋值形式:函数名=计算结果 [类型说明] function 函数名(虚参, …) end 函数体 函数头,也称为function语句 §1 子程序
(6)函数子程序是一个独立的程序单元,函数体内所用10 的变量、语句标号等的作用范围仅局限于本子程序内。 每个函数子程序仅通过函数名和虚参或公用区)与其它 的子程序以及主程序建立联系。 小结: Fortran77中有三种形式的函数 ◆内部函数:是 Fortran系统自己提供的函数,如:abs、 sqrt等函数。 ◆语句函数:用一个语句定义的函数,只能被其所在的 程序单元使用。 ◆函数子程序,即外部函数:用户定义的子程序,可以 被其它子程序、主程序调用,但不能自己调用自己。 51子程序 2021/2/24
10 2021/2/24 ⑹ 函数子程序是一个独立的程序单元,函数体内所用 的变量、语句标号等的作用范围仅局限于本子程序内。 每个函数子程序仅通过函数名和虚参(或公用区)与其它 的子程序以及主程序建立联系。 小结:Fortran77中有三种形式的函数 内部函数: 语句函数: 函数子程序,即外部函数: 是Fortran系统自己提供的函数,如:abs、 sqrt等函数。 用一个语句定义的函数,只能被其所在的 程序单元使用。 用户定义的子程序,可以 被其它子程序、主程序调用,但不能自己调用自己。 §1 子程序