Fortran子程序(精品).ppt

上传人:hyn****60 文档编号:71799996 上传时间:2023-02-06 格式:PPT 页数:39 大小:202.50KB
返回 下载 相关 举报
Fortran子程序(精品).ppt_第1页
第1页 / 共39页
Fortran子程序(精品).ppt_第2页
第2页 / 共39页
点击查看更多>>
资源描述

《Fortran子程序(精品).ppt》由会员分享,可在线阅读,更多相关《Fortran子程序(精品).ppt(39页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第八章第八章 子程序子程序语句函数语句函数函数子程序函数子程序子例行程序子例行程序程序单元之间的数据传递程序单元之间的数据传递递归调用递归调用数据共用存储单元与数据块子程序数据共用存储单元与数据块子程序内部子程序内部子程序模块模块8.1语句函数语句函数语句函数语句函数用一个语句定义的函数。用一个语句定义的函数。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*X+6WRITE(*,*)f(,X,)=,FX

2、X=-1FX=5*X*3-2*X*2+7*X+6WRITE(*,*)f(,X,)=,FXENDP125例例8.1求函数求函数在在x=1,10,12,-5时的值。时的值。一、语句函数的定义一、语句函数的定义定义格式:定义格式:f:语句函数名,:语句函数名,x:虚参,:虚参,e:表达式:表达式1.语句函数名语句函数名函数名的组成规则与变量名相同函数名的组成规则与变量名相同语句函数不能与同一个程序单元中的变量同名。语句函数不能与同一个程序单元中的变量同名。可在语句函数定义语句前用类型语句说明该函数名可在语句函数定义语句前用类型语句说明该函数名的数据类型,否则该语句函数的函数值的类型按其的数据类型,否

3、则该语句函数的函数值的类型按其函数名遵守函数名遵守ININ隐含规则。隐含规则。F(X,Y)=X*2+Y*2!定义了一个实型函数定义了一个实型函数FNF(X,Y)=X*2+Y*2!定义了一个整型函数定义了一个整型函数NF INTEDERFF(X,Y)=X*2+Y*2!定义了一个整型函数定义了一个整型函数F2.语句函数的虚参语句函数的虚参虚参的类型遵守变量的说明规则虚参的类型遵守变量的说明规则实参可以是常量、变量或表达式实参可以是常量、变量或表达式不同语句函数中的虚参可以同名,虚参也可以和程不同语句函数中的虚参可以同名,虚参也可以和程序中的变量同名。序中的变量同名。函数函数F和和G本质上是一个函数

4、,因为对于任意的实本质上是一个函数,因为对于任意的实参参T,F(T)和和G(T)总是相同的,但函数总是相同的,但函数F、G和和H有有点不同,其虚参点不同,其虚参Z被说明为整型。被说明为整型。INTEGER Z INTEGER Z F(X)=3*X*2+5F(X)=3*X*2+5G(Y)=3*Y*2+5 G(Y)=3*Y*2+5 H(Z)=3*Z*2+5H(Z)=3*Z*2+53.语句函数表达式语句函数表达式表达式中必须包括语句函数的虚参,还可以包含表达式中必须包括语句函数的虚参,还可以包含常量、变量、内部函数、外部函数、已定义过的常量、变量、内部函数、外部函数、已定义过的语句函数。语句函数。函

5、数用一条语句可以定义时,才用语句函数的函数用一条语句可以定义时,才用语句函数的形式定义函数。形式定义函数。注意:注意:语句函数定义语句是非执行语句,放在本程序语句函数定义语句是非执行语句,放在本程序单位中的所有执行语句之前,说明语句之后。单位中的所有执行语句之前,说明语句之后。语句函数只在本程序单位中有意义。语句函数只在本程序单位中有意义。表达式的类型与函数名的类型应一致。表达式的类型与函数名的类型应一致。二、语句函数的调用二、语句函数的调用例例 8.2 8.2 用函数语句的方法设计例用函数语句的方法设计例8.18.1PROGRAM EXAM1BPROGRAM EXAM1B INTEGER X

6、 INTEGER X F(X)=5*X*3-2*X*2+7*X+6 F(X)=5*X*3-2*X*2+7*X+6 WRITE(*,*)F(2),F(10),F(12),F(-2)WRITE(*,*)F(2),F(10),F(12),F(-2)ENDEND实参可以是常量、变量或表达式实参可以是常量、变量或表达式实参的个数、类型与虚参个数、类型对应一致实参的个数、类型与虚参个数、类型对应一致8.2函数子程序函数子程序一、一、函数子程序的定义函数子程序的定义类型说明类型说明FUNCTION函数名函数名(虚参表虚参表)函数体函数体END函数名的作用:函数的标识函数名的作用:函数的标识 代表该函数的函数

7、值代表该函数的函数值虚参可以是变量名、数组名、子程序名虚参可以是变量名、数组名、子程序名返回调用程序之前:返回调用程序之前:函数名函数名=表达式表达式当未进行说明时,函数值的类型遵守当未进行说明时,函数值的类型遵守I-NI-N规则。规则。函数类型的说明方法:函数类型的说明方法:1在函数定义时说明,如:在函数定义时说明,如:INTEGERFUNCTIONF1(X1,X2.XN)函数体函数体END2.在函数体中说明,如:在函数体中说明,如:FUNCTIONF1(X1,X2.XN)INTEGERF1函数体函数体END虚参的类型在函数体中说明,否则遵守虚参的类型在函数体中说明,否则遵守I-NI-N规则

8、。规则。二、函数子程序的调用二、函数子程序的调用P130 P130 例例8.4 8.4 用用函函数数子子程程序序的的方方法法设设计计一一个个程程序序,求求50-10050-100内的所有素数及其和。内的所有素数及其和。分分析析:设设计计一一个个函函数数子子程程序序 PRIME(N)PRIME(N),函函数数PRIMEPRIME的值定义如下:的值定义如下:主主程程序序的的任任务务是是将将50-10050-100之之间间的的每每个个数数依依次次调调用用PRIMEPRIME函函数数子子程程序序,求求出出那那些些使使PRIMEPRIME函函数数值值为为1 1的的自自然数并求这些数的和。然数并求这些数的

9、和。函数子程序如下:函数子程序如下:FUNCTIONPRIME(N)INTEGERPRIME!定义!定义PRIME是整型函数是整型函数PRIME=0DOI=2,N-1IF(MOD(N,I)=0)RETURNENDDOPRIME=1!参数!参数N无任何因子,函数值为无任何因子,函数值为1END运行结果如下:运行结果如下:.83 83 89 89 97 97 S=732.000000 S=732.000000主程序如下:主程序如下:PROGRAMEXAM3INTEGERPRIME!说明要调用的函数!说明要调用的函数PRIME为整型为整型S=0DOI=50,100IF(PRIME(I)=1)THEN

10、S=S+IWRITE(*,*)IENDIFENDDOWRITE(*,*)S=,SEND分分析析:函函数数子子程程序序NUM(NNUM(N,I)I),当当I=100I=100时时,函函数数NUMNUM返返回回N N的的百百位位上上的的数数;当当I=10I=10时时,NUMNUM返返回回N N的的十十位位上上的的数数,I=1I=1时时,NUMNUM返回返回N N的个位上的数。程序如下:的个位上的数。程序如下:PROGRAMFLOWERDOI=100,999IF(NUM(I,100)*3+NUM(I,10)*3+NUM(I,1)*3=I)THENWRITE(*,*)IENDIFENDDOENDP13

11、1 P131 例例 8.5 8.5 当当一一个个数数各各个个数数位位的的立立方方和和等等于于这这个个数数本本身身时时,称称这这样样的的数数为为水水仙仙花花数数(如如153=1*3+5*3+3*3)153=1*3+5*3+3*3)。编编程程:求求100-999100-999之间的水仙花数。之间的水仙花数。FUNCTIONNUM(N,I)SELECTCASE(I)CASE(100)NUM=N/100!用!用N百位上的数赋值给函数名百位上的数赋值给函数名CASE(10)NUM=MOD(N/10,10)!用!用N十位上的数赋值给函数名十位上的数赋值给函数名CASE(1)NUM=MOD(N,10)!用!

