FORTRAN语言第8章(共8章).ppt
《FORTRAN语言第8章(共8章).ppt》由会员分享,可在线阅读,更多相关《FORTRAN语言第8章(共8章).ppt(88页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八讲 子程序 在程序设计中,常会遇到某些程序段需多次重复使用,为此,将这些需要重复使用的程序段单独编制成子程序,该子程序用以实现某些特定功能(例如:计算平均值、计算方差等)并可供其它程序单元多次调用,以处理不同的数据。谢谢支持!谢谢支持!l你的支持是我共享的动力,请帮个忙(不花你的支持是我共享的动力,请帮个忙(不花3分钟):分钟):l注册以下网站:(只需注册就可以的,谢谢!)注册以下网站:(只需注册就可以的,谢谢!)lhttp:/ 子程序 Fortran的应用程序一般由一个主程序和若干个子程序组成。主程序或子程序分别是一个独立的程序单元。主程序单元为Fortran应用程序提供程序执行的入口。
2、Fortran应用程序必须有一个且只能有一个主程序单元。主程序单元可以调用子程序单元,各子程序单元之间也可互相调用。调用子程序的程序单元称为调用程序单元,被调用的子程序单元称为被调用程序单元。第八讲 子程序 Fortran的子程序单元有函数子程序、子例行程序和数据块子程序。函数子程序单元用以计算一个值。子例行程序单元不仅可以计算一个或一批值,还可进行某些非数值计算。数据块子程序单元用以给公用区中的数据赋初值。第八讲 子程序8.1 语句函数语句函数8.5 可调数组可调数组8.2 函数子程序函数子程序8.3 子例行子程序子例行子程序8.4 虚实结合虚实结合8.6 程序举例程序举例8.1语句函数l语
3、句函数语句函数通过一句代码定义来实现某种特定的处通过一句代码定义来实现某种特定的处理功能,它是理功能,它是Fortran 77时代的遗留产物。严格时代的遗留产物。严格来说,语句函数不属于程序单元的范畴。但是在来说,语句函数不属于程序单元的范畴。但是在实际应用中,语句函数以其灵活的应用、小巧的实际应用中,语句函数以其灵活的应用、小巧的结构在程序中发挥着重要的作用。结构在程序中发挥着重要的作用。l在实际的编程过程中,程序员往往会遇到这种情在实际的编程过程中,程序员往往会遇到这种情况:况:一些简单的函数一些简单的函数会在一个程序单元中的不同会在一个程序单元中的不同地方地方重复用到重复用到,而,而Fo
4、rtran系统并不提供这种内部系统并不提供这种内部函数。此时可采用语句函数。函数。此时可采用语句函数。一、语句函数的概念引例:计算W0.2P(X)+0.3P(Y)+0.5P(Z)其中P(T)=0.812T3+1.256T2-3.378T+0.689WRITE(*,*)请输入X,Y,Z的值:READ(*,*)X,Y,ZP1 0.812*X*3+1.256*X*2-3.378*X+0.689P2 0.812*Y*3+1.256*Y*2-3.378*Y+0.689P3 0.812*Z*3+1.256*Z*2-3.378*Z+0.689W0.2*P1+0.3*P2+0.5*P3WRITE(*,*)WE
5、ND重复使用同一公式多遍,程序不简练如果能定义一个函数如果能定义一个函数p(t),然后分别使用,然后分别使用x,y,z等参数来调用等参数来调用p(t),将会有效简化程序量:,将会有效简化程序量:P(T)0.812*T*3+1.256*T*2-3.378*T+0.689WRITE(*,*)请输入X,Y,Z的值:READ(*,*)X,Y,ZP1P(X)P2 P(Y)P3 P(Z)W0.2*P1+0.3*P2+0.5*P3WRITE(*,*)W,WEND对对语句函数的引用语句函数的引用注意:只有注意:只有当函数可以用一个表达式表示时当函数可以用一个表达式表示时才能才能定义成语句函数,而对于那些不能用
6、表达式表示的功定义成语句函数,而对于那些不能用表达式表示的功能或分段表示的函数是不能定义成能或分段表示的函数是不能定义成FORTRANFORTRAN语句函数语句函数的。的。在程序中有时可能在好几处需要进行同样的某种表达式计算,而这种计算又不是某个内部函数所能完成的,这时,程序设计者可以自已来定义一个语句函数,通过引用语句函数来实现这种特殊运算。二、语句函数的定义语句函数定义的形式:语句函数定义的形式:f_name(x,x)=e使用规定1)语句函数定义语句必须语句函数定义语句必须位于该程序段的说明语位于该程序段的说明语句之后,第一个可执行语句之前句之后,第一个可执行语句之前。它是非执行语句。它是
7、非执行语句。2)语句函数名语句函数名的命名规则与变量名相同,若语句函的命名规则与变量名相同,若语句函数前面没有用类型说明语句进行显式说明,则语句函数前面没有用类型说明语句进行显式说明,则语句函数的返回值遵循默认的数的返回值遵循默认的IN规则。在一个程序单位规则。在一个程序单位内,语句函数名不能与其它名字内,语句函数名不能与其它名字(如变量名、数组名如变量名、数组名等等)相同。相同。使用规定3)语句函数定义中的虚参语句函数定义中的虚参只能是变量名只能是变量名,不能是常不能是常量、表达式或数组元素量、表达式或数组元素,虚参表中的各虚参之间用逗,虚参表中的各虚参之间用逗号分隔,号分隔,各虚参不能同名
8、各虚参不能同名,虚参的类型说明与变量相,虚参的类型说明与变量相同。由于虚参不代表实在的变量,因此虚参名可以与同。由于虚参不代表实在的变量,因此虚参名可以与程序中的其他变量同名。程序中的其他变量同名。4)语句函数中的虚拟参数,本身没有具体的数值。)语句函数中的虚拟参数,本身没有具体的数值。只有当程序中的语句函数被引用时,用实际的变量只有当程序中的语句函数被引用时,用实际的变量(实参实参)代替虚参的情况下,才能得到语句函数的返回代替虚参的情况下,才能得到语句函数的返回值。值。SS(A(I),X,Y)=A(I)+X*YEST(A,A)=SQRT(A*4.0)+AF(X)=X*X+2*XX=3.0Z=
9、F(1.0)+F(X)WRITE(*,*)XEND5)e是含有是含有x1,x2,xn的表达式,在这个表达式的表达式,在这个表达式中,除必须包含有关虚参外,还可以包含常量,变中,除必须包含有关虚参外,还可以包含常量,变量,外部和内部函数和量,外部和内部函数和已定义过的语句函数已定义过的语句函数。语句语句函数通过表达式得到一个函数值,此函数值的类型函数通过表达式得到一个函数值,此函数值的类型必须与函数名的类型一致必须与函数名的类型一致。6)语句函数的类型即是语句函数名的类型,当语句函数的类型即是语句函数名的类型,当需要需要用类型说明语句说明语句函数名的类型时,其类型说用类型说明语句说明语句函数名的
10、类型时,其类型说明语句必须在语句函数的定义之前明语句必须在语句函数的定义之前。语句函数只能在语句函数只能在定义它的程序段使用。定义它的程序段使用。使用规定三、语句函数的引用语句函数的引用就是对语句函数定义的使用。它和内部函数一样,总是在表达式中作为一个运算分量或单独作为一个表达式出现。它的一般引用形式为:f_name(a1,a2)注:实参的个数、类型及排列顺序必须注:实参的个数、类型及排列顺序必须与相应的形参一致!与相应的形参一致!lFORTRAN允许在语句函数定义中没有形参,此允许在语句函数定义中没有形参,此时在引用时也不能有实参,但时在引用时也不能有实参,但一对括号不能省略一对括号不能省略
11、。l语句函数的引用可以嵌套。语句函数的引用可以嵌套。CONST()=SQRT(2.0)+SQRT(3.0)A=CONST()三、语句函数的引用三、语句函数的引用REALA,B,CSUM(A,B,C)A+B*B+C*3DATAA,B,C/1.0,2.0,3.0/Y1SUM(0.5,0.7,0.8)Y2SUM(2*A,B,C)Y3SUM(C,B,A)ZY1+Y2+Y3WRITE(*,*)Y1,Y2,Y3,ZENDY10.5+0.72+0.83Y22.0+2.02+3.03Y13.0+2.02+1.03语句函数的引用过程当程序执行到一个语句函数的引用时,要经过下列几个过程:当实元为表达式时,先求出表
12、达式的值,然后控制转到语句函数定义语句去执行;实元和对应的虚元进行结合,即实元的值传给虚元(称为虚实结合过程);求表达式e的值;这一过程是由计算机系统来完成的,用户可不必担心。根据语句函数名的类型和表达式e求值结果,按赋值规则得到函数引用的值由函数名带回,并控制返回到原表达式函数引用处,继续计算表达式值。语句函数的引用过程三、语句函数的引用DATAA/2.0/F(X)X+1BF(F(F(A)WRITE(*,*)BENDF(F(F(2.0)F(F(3.0)F(4.0)例例1:二分法:二分法:1、基本思路:把区间(、基本思路:把区间(x1,x2)二二等分,找到中点等分,找到中点x求出求出f(x)值
13、,然后值,然后判断判断f(x)和)和f(x1)是否同号,如同是否同号,如同号则说明根在(号则说明根在(x,x2)区间,否则,区间,否则,根在(根在(x,x1)区间。依次方法对有根区间。依次方法对有根区间再折半,直到满足条件为止。区间再折半,直到满足条件为止。例:用二分法求例:用二分法求f(x)=x3-6x-1=0在在x=2附近的一个实根附近的一个实根 区间为区间为x1=0,x2=5xyx1x2xf(x1)f(x)f(x2)0 F(X)=X*3-6.0*X-1.0100 READ(*,*)X1,X2 FX1=F(X1)FX2=F(X2)IF(FX1*FX2.GT.0.0)GOTO 10010 X
14、=(X1+X2)/2.0 FX=F(X)IF(SIGN(FX,FX1).EQ.FX)THEN X1=X FX1=FX END IF IF(SIGN(FX,FX2).EQ.FX)THEN X2=X FX2=FX END IF IF(ABS(X1-X2).GT.1E-5).AND.(ABS(FX).GT.1E-6)&GOTO 10 IF(FX.GT.1E-6)X=(X1+X2)/2.0 WRITE(*,*)X ENDSIGN(x1,x2)是是符号传递函数,符号传递函数,函数值取函数值取x2的的的的符号,取符号,取x1的绝的绝对值对值算法:弦截法的基本思路与算法:弦截法的基本思路与“二分法二分法”相
15、似,它是取相似,它是取f(x1)与与f(x2)连线与连线与x轴的轴的交点交点x,从从(x1,x)与与(x,x2)两个区间中舍两个区间中舍去一个,舍取的方法为:去一个,舍取的方法为:1、如果、如果f(x)与与f(x1)异号,则用异号,则用x作为新作为新的的x2,这就舍去了原来的这就舍去了原来的(x,x2)区间。区间。2、如果、如果f(x)与与f(x1)同号,则用同号,则用x作为新作为新的的x1,这就舍去了原来的这就舍去了原来的(x1,x)区间。区间。如果如果f(x1)与与f(x2)异号,则它们之间的连线必然交异号,则它们之间的连线必然交x轴于轴于x点点有有x=x2-(x2-x1)*f(x2)/(
16、f(x2)-f(x1)3、再根据新的再根据新的x1,x2,找到与找到与x轴的交点轴的交点x,重复上述步骤。重复上述步骤。例例 2:用语句函数采用弦截法求:用语句函数采用弦截法求X3-2X2-7X+4=0的根。的根。xf(x)0 x1x2xf(x1)f(x)f(x2)LOGICAL S F(X)=X*3-2.0*X*2-7.0*X+4.0 S(A,B)=SIGN(A,B).EQ.A10 READ(*,*)X1,X2 F1=F(X1)F2=F(X2)IF(S(F1,F2)GOTO 10 F0=1.020 IF(ABS(X1-X2).GT.1E-5).AND.(ABS(F0).GT.1E-6)THE
17、N X=X2-(X2-X1)/(F2-F1)*F2 F0=F(X)IF(S(F0,F1)THEN X1=X F1=F0 END IF IF(S(F0,F2)THEN X2=X F2=F0 END IF GOTO 20 END IF IF(ABS(F0).GT.1E-6)X=(X1+X2)/2.0 WRITE(*,*)X END语句函数小结:语语句句函函数数必必须须先先定定义义,后后引引用用。且语句函数只可在包含该语句函数定义的程序单位中引用,即不能引用其他程序单位所定义的语句函数。语句函数定义语句是非执行语句。它应该放在所有可执行语句之前和有关的类型说明语句之后。语句函数定义中的函数名和虚元是
18、具有类型的,可以用类型说明语句说明其类型 或按隐含约定确定其类型。如:INTEGER G,X,YG(X,Y,N)=X*X+N*Y以上语句说明G函数是整型函数,即函数值为整型,且说明虚元X,Y为整型,隐含约定N为整型。语句函数小结:在语句函数定义的语句中,也可出现其他的语句函数引用,但被引用的语句函和须在它前面已定义。不允许引用自身或在它后面定义的语句函数。例:S(A,B,C)=(A+B+C)/2.0PP(A,B,C)=SQRT(S(A,B,C)A)PP 函数引用了它前面所定义的S函数语句函数小结:引用语句函数时,给定的实元必须和对应的虚元个数相等,类型一致,位置相符。在进行虚实结合时,虚元与实
19、元不是以名字相同传值,而是按位置类型一一传值。语句函数小结:例:F(X)=XXX1.0X=3.0Y=(X+3.0)/2.0Z=F(1.0)+F(2.0)+F(3.0)T=F(X)在同一程序单位中不允许变量名与函数名同名,但允许变量与虚元同名。程序第一行的X是语句函数的虚拟参数,第二行的X是变量名,它们彼此独立,无任何关系。第三行计算出Y的值等于2.0。第四行引用语句函数,分别将1.0,2.0,3.0代替语句函数定义语句中右边表达式的X,计算出F(1.0),F(2.0),F(3.0)。第五行F(x)中的X是变量名,其值为3.0,此时F(X)相当于F(3.0)8.2 函数子程序(外部函数)语句函数
20、只能用一个语句定义,而且只能在定义它的程序段中使用。分析:函数分析:函数f(X)是用两个表达式定义的,不是用两个表达式定义的,不能用简单的语句函数来表示。怎么办?能用简单的语句函数来表示。怎么办?FORTRAN提供了一种方法,就是把函数的提供了一种方法,就是把函数的计算部份从程序中独立出来,并按一定的格计算部份从程序中独立出来,并按一定的格式编成一个单独的子程序段,称为外部函数式编成一个单独的子程序段,称为外部函数或函数子程序。或函数子程序。8.2 函数子程序(外部函数)DIMENSIONX(10)READ(*,*)X Y=0.0 DO 1 I=1,10 Y=Y+F(X(I)1 CONTINU
21、E2 Y=Y/10.03 WRITE(*,*)Y=,Y4 ENDFUNCTIONF(X)IF(X.GE.0)F=2*X+1IF(X.LT.0)F=-3*X+1END引引用用返回返回一、引例二、外部函数的定义函数子程序通常称为外部函数,它也是根据程序设计者的需要由自己定义的函数。和语句函数不同的是,函数子程序是一个由若干语句组成的独立的程序单位。当某些函数的值不可能用一条语句来求得时,就可借助函数子程序来定义一个函数。二、外部函数的定义一般形式:一般形式:类型说明类型说明 FUNCTION FUNCTION 函数名函数名(虚参表虚参表)函数子程序体函数子程序体 ENDEND FUNCTION F
22、UNCTION 函数名函数名(虚参表虚参表)类型说明类型说明 函数名函数名 函数子程序体函数子程序体 ENDEND说明:1 1、FUNCTIONFUNCTION语句语句 FUNCTION语句是函数子程序的声明语句。它语句是函数子程序的声明语句。它表示函数子程序定义开始。同时给出函数子程序所表示函数子程序定义开始。同时给出函数子程序所需的各种虚拟参数需的各种虚拟参数(简称虚参、形参简称虚参、形参),在函数子程,在函数子程序调用之前虚参没有值,只有函数子程序被调用时,序调用之前虚参没有值,只有函数子程序被调用时,由调用程序单元将实在参数由调用程序单元将实在参数(简称实参简称实参)的数据传递的数据传
23、递给虚参,虚参才有数据。当有多个虚参时,必须用给虚参,虚参才有数据。当有多个虚参时,必须用逗号将虚参隔开逗号将虚参隔开;若没有虚参时,括号不能省略。虚参可以是变量名、数组名、子程序名。说明:1 1、FUNCTIONFUNCTION语句语句函数名函数名用以标识函数子程序的名称,它在函数体用以标识函数子程序的名称,它在函数体中存放函数值,故中存放函数值,故函数名具有类型函数名具有类型,函数名的命名,函数名的命名方法与变量名相同。类型说明用来显式说明函数名方法与变量名相同。类型说明用来显式说明函数名的类型,若省略类型说明,则按的类型,若省略类型说明,则按I-N规则确定函数规则确定函数名的类型。名的类
24、型。例例:function:function rdh(n,hrdh(n,h)实型函数实型函数 Integer function Integer function rdh(n,hrdh(n,h)整型函数整型函数说明:2 2、函数体、函数体包括包括说明语句说明语句(对虚参变量和实参变量的说明,也包括对虚参变量和实参变量的说明,也包括对函数中所用变量、数组和符号常量的说明对函数中所用变量、数组和符号常量的说明)和和执行语执行语句句(用来完成求函数值的运算。在程序的执行流程返回用来完成求函数值的运算。在程序的执行流程返回调用程序之前,调用程序之前,必须把所求得的函数值返回给函数名必须把所求得的函数值返
25、回给函数名)。由于函数子程序的计算结果由于函数子程序的计算结果(即函数值即函数值)存放存放在函数名中,故函数名必须在函数体中,至少在函数名中,故函数名必须在函数体中,至少要有一次出现在赋值语句的左边,即:要有一次出现在赋值语句的左边,即:函数名=表达式说明:2 2、函数体、函数体 RETURN语句只允许出现在子程序中,可以有语句只允许出现在子程序中,可以有任意多条,并可放在任何位置。任意多条,并可放在任何位置。END语句在子程序语句在子程序中只能有一条。而且必须放在子程序的最后,不能中只能有一条。而且必须放在子程序的最后,不能省略,但省略,但RETURN语句可省略。语句可省略。三、函数子程序的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FORTRAN 语言
限制150内