第6章子程序
第6章 子程序
子程序是构造大型程序的有效工具,一个实用程序(不 管是系统程序还是应用程序),一般都含有多个子程序。 FORTRAN90中的子程序按子程序完成的功能划分有子 例行程序、函数子程序、数据块子程序等,按是否定义 某个特定的程序单元内部来划分有程序单元子程序 块子程序以内部( NTERNAL子程序等,这些通称为 子程序。 子程序不能独立运行,它们和一种称为主程序就是本 章前读者已经熟知的程序结构的程序单元一起组成 个实用程序。一个程序可以不含子程序,但不能缺少主 序 本章讨论各种子程序的结构、功能以及子程序与主程序 或子程序之间的数据交互作用。语句函数不具备子程序 的一般书写特征,但其作用与子程序相同,也一并放在 本章讨论。通过本章的学习,读者应能熟练地选择并设 计恰盖的子程序形式来构造自己的程序,从而提高程序 设计能力
• 子程序是构造大型程序的有效工具,一个实用程序(不 管是系统程序还是应用程序),一般都含有多个子程序。 • FORTRAN 90 中的子程序按子程序完成的功能划分有子 例行程序、函数子程序、数据块子程序等,按是否定义 在某个特定的程序单元内部来划分有程序单元子程序、 模块子程序以及内部(INTERNAL)子程序等,这些通称为 子程序。 • 子程序不能独立运行,它们和一种称为主程序(就是本 章前读者已经熟知的程序结构)的程序单元一起组成一 个实用程序。一个程序可以不含子程序,但不能缺少主 程序。 • 本章讨论各种子程序的结构、功能以及子程序与主程序 或子程序之间的数据交互作用。语句函数不具备子程序 的一般书写特征,但其作用与子程序相同,也一并放在 本章讨论。通过本章的学习,读者应能熟练地选择并设 计恰当的子程序形式来构造自己的程序,从而提高程序 设计能力
语句函数 ●S|N(X)、 SQRT(X)等由 FORTRAN编译器提供的函数为内在函数 这些内在函数是在程序设计过程中使用频率很高,并且一般 实现比较复杂的涵数。用户在使用内在函数时,并不需要对 函数的实现过程进行描述,只需按照 FORTRAN90手册要求使 用即可, FORTRAN90编译器“认识”这些内在函数并能正确 完成函数所规定的功能。 ●在实际设计过程中,用户还会遇到大量的并未包含在内在 函数中的其他函数,计算这些函数时,就不能象内在函数那 样仅仅使用函数名来使用这些函数,而必须在适当的地方以 FORTRAN90能“理解”的形式向 FORTRAN90编译器说明这些 非内在的函数的计算过程与参数类型,当函数的计算过程简 单到可以用一个语句定义清楚时,这样的定义语句就称为语 句函数
语句函数 ⚫SIN(X)、SQRT(X)等由FORTRAN编译器提供的函数为内在函数。 这些内在函数是在程序设计过程中使用频率很高,并且一般 实现比较复杂的函数。用户在使用内在函数时,并不需要对 函数的实现过程进行描述,只需按照FORTRAN 90手册要求使 用即可,FORTRAN 90编译器“认识”这些内在函数并能正确 完成函数所规定的功能。 ⚫在实际设计过程中,用户还会遇到大量的并未包含在内在 函数中的其他函数,计算这些函数时,就不能象内在函数那 样仅仅使用函数名来使用这些函数,而必须在适当的地方以 FORTRAN 90能“理解”的形式向FORTRAN 90 编译器说明这些 非内在的函数的计算过程与参数类型,当函数的计算过程简 单到可以用一个语句定义清楚时,这样的定义语句就称为语 句函数
例61设多项式函数 f(x)=5x3-2x2+7x+6 设计一个程序计算f(1)、f(10)、f(12)、f(5)的值。 程序如 PROGRAM EXAM1A: PROGRAM EXAM1A Ⅹ=12 1 FX=5*X**3-2*X**2+7*X+6 FX=5*X*3-2*X**2+7*X+6 WRITE( )f(,=,FX WRTE(*,*)")=,FX Ⅹ=-1 Ⅹ=10 FX=5*X**3-2*X**2+7*X+6 FX=5*X**3-2*X**2+7*X+6 WRTE(**)印(,)=,FX WRITE )fX,), FX END 显然,程序EXAM1A不简练,把一个相同的函数表达式重复了多遍,如 果能定义一个函数f(x),然后分别使用1、10等参数来调用fx),将会有 效的简化程序量,这就是本节要讨论的内容
例 6.1设多项式函数 设计一个程序,计算f(1)、f(10)、f(12)、f(-5)的值。 程序如PROGRAMEXAM1A : PROGRAM EXAM1A X=1 FX=5*X**3-2*X**2+7*X+6 WRITE(*,*)'f(',X,')=',FX X=10 FX=5*X**3-2*X**2+7*X+6 WRITE(*,*)'f(',X,')=',FX X=12 FX=5*X**3-2*X**2+7*X+6 WRITE(*,*)'f(',X,')=',FX X=-1 FX=5*X**3-2*X**2+7*X+6 WRITE(*,*)'f(',X,')=',FX END 显然,程序EXAM1A不简练,把一个相同的函数表达式重复了多遍,如 果能定义一个函数f(x),然后分别使用1、10等参数来调用f(x),将会有 效的简化程序量,这就是本节要讨论的内容。 ( ) 5 2 7 6 3 2 f x = x − x + x +
6.1.1语句函数的定义 如前所述,由于 FORTRAN90的编译器不“认识” 般的函数f(x),不知道怎样计算fx)的函数值,因 而,在使用(称为函数调用)函数时,必须向 FORTRAN90编译器说明该函数的计算方法,这种 说明过程称为函数定义 语句函数定义的一般格式是: x1,x2……xn)=e
6.1.1语句函数的定义 如前所述,由于FORTRAN 90 的编译器不“认识” 一般的函数f(x),不知道怎样计算f(x)的函数值,因 而,在使用(称为函数调用)函数时,必须向 FORTRAN 90编译器说明该函数的计算方法,这种 说明过程称为函数定义。 语句函数定义的一般格式是: f x x x e ( 1 , 2 ....... n ) =
1语句函数名 在语句函数定义格式中,f称为函数名,函数名的组成规则 与变量名相同。如果没有在语句函数定义语句前用类型语句 说明该函数名的数据类型,则该语句函数的函数值的类型按 其函数名遵守|-N隐含规则。如f函数隐含为实型函数,而nf 则隐含为整形函数 F(X,Y)=X*2+Y*2 !定义了一个实型函数F INTEGER F(X,Y)=X*2Y*2!定义了一个整型函数F NF(X,Y)=X**2+Y**2 !也同样定义了一个整型函数 语句函数不能与同一个程序单元中的变量同名
1.语句函数名 在语句函数定义格式中,f称为函数名,函数名的组成规则 与变量名相同。如果没有在语句函数定义语句前用类型语句 说明该函数名的数据类型,则该语句函数的函数值的类型按 其函数名遵守I—N隐含规则。如f函数隐含为实型函数,而nf 则隐含为整形函数。 F(X,Y)=X**2+Y**2 ! 定义了一个实型函数F INTEGER F(X,Y)=X**2+Y**2 ! 定义了一个整型函数F NF(X,Y)=X**2+Y**2 ! 也同样定义了一个整型函数 F 语句函数不能与同一个程序单元中的变量同名
2语句函数的虚参 在语句函数定义语句中的函数参数称为虚参,他们本身是没有值的,只有在 函数调用时才用实际参数(称为实参代替。实参或是常数、或是一个有确定 值的变量、或是一个可以计算值的表达式。虚参在形式上与普通变量相同, 个语句函数中的虚参不能同名。不同语句函数中的虚参可以同名,虚参也 可以和程序中的变量同名。 当没有语句对虚参的数据类型进行说明时,虚参的类型遵守-N隐含规则; 当使用了类型说明语句对虚参类型进行说明后,这种说明对于虚参以及与虚 参同名的变量同时有效。 INTEGER Z F(X)=3*X**2+5 G(Y)=3*Y*2+5 H(Z)=3*Z*2+5 在上述程序中,函数F和G本质上是一个函数,因为对于任意的实参T,F(T)和 G(T)总是相同的,但函数F、G和H有点不同,其虚参Z被说明为整型 当虚参个数多于一个时,虚参间用逗号分隔,当没有虚参时(这样的语句函数 没有使用价值),函数名后的括弧也不能省略
2.语句函数的虚参 在语句函数定义语句中的函数参数称为虚参,他们本身是没有值的,只有在 函数调用时才用实际参数(称为实参)代替。实参或是常数、或是一个有确定 值的变量、或是一个可以计算值的表达式。虚参在形式上与普通变量相同, 一个语句函数中的虚参不能同名。不同语句函数中的虚参可以同名,虚参也 可以和程序中的变量同名。 当没有语句对虚参的数据类型进行说明时,虚参的类型遵守I—N隐含规则; 当使用了类型说明语句对虚参类型进行说明后,这种说明对于虚参以及与虚 参同名的变量同时有效。 INTEGER Z F(X)=3*X**2+5 G(Y)=3*Y**2+5 H(Z)=3*Z**2+5 在上述程序中,函数F和G本质上是一个函数,因为对于任意的实参T,F(T)和 G(T)总是相同的,但函数F、G和H有点不同,其虚参Z被说明为整型。 当虚参个数多于一个时,虚参间用逗号分隔,当没有虚参时(这样的语句函数 没有使用价值),函数名后的括弧也不能省略
3语句函数表达式 语句函数表达式说明函数与参数的对应关系,在函数表达式中,可以包含常 量、变量、函数虚参(虚参必须包含在表达式中)、 FORTRAN90内在函数、数组 以及前面已经说明了的语句函数 4关于语句函数的进一步说明 (1)只有当函数关系简单,可以用一个语句描述函数与参数的对应关系 时,才能使用语句函数。 (2)语句函数是非执行语句,语句函数的定义语句要放在一个程序单位 的所有其他说明语句之后,并放在所有可执行语句之前。 (3)语句函数只有在本程序单元中才有意义。也就是说,不能使用其他 程序单元中的语句函数。 (4)语句函数中的虚参必须是变量,不能是常量、数组元素和内在函数 等 (5)语句函数是有类型的,因而语句函数表达式的类型一定要和其函数 名的类型相容
3.语句函数表达式 语句函数表达式说明函数与参数的对应关系,在函数表达式中,可以包含常 量、变量、函数虚参(虚参必须包含在表达式中)、FORTRAN 90内在函数、数组 以及前面已经说明了的语句函数。 4.关于语句函数的进一步说明 (1)只有当函数关系简单,可以用一个语句描述函数与参数的对应关系 时,才能使用语句函数。 (2)语句函数是非执行语句,语句函数的定义语句要放在一个程序单位 的所有其他说明语句之后,并放在所有可执行语句之前。 (3)语句函数只有在本程序单元中才有意义。也就是说,不能使用其他 程序单元中的语句函数。 (4)语句函数中的虚参必须是变量,不能是常量、数组元素和内在函数 等。 (5)语句函数是有类型的,因而语句函数表达式的类型一定要和其函数 名的类型相容
6.1.2语句函数的调用 语句函数一经定义,就可以在同一个程序单元中调用它,调用的形式和内在 函数完全相同。 函数调用要注意以下两个问题 1.调用时可以使用常量、变量、内在函数以及它们的表达式作为实参代替 对应的虚参位置,但要保证实参与虚参具有完全相同的类型,并且实参是可 以计算值的(即调用前实参中包含的变量全部已经赋值。 2.实参和虚参个数相同。 例62用函数语句的方法设计例61 PROGRAM EXAM1B NTEGERⅩ F(X)=5*X**3-2*X*2+7*X+6 WRTE(**)F(2)F(10),F(12),F(-2) END
6.1.2 语句函数的调用 语句函数一经定义,就可以在同一个程序单元中调用它,调用的形式和内在 函数完全相同。 函数调用要注意以下两个问题: 1.调用时可以使用常量、变量、内在函数以及它们的表达式作为实参代替 对应的虚参位置,但要保证实参与虚参具有完全相同的类型,并且实参是可 以计算值的(即调用前实参中包含的变量全部已经赋值。) 2. 实参和虚参个数相同。 例 6.2用函数语句的方法设计例6.1 PROGRAM EXAM1B INTEGER X F(X)=5*X**3-2*X**2+7*X+6 WRITE(*,*)F(2),F(10),F(12),F(-2) END
62函数子程序 语句函数由于要求在一个语句中完成函数的定义,因而它只能解决一些较 简单的问题,当函数关系比较复杂,用一个语句无法定义时,语句函数就 无能为力了,这时需要用到函数子程序。 6.2.1函数子程序的定义 函数子程序是以保留字 FUNCTION开头,并以保留字END结束的 个程序段,该程序段可以独立存储为一个文件,也可以和调用 它的程序单元合并存储为一个程序文件。函数子程序的定义格式 是 [类型说明] FUNCTION函数名(虚参表) 函数体 END 函数名的命名方法与变量名相同,虚参可以是简单变量和数组变 量,但不能是常数、数组元素、表达式)
6.2 函数子程序 语句函数由于要求在一个语句中完成函数的定义,因而它只能解决一些较 简单的问题,当函数关系比较复杂,用一个语句无法定义时,语句函数就 无能为力了,这时需要用到函数子程序。 6.2.1 函数子程序的定义 函数子程序是以保留字 FUNCTION 开头,并以保留字 END结束的 一个程序段,该程序段可以独立存储为一个文件,也可以和调用 它的程序单元合并存储为一个程序文件。函数子程序的定义格式 是: [类型说明] FUNCTION 函数名(虚参表) 函数体 END 函数名的命名方法与变量名相同,虚参可以是简单变量和数组变 量,但不能是常数、数组元素、表达式)