12、用N个位上的数赋值给函数名个位上的数赋值给函数名ENDSELECTEND程序运行结果如下:程序运行结果如下:153370371407SUBROUTINE子程序名子程序名(虚参表虚参表)子例行程序体子例行程序体END8.3子例行程序子例行程序CALL子例行程序名子例行程序名(实参表实参表)函函数数子子程程序序的的名名字字代代表表一一个个值值,因因而而是是有有类类型型的的,而而子子例行程序的名字不代表一个值,因而其例行程序的名字不代表一个值,因而其名字没有类型名字没有类型问题。问题。在在子子例例行行程程序序中中求求出出的的值值通通过过实实参参与与虚虚参参的的联联系系带带回回调用程序单位。调用程序单

13、位。一、子例行程序的定义一、子例行程序的定义二、子例行程序的调用二、子例行程序的调用PROGRAMEXAM5PARAMETER(N=20)DIMENSIONA(N)INTEGERAA(1)=17!该语句及随后的三个语句生成数组!该语句及随后的三个语句生成数组ADOI=2,20A(I)=MOD(19*A(I-1),1024)ENDDODOI=1,N-1!二重循环完成对!二重循环完成对A的排序的排序DOJ=I+1,NCALLSWAP(A(I),A(J)ENDDOENDDOWRITE(*,200)(A(I),I=1,N)200FORMAT(2(2X,10(I5,X)/)ENDP133 P133 例例

14、 8.7 8.7 随机生成一个含随机生成一个含2020个元素的数组,对该数组按升序排序。个元素的数组,对该数组按升序排序。子例行程序和函数子程序在使用上可以相互替代。如子例行程序和函数子程序在使用上可以相互替代。如果只需要一个返回值时,以采用函数子程序比较方便;如果只需要一个返回值时,以采用函数子程序比较方便;如果子程序没有返回值,或希望通过子程序得到一批数据时,果子程序没有返回值,或希望通过子程序得到一批数据时,则采用子例行程序较为方便。则采用子例行程序较为方便。子例行程序子例行程序SWAP(MSWAP(M,N)N)的功能是,若的功能是,若MN,MN,就交换就交换M M、N N的的值,程序段

15、如下:值,程序段如下:SUBROUTINESWAP(X,Y)INTEGERX,Y,TIF(XY)THENT=XX=YY=TENDIFENDPROGRAMEXAM6PARAMETER(M=3,N=4)DIMENSIONA(M,N),B(N,M)INTEGERA,BWRITE(*,*)pleaseinputa3x4MatraREAD(*,200)(A(I,J),J=1,N),I=1,M)CALLTRAN(A,B,M,N)WRITE(*,300)(B(I,J),J=1,M),I=1,N)200FORMAT(4I4)300FORMAT(3I4)ENDP134 P134 例例 8.8 8.8 设计一个子

