资源描述:
《FORTRAN90程序设计教程 第8章 子程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第八章子程序8.1语句函数8.2函数子程序8.3子例行程序8.4程序单元之间的数据传递8.5递归调用8.6数据共用存储单元与数据块子程序8.7内部子程序8.8模块8.9程序举例子程序是构造大型程序的有效工具,一个实用程序(不管是系统程序还是应用程序),一般都含有多个子程序。FORTRAN90中的子程序按子程序完成的功能划分有子例行程序、函数子程序、数据块子程序等,按是否定义在某个特定的程序单元内部来划分有程序单元子程序、模块子程序以及内部(INTERNAL)子程序等,这些通称为子程序,子程序不能独立运行,它们和一种称为主程
2、序(就是本章前读者已经熟知的程序结构)的程序单元一起组成一个实用程序。一个程序可以不含子程序,但不能缺少主程序。本章讨论各种子程序的结构、功能以及子程序与主程序或子程序之间的数据交互作用。语句函数不具备子程序的一般书写特征,但其作用与子程序相同,也一并放在本章讨论。通过本章的学习,读者应能熟练地选择并设计恰当的子程序形式来构造自己的程序,从而提高程序设计能力。8.1语句函数在第二章中,读者使用过了诸如SIN(X)、SQRT(X)这些内在(INTRINSIC)函数。也有教科书称这一类函数为内部(INTERNAL)函数,但为了
3、区别另外一种内部子程序结构,本章称由FORTRAN编译器提供的函数为内在函数。这些内在函数是在程序设计过程中使用频率很高,并且一般实现比较复杂的函数。用户在使用内在函数时,并不需要对函数的实现过程进行描述,只需按照FORTRAN90手册要求使用即可,FORTRAN90编译器“认识”这些内在函数并能正确完成函数所规定的功能。但是,在实际设计过程中,用户还会遇到大量的并未包含在内在函数中的其他函数,计算这些函数时,就不能象内在函数那样仅仅使用函数名来使用这些函数,而必须在适当的地方以FORTRAN90能“理解”的形式向FORT
4、RAN90编译器说明这些非内在的函数的计算过程与参数类型,当函数的计算过程简单到可以用一个语句定义清楚时,这样的定义语句就称为语句函数。例8.1设多项式函数设计一个程序,计算f(1)、f(10)、f(12)、f(-5)的值。程序如PROGRAMEXAM1A:PROGRAMEXAM1AX=1FX=5*X**3-2*X**2+7*X+6WRITE(*,*)'f(',X,')=',FXX=10FX=5*X**3-2*X**2+7*X+6WRITE(*,*)'f(',X,')=',FXX=12FX=5*X**3-2*X**2+7*
5、X+6WRITE(*,*)'f(',X,')=',FXX=-1FX=5*X**3-2*X**2+7*X+6WRITE(*,*)'f(',X,')=',FXEND显然,程序EXAM1A不简练,把一个相同的函数表达式重复了多遍,如果能定义一个函数f(x),然后分别使用1、10等参数来调用f(x),将会有效的简化程序量,这就是本节要讨论的内容。8.1.1语句函数的定义如前所述,由于FORTRAN90的编译器不“认识”一般的函数f(x),不知道怎样计算f(x)的函数值,因而,在使用(称为函数调用)函数时,必须向FORTRAN90编
6、译器说明该函数的计算方法,这种说明过程称为函数定义。语句函数定义的一般格式是:1.语句函数名在语句函数定义格式中,f称为函数名,函数名的组成规则与变量名相同。如果没有在语句函数定义语句前用类型语句说明该函数名的数据类型,则该语句函数的函数值的类型按其函数名遵守I—N隐含规则。如f函数隐含为实型函数,而nf则隐含为整形函数。F(X,Y)=X**2+Y**2!定义了一个实型函数FINTEGERF(X,Y)=X**2+Y**2!定义了一个整型函数FNF(X,Y)=X**2+Y**2!也同样定义了一个整型函数F语句函数不能与同一
7、个程序单元中的变量同名。2.语句函数的虚参在语句函数定义语句中的函数参数称为虚参,他们本身是没有值的,只有在函数调用时才用实际参数(称为实参)代替。实参或是常数、或是一个有确定值的变量、或是一个可以计算值的表达式。虚参在形式上与普通变量相同,一个语句函数中的虚参不能同名。不同语句函数中的虚参可以同名,虚参也可以和程序中的变量同名。当没有语句对虚参的数据类型进行说明时,虚参的类型遵守I—N隐含规则;当使用了类型说明语句对虚参类型进行说明后,这种说明对于虚参以及与虚参同名的变量同时有效。INTEGERZF(X)=3*X**2+
8、5G(Y)=3*Y**2+5H(Z)=3*Z**2+5在上述程序中,函数F和G本质上是一个函数,因为对于任意的实参T,F(T)和G(T)总是相同的,但函数F、G和H有点不同,其虚参Z被说明为整型。当虚参个数多于一个时,虚参间用逗号分隔,当没有虚参时(这样的语句函数没有使用价值),函数名后的括弧也不能省略