16、例行程序,求任意矩阵的转置矩阵。设计一个子例行程序,求任意矩阵的转置矩阵。子例行程序子例行程序TRAN(ATRAN(A,B B,M M,N)N)将矩阵将矩阵A A转置后放矩阵转置后放矩阵B B,M M、N N分别是矩阵分别是矩阵A A、B B的行数和列数。的行数和列数。运行情况:运行情况:pleaseinputa3x4Matra 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 9 10 11 12 9 10 11 12显示结果如下:显示结果如下:1 5 91 5 9 2 6 10 2 6 10 3 7 11 3 7 11 4 8 12 4 8 12子例行程序如下:子例行程序如下

17、:SUBROUTINETRAN(A,B,M,N)INTEGERA(M,N),B(N,M),M,NDOI=1,MDOJ=1,NB(J,I)=A(I,J)ENDDOENDDOEND实参与虚参共用同一个存储单元,实参的值就是对应实参与虚参共用同一个存储单元,实参的值就是对应虚参的值,虚参的值改变时,对应实参的值也同时改变。虚参的值,虚参的值改变时,对应实参的值也同时改变。A B X Y8.4实参和虚参之间的数据传递实参和虚参之间的数据传递一、变量作为虚参一、变量作为虚参1实参是变量或数组元素实参是变量或数组元素FUNCTIONSUB(A,B)PROGRAMTTEMX=3.Y=-5S=S+SUB(X,

18、Y).ENDEND当用常量或表达式作为实参时,是将该值赋值给对当用常量或表达式作为实参时,是将该值赋值给对应的虚参。此种情况下,子程序中对应的应的虚参。此种情况下,子程序中对应的虚参变量的值虚参变量的值不能改变不能改变,否则结果难以预料。,否则结果难以预料。2实参是常量或表达式实参是常量或表达式二二.数组名作为虚参数组名作为虚参实参为同一类型的数组名时,将实参数组的第一个元素实参为同一类型的数组名时,将实参数组的第一个元素的存储地址传送给子程序,作为虚参数组第一个元素的存储的存储地址传送给子程序,作为虚参数组第一个元素的存储地址,从而使两者共用一片存储单元。地址,从而使两者共用一片存储单元。实

19、参可以是与虚参类型相同的数组名或数组元素。实参可以是与虚参类型相同的数组名或数组元素。1虚参数组为数值型或逻辑型数据虚参数组为数值型或逻辑型数据当实参是一个数组元素时,将当实参是一个数组元素时,将该元素的存储该元素的存储地址传送给子地址传送给子程序,作为虚参数组的程序,作为虚参数组的第一个元素的存储地址第一个元素的存储地址,从而使虚参数,从而使虚参数组与实参自该元素以后的元素共用一片存储单元。组与实参自该元素以后的元素共用一片存储单元。虚参数组最后一个元素必须落在对应实参数组的范围内。虚参数组最后一个元素必须落在对应实参数组的范围内。实参和虚参间的元素按存储顺序对应,不要求两者的行列实参和虚参

20、间的元素按存储顺序对应,不要求两者的行列数相同。数相同。例:例:Programmaindimensiona(2,4)callsub(a)EndSubroutinesub(b)dimensionb(6)enda(1,1)a(2,1)a(1,2)a(2,2)a(1,3)a(2,3)a(1,4)a(2,4)b(1)b(2)b(3)b(4)b(5)b(6)例:例:Programmaindimensiona(8)callsub(a(3)EndSubroutinesub(b)dimensionb(4)enda(1)a(2)a(3)a(4)a(5)a(6)a(7)a(8)b(1)b(2)b(3)b(4)如如

21、P136:PROGRAMTTSTFUNCTIONSUB2(X)DIMENSIONA(3,4)DIMENSIONX(2,6)DOI=1,3S=0DOJ=1,4DOI=1,2A(I,J)=I+JDOJ=1,6ENDDOIF(MOD(I+J,3)=0)THENENDDOS=S+X(I,J)WRITE(*,*)SUB2(A)ENDIFENDENDDOENDDOSUB2=SENDa(1,1)a(2,1)a(3,1)a(1,2)a(2,2)a(3,2)a(1,3)a(2,3)a(3,3)a(1,4)a(2,4)a(3,4)x(1,1)x(2,1)x(1,2)x(2,2)x(1,3)x(2,3)x(1,4)

22、x(2,4)x(1,5)x(2,5)x(1,6)x(2,6)当虚参为字符型数据时当虚参为字符型数据时(当然对应的实参也为字符型当然对应的实参也为字符型数据数据),实参和虚参不是按照数组元素的顺序对应,而是,实参和虚参不是按照数组元素的顺序对应,而是按照字符位置一一对应。按照字符位置一一对应。实参、虚参两者的元素对应关系是:实参、虚参两者的元素对应关系是:A(1,1)X(1,1),A(2,1)X(2,1),A(3,1)X(1,2)A(1,2)X(2,2),A(2,2)X(1,3),A(3,2)X(2,3)A(1,3)X(1,4),A(2,3)X(2,4),A(3,3)X(1,5)A(1,4)X(

23、2,5),A(2,4)X(1,6),A(3,4)X(2,6)2虚参为字符型数据虚参为字符型数据3可调数组可调数组虚参数组的维界是整型虚参数组的维界是整型虚参虚参变量变量可调数组只能作为虚参使用。可调数组只能作为虚参使用。ProgrammainDimensiona(10),b(4,3)m1=4m2=3Callsub(a,10,b,m1,m2)EndSubroutinesub(x,nx,y,n1,n2)Dimensionx(nx),y(n1,n2)end在虚参表中允许出现子程序名。在虚参表中允许出现子程序名。三三.子程序名作为虚参子程序名作为虚参SUBROUTINESUB(A,N,X,F,P)DI

24、MENSIONA(N)Y=F(I)+1X=A(I)+1CALLPEND强调:只需对实参的属性进行说明。强调:只需对实参的属性进行说明。实参代表的函数名或子例行程实参代表的函数名或子例行程序名要求在程序中实际存在。序名要求在程序中实际存在。在调用程序单位中,实参中的子程序名(函在调用程序单位中,实参中的子程序名(函数子程序即外部函数,和子例行程序名)必须用数子程序即外部函数,和子例行程序名)必须用EXTERNAL对实参程序名作出说明;内部函数对实参程序名作出说明;内部函数名必须用名必须用INTRINSIC语句说明,说明语句必须语句说明,说明语句必须放在该程序段的所有可执行语句前。放在该程序段的所

25、有可执行语句前。P137例例8.9设有三个连续函数:设有三个连续函数:每个小区间的宽度为每个小区间的宽度为:h=(h=(b-a)/nb-a)/n第第i i个小矩形的面积:个小矩形的面积:s si i=h*f(a+(i-1)*h)=h*f(a+(i-1)*h)FUNCTIONH(X)!被积函数被积函数H(X)H=1/(1+X*2)END三个被积函数不同,求其函数值的方法也就不同,定义三三个被积函数不同,求其函数值的方法也就不同,定义三个被积函数个被积函数F(X)F(X)、G(X)G(X)、H(X)H(X)的函数子程序:的函数子程序:FUNCTIONF(X)!被积函数!被积函数F(X)F=SIN(

26、3*X)+COS(X)ENDFUNCTIONG(X)!被积函数!被积函数G(X)G=5*X*3+2*X-10END用矩形方法求函数积分的方法都相同,设计一个统一的函数子用矩形方法求函数积分的方法都相同,设计一个统一的函数子程序,含有虚参函数名,并用被积函数作为实参来调用该函数程序,含有虚参函数名,并用被积函数作为实参来调用该函数子程序。子程序。FUNCTIONSIMPSON(F,a,b,n)integern,is=0.0h=(b-a)/ndoi=1,ns=s+h*F(a+(i-1)*h)enddoSIMPSON=send每个小区间的宽度为每个小区间的宽度为:h=(h=(b-a)/nb-a)/n

27、第第i i个小矩形的面积:个小矩形的面积:s si i=h*f(a+(i-1)*h)=h*f(a+(i-1)*h)PROGRAMSIMPSON_PROEXTERNALF,G,H!定义三个被积函数为外部函数!定义三个被积函数为外部函数REALI1,I2,I3I1=SIMPSON(F,0,2*3.1416,100)!计算计算F(X)的积分的积分I2=SIMPSON(G,0,10.0,100)I3=SIMPSON(H,0,1.0,100)WRITE(*,*)I1=,I1WRITE(*,*)I2=,I2WRITE(*,*)I3=,I3END作业:P174 6,9,13补1:用语句函数编程序,用牛顿迭代

28、法求:X3-2x2+x-1=0在x=1.5附近的实根补2:设计一个函数子程序,求大奖赛评委的评分,要求用可调数组。补3:用子例行程序将一维数组逆序存放,要求用可调数组。补补1:用语句函数编程序,用牛顿迭代法求:用语句函数编程序,用牛顿迭代法求:x3-2x2+x-1=0在在x=1.5附近的实根附近的实根f(x)=x*x*x-2*x*x+x-1f1(x)=3*x*x-4*x+1x=1.5d=1.0dowhile(abs(d)1.0e-6)d=f(x)/f1(x)x=x-denddoprint*,Therootis,xendP174 6 P174 6 设计一个计算设计一个计算n!n!的函数子程序,并

29、调用该函数子程序的函数子程序,并调用该函数子程序计算:计算:realfunctionfun(n)integern,ireal:p=1doi=1,np=p*ienddofun=pendprogrammaininteger:i=1real:e=1,nn=1.0dowhile(na(j)thentemp=a(i);a(i)=a(j);a(j)=tempendifenddoenddoelseif(k=0)thendoi=1,n-1doj=i+1,nif(a(i)max)max=a(i)if(a(i)min)min=a(i)enddoaverage=(sum-max-min)*1.0/(n-2)Endfunctionaverage补补3 3:用子例行程序将一维数组逆序存放,要求用可调数组。:用子例行程序将一维数组逆序存放,要求用可调数组。program main parameter(n=10)integer a(n)read*,a call resve(a,n)print*,aEnd program mainsubroutine resve(a,n)integer:a(n),i,temp do i=1,n/2 temp=a(i)a(i)=a(n-i+1)a(n-i+1)=temp enddoEnd subroutine resve

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com