FORTRAN语言第8章(共8章).ppt

上传人:tia****nde 文档编号:11496197 上传时间:2020-04-25 格式:PPT 页数:88 大小:3.07MB
返回 下载 相关 举报
FORTRAN语言第8章(共8章).ppt_第1页
第1页 / 共88页
FORTRAN语言第8章(共8章).ppt_第2页
第2页 / 共88页
FORTRAN语言第8章(共8章).ppt_第3页
第3页 / 共88页
点击查看更多>>
资源描述
第八讲子程序,在程序设计中,常会遇到某些程序段需多次重复使用,为此,将这些需要重复使用的程序段单独编制成子程序,该子程序用以实现某些特定功能(例如:计算平均值、计算方差等)并可供其它程序单元多次调用,以处理不同的数据。,第八讲子程序,Fortran的应用程序一般由一个主程序和若干个子程序组成。主程序或子程序分别是一个独立的程序单元。主程序单元为Fortran应用程序提供程序执行的入口。Fortran应用程序必须有一个且只能有一个主程序单元。主程序单元可以调用子程序单元,各子程序单元之间也可互相调用。调用子程序的程序单元称为调用程序单元,被调用的子程序单元称为被调用程序单元。,第八讲子程序,Fortran的子程序单元有函数子程序、子例行程序和数据块子程序。函数子程序单元用以计算一个值。子例行程序单元不仅可以计算一个或一批值,还可进行某些非数值计算。数据块子程序单元用以给公用区中的数据赋初值。,第八讲子程序,8.1语句函数,8.5可调数组,8.2函数子程序,8.3子例行子程序,8.4虚实结合,8.6程序举例,8.1语句函数,语句函数通过一句代码定义来实现某种特定的处理功能,它是Fortran77时代的遗留产物。严格来说,语句函数不属于程序单元的范畴。但是在实际应用中,语句函数以其灵活的应用、小巧的结构在程序中发挥着重要的作用。在实际的编程过程中,程序员往往会遇到这种情况:一些简单的函数会在一个程序单元中的不同地方重复用到,而Fortran系统并不提供这种内部函数。此时可采用语句函数。,一、语句函数的概念,引例:计算W0.2P(X)+0.3P(Y)+0.5P(Z)其中P(T)=0.812T3+1.256T2-3.378T+0.689,WRITE(*,*)请输入X,Y,Z的值:READ(*,*)X,Y,ZP10.812*X*3+1.256*X*2-3.378*X+0.689P20.812*Y*3+1.256*Y*2-3.378*Y+0.689P30.812*Z*3+1.256*Z*2-3.378*Z+0.689W0.2*P1+0.3*P2+0.5*P3WRITE(*,*)WEND,如果能定义一个函数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)P2P(Y)P3P(Z)W0.2*P1+0.3*P2+0.5*P3WRITE(*,*)W,WEND,注意:只有当函数可以用一个表达式表示时才能定义成语句函数,而对于那些不能用表达式表示的功能或分段表示的函数是不能定义成FORTRAN语句函数的。,在程序中有时可能在好几处需要进行同样的某种表达式计算,而这种计算又不是某个内部函数所能完成的,这时,程序设计者可以自已来定义一个语句函数,通过引用语句函数来实现这种特殊运算。,二、语句函数的定义,语句函数定义的形式:f_name(x,x)=e,使用规定,1)语句函数定义语句必须位于该程序段的说明语句之后,第一个可执行语句之前。它是非执行语句。,2)语句函数名的命名规则与变量名相同,若语句函数前面没有用类型说明语句进行显式说明,则语句函数的返回值遵循默认的IN规则。在一个程序单位内,语句函数名不能与其它名字(如变量名、数组名等)相同。,使用规定,3)语句函数定义中的虚参只能是变量名,不能是常量、表达式或数组元素,虚参表中的各虚参之间用逗号分隔,各虚参不能同名,虚参的类型说明与变量相同。由于虚参不代表实在的变量,因此虚参名可以与程序中的其他变量同名。4)语句函数中的虚拟参数,本身没有具体的数值。只有当程序中的语句函数被引用时,用实际的变量(实参)代替虚参的情况下,才能得到语句函数的返回值。,F(X)=X*X+2*XX=3.0Z=F(1.0)+F(X)WRITE(*,*)XEND,5)e是含有x1,x2,xn的表达式,在这个表达式中,除必须包含有关虚参外,还可以包含常量,变量,外部和内部函数和已定义过的语句函数。语句函数通过表达式得到一个函数值,此函数值的类型必须与函数名的类型一致。,6)语句函数的类型即是语句函数名的类型,当需要用类型说明语句说明语句函数名的类型时,其类型说明语句必须在语句函数的定义之前。语句函数只能在定义它的程序段使用。,使用规定,三、语句函数的引用,语句函数的引用就是对语句函数定义的使用。它和内部函数一样,总是在表达式中作为一个运算分量或单独作为一个表达式出现。它的一般引用形式为:f_name(a1,a2),注:实参的个数、类型及排列顺序必须与相应的形参一致!,FORTRAN允许在语句函数定义中没有形参,此时在引用时也不能有实参,但一对括号不能省略。语句函数的引用可以嵌套。,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,ZEND,Y10.5+0.72+0.83,Y22.0+2.02+3.03,Y13.0+2.02+1.03,语句函数的引用过程,当程序执行到一个语句函数的引用时,要经过下列几个过程:,当实元为表达式时,先求出表达式的值,然后控制转到语句函数定义语句去执行;,实元和对应的虚元进行结合,即实元的值传给虚元(称为虚实结合过程);,求表达式e的值;,这一过程是由计算机系统来完成的,用户可不必担心。,根据语句函数名的类型和表达式e求值结果,按赋值规则得到函数引用的值由函数名带回,并控制返回到原表达式函数引用处,继续计算表达式值。,语句函数的引用过程,三、语句函数的引用,DATAA/2.0/F(X)X+1BF(F(F(A)WRITE(*,*)BEND,F(F(F(2.0),F(F(3.0),F(4.0),例1:二分法:,1、基本思路:把区间(x1,x2)二等分,找到中点x求出f(x)值,然后判断f(x)和f(x1)是否同号,如同号则说明根在(x,x2)区间,否则,根在(x,x1)区间。依次方法对有根区间再折半,直到满足条件为止。,例:用二分法求f(x)=x3-6x-1=0在x=2附近的一个实根区间为x1=0,x2=5,x,y,x1,x2,x,f(x1),f(x),f(x2),0,F(X)=X*3-6.0*X-1.0100READ(*,*)X1,X2FX1=F(X1)FX2=F(X2)IF(FX1*FX2.GT.0.0)GOTO10010X=(X1+X2)/2.0FX=F(X)IF(SIGN(FX,FX1).EQ.FX)THENX1=XFX1=FXENDIFIF(SIGN(FX,FX2).EQ.FX)THENX2=XFX2=FXENDIFIF(ABS(X1-X2).GT.1E-5).AND.(ABS(FX).GT.1E-6)&GOTO10IF(FX.GT.1E-6)X=(X1+X2)/2.0WRITE(*,*)XEND,SIGN(x1,x2)是符号传递函数,函数值取x2的的符号,取x1的绝对值,算法:弦截法的基本思路与“二分法”相似,它是取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)/(f(x2)-f(x1)3、再根据新的x1,x2,找到与x轴的交点x,重复上述步骤。,例2:用语句函数采用弦截法求X3-2X2-7X+4=0的根。,LOGICALSF(X)=X*3-2.0*X*2-7.0*X+4.0S(A,B)=SIGN(A,B).EQ.A10READ(*,*)X1,X2F1=F(X1)F2=F(X2)IF(S(F1,F2)GOTO10F0=1.020IF(ABS(X1-X2).GT.1E-5).AND.(ABS(F0).GT.1E-6)THENX=X2-(X2-X1)/(F2-F1)*F2F0=F(X)IF(S(F0,F1)THENX1=XF1=F0ENDIF,IF(S(F0,F2)THENX2=XF2=F0ENDIFGOTO20ENDIFIF(ABS(F0).GT.1E-6)X=(X1+X2)/2.0WRITE(*,*)XEND,语句函数小结:,语句函数必须先定义,后引用。且语句函数只可在包含该语句函数定义的程序单位中引用,即不能引用其他程序单位所定义的语句函数。,语句函数定义语句是非执行语句。它应该放在所有可执行语句之前和有关的类型说明语句之后。,语句函数定义中的函数名和虚元是具有类型的,可以用类型说明语句说明其类型或按隐含约定确定其类型。如:,INTEGERG,X,Y,G(X,Y,N)=X*X+N*Y,以上语句说明G函数是整型函数,即函数值为整型,且说明虚元X,Y为整型,隐含约定N为整型。,语句函数小结:,在语句函数定义的语句中,也可出现其他的语句函数引用,但被引用的语句函和须在它前面已定义。不允许引用自身或在它后面定义的语句函数。,例:S(A,B,C)=(A+B+C)/2.0,PP(A,B,C)=SQRT(S(A,B,C)A),PP函数引用了它前面所定义的S函数,语句函数小结:,引用语句函数时,给定的实元必须和对应的虚元个数相等,类型一致,位置相符。在进行虚实结合时,虚元与实元不是以名字相同传值,而是按位置类型一一传值。,语句函数小结:,例:,F(X)=XXX1.0,X=3.0,Y=(X+3.0)/2.0,Z=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函数子程序(外部函数),语句函数只能用一个语句定义,而且只能在定义它的程序段中使用。,分析:函数f(X)是用两个表达式定义的,不能用简单的语句函数来表示。怎么办?FORTRAN提供了一种方法,就是把函数的计算部份从程序中独立出来,并按一定的格式编成一个单独的子程序段,称为外部函数或函数子程序。,FUNCTIONF(X)IF(X.GE.0)F=2*X+1IF(X.LT.0)F=-3*X+1END,引用,返回,一、引例,二、外部函数的定义,函数子程序通常称为外部函数,它也是根据程序设计者的需要由自己定义的函数。和语句函数不同的是,函数子程序是一个由若干语句组成的独立的程序单位。当某些函数的值不可能用一条语句来求得时,就可借助函数子程序来定义一个函数。,二、外部函数的定义,一般形式:,类型说明FUNCTION函数名(虚参表)函数子程序体END,FUNCTION函数名(虚参表)类型说明函数名函数子程序体END,说明:,1、FUNCTION语句FUNCTION语句是函数子程序的声明语句。它表示函数子程序定义开始。同时给出函数子程序所需的各种虚拟参数(简称虚参、形参),在函数子程序调用之前虚参没有值,只有函数子程序被调用时,由调用程序单元将实在参数(简称实参)的数据传递给虚参,虚参才有数据。当有多个虚参时,必须用逗号将虚参隔开;若没有虚参时,括号不能省略。虚参可以是变量名、数组名、子程序名。,说明:,1、FUNCTION语句函数名用以标识函数子程序的名称,它在函数体中存放函数值,故函数名具有类型,函数名的命名方法与变量名相同。类型说明用来显式说明函数名的类型,若省略类型说明,则按I-N规则确定函数名的类型。,例:functionrdh(n,h)实型函数Integerfunctionrdh(n,h)整型函数,说明:,2、函数体包括说明语句(对虚参变量和实参变量的说明,也包括对函数中所用变量、数组和符号常量的说明)和执行语句(用来完成求函数值的运算。在程序的执行流程返回调用程序之前,必须把所求得的函数值返回给函数名)。由于函数子程序的计算结果(即函数值)存放在函数名中,故函数名必须在函数体中,至少要有一次出现在赋值语句的左边,即:函数名=表达式,说明:,2、函数体RETURN语句只允许出现在子程序中,可以有任意多条,并可放在任何位置。END语句在子程序中只能有一条。而且必须放在子程序的最后,不能省略,但RETURN语句可省略。,三、函数子程序的引用,函数子程序是不能直接执行的,只有在其他程序单位中对它引用时,才能控制转移到它的内部执行。调用函数子程序目的是将外部函数子程序的计算结果(即函数值)作为表达式的一个运算分量参与表达式的运算。函数子程序的调用可以出现在表达式出现的任何地方,即只能出现在赋值语句的右边或WRITE语句中。,三、函数子程序的引用,调用函数子程序时应注意的问题在调用程序中,必须对被调用的函数子程序名如变量那样进行类型说明(也可以遵循隐含规则),并且,在调用程序中,其他的名字(如变量名、数组名等)不能与被调用的函数子程序名相同。在调用一个函数子程序时,其实参必须在个数、类型与顺序上与函数子程序中的形参一致。子程序不能直接或间接的调用子程序本身,即在F77中不支持递归调用。如果函数是递归的,则应以RECURSIVE开头(F90标准)。,三、函数子程序的引用,-如果一个FORTRAN程序由一个主程序和若干个子程序组成,则主程序和子程序可以分别存放在几个文件中,它们可以独立编译,最后才连接成一个完整的可执行程序;也可以将主程序和所有的子程序存放在同一个文件中,此时将一起编译,最后连接成一个可执行程序。-函数子程序可以没有形参,但函数名后面的一对括号不能省略;同时在调用该函数子程序时也不要实参,但函数名后的一对括号也不能省略。,调用函数子程序时应注意的问题,函数子程序的执行过程,函数子程序是一个外部过程,它不能直接单独控制执行,只有在其他程序单位中引用该函数名时才会控制转到函数子程序内部。大致分为四步:,第一步:首先对实元是表达式的项求出表达式的值,然后将控制转移到函数子程序的FUNCTION语句。,第二步:按排列顺序依次让对应的虚元和实元结合(程序单位之间的数据的传递),这个过程称为虚实结合。,INTEGERSQL=6M=SQ(10,L4/5)WRITE(,10)M10FORMAT(1X,M,15)END,第三步:执行函数体中的各语句。,第四步:当执行遇到END语句或RETURN语句时,函数子程序名带着赋给它的值返回到引用处继续执行程序。,函数子程序的执行过程,INTEGERSQL=6M=SQ(10,L4/5)WRITE(,10)M10FORMAT(1X,M,15)END,FUNCTIONSQ(N,K)INTEGERSQSQNKEND,四、函数子程序应用举例,例1:已知三角形三边a,b,c,求面积S。,*函数子程序FUNCTIONS(X,Y,Z)T(X+Y+Z)/2.0SSQRT(T*(T-X)*(T-Y)*(T-Z)END,*主程序WRITE(*,*)输入A,B,C:READ(*,*)A,B,CAREA=S(A,B,C)WRITE(*,*)面积=,AREAEND,FUNCTIONGF(X)IF(X0)THENGF=X+1ELSEIF(X0)THENGF=X-1ELSEGF=0ENDIFEND,PROGRAMMAIN2N=3Y=(S(N)+S(N+1)+S(N+2)/(S(N+3)+S(N+4)WRITE(*,100)Y=,Y100FORMAT(1X,A,E13.6)END,例3、求下列函数表达式的值。,例4:已知,其中求sinh(x)PROGRAMMAIN3REALMYEXPWRITE(*,*)输入X:READ(*,*)XY=(MYEXP(X)-MYEXP(-X)/2.0WRITE(*,100)X,Y100FORMAT(1X,sinh(,F5.2,)=,E13.6)END,FUNCTIONMYEXP(X)REALMYEXP,S,T,XINTEGERNN=0T=1S=1DO10WHILE(ABS(T).GT.1E-5)N=N+1T=T*X/NS=S+T10CONTINUEMYEXP=SEND,*Sub(1)FUNCTIONFAC(L)FAC=1.0DOI=2,LFAC=FAC*IENDDOEND,*Sub(2)FUNCTIONCOM(N,M)COM=FAC(N)/FAC(M)$/FAC(N-M)END,*MAINPROGRAMDEMENSIONC(11)C(1)=1.0DON=1,10DOM=1,NC(M+1)=COM(N,M)ENDDOWRITE(*,10)(C(I),%I=1,N+1)ENDDO10FORMAT(1x,11F6.0)END,8.3子例程子程序,子例行子程序也是Fortran的外部过程,它与函数子程序的主要差别在于:名字的作用不同。函数子程序名除了供调用外,还代表函数值,而子例行子程序名只供调用。要求返回值的方式不同。函数子程序是通过函数名将函数值带回调用程序,而子例行子程序是通过“虚实结合”将其新值转送回调用程序。调用方式不同。函数子程序的调用总是出现在表达式中,而子例行子程序必须用一条独立的语句调用。,SUBROUTINE子例行程序名(虚参表)(子例程子程序体)END,一、子例行子程序的定义,(1)SUBROUTINE语句是子例行程序的声明语句。它表示子例行程序定义开始。同时给出子例行程序所需的各种虚参。(2)程序体包括:说明部分和执行语句。说明部分:对形参和子例行程序中所用变量、数组等说明执行语句:完成子例行程序的运算和操作功能。(3)子例行程序中的END或RETURN语句使执行流程返回到调用程序。,说明几点:子例行程序名的命名规则与变量名相同。(但不标识类型)如果没有虚参,括号可以省略。例:subroutineabc虚参可以是变量名、数组名和过程名,但不允许用常量和数组元素。子例行子程序的名字只起标识作用,没有值的概念,仅仅为了调用。因此,在子程序体中,它不允许出现。,三、子例行子程序的调用一般形式:call子例行程序名(实参表)call子例行程序名执行过程:类似函数子程序,(1)在调用程序单元中,计算实参值(若实参是表达式)。(2)将实参值传递给对应虚参,即虚实结合。(3)执行子程序体,实现其功能。(4)执行END语句,将返回值带回给调用程序单元。,与函数子程序的不同之处:(1)子例行程序名只供调用时使用,不得在子程序体内赋值;函数子程序名除了供调用时使用外,还代表着函数值,必须在返回前在函数体内给函数名赋予函数值。(2)函数子程序的调用总是出现在表达式中,并将所得的函数值参与表达式的运算;子例行程序必须用一条CALL语句调用。(3)若通过子程序得到一个值,一般采用函数子程序;若只是通过子程序进行运算操作,则采用子例行程序。,三、子例行子程序的调用,无参子例程,四、子例程序应用举例,例:编写子例行程序分别求出55矩阵两个对角线上元素之和。programmainsubroutineopp(a,s1,s2)realw(5,5)reala(5,5)read*,(w(i,j),j=1,5),i=1,5)s1=0.0callopp(w,x1,x2)doi=1,5write(*,50)x1,x2s1=s1+a(i,i)50format(1x,x1=,f5.2,enddo$2x,x2=,f5.2)s2=0.0enddoi=1,5j=5-i+1运行结果:s2=s2+a(i,j)x1=15.00 x2=25.00enddoend,数组传递的首地址,8.4实参和虚参之间的数据传递,在Fortran程序设计中子程序的虚参可以是变量名、数组名、函数名、子例行程序和星号。下面讨论当虚参为变量名和数组名时的实参和虚参之间的数据传递问题,也称“虚实结合”问题。一、变量名作虚参时的虚实结合对应的实参可为同类型的常量、变量或数组元素。结合方式是按地址结合的。即虚参和实参共用一个存储单元。,结合过程programmainintegera,b,c,ddataa,b/10,15/callsub(a,b,c,d)print*,a,b,c,dendsubroutinesub(w,x,y,z)integerw,x,y,zy=w*xz=x*yw=xx=yend,注意:当实参是数组元素时,虚实结合的过程和变量名相同。例:programmainsubroutinesub(x,a)integera,c(3)integerx,adatac/1,2,3/a=2*xa=100 x=2*acallsub(a,c(2)endprint*,a=,a,c(2)=,c(2)end,子程序:xa,主程序:ac(2),C,C(1),二、数组名作虚参时的虚实结合(仅说明数值型数组)此时,对应的实参必须为同类型的数组名或数组元素。实参为数组名时的虚实结合是按地址结合的。即实参数组的第一个元素与对应虚参数组的第一个元素结合;实参数组的第二个元素与对应虚参数组的第二个元素结合,依此类推。,几种情况:同维同体积(不同体积):例:programmainsubroutinectx(b)dimensiona(8)dimensionb(5)callctx(a)endend,若数组a,b均为二维数组,如a(2,3),b(2,3)则:不同体积:如:b(2,2),不同维不同体积:若主程序中a(2,3),子程序中b(5),则:,总结:数组的虚实结合与维数无关。结合原则:按照存储结构一一结合但注意:虚参数组的体积应小于实参数组的体积最好是同维同体积,不易出错,程序可读性强。,实参为数组元素时的虚实结合仍按地址结合,但该数组元素与对应虚参数组的第一个元素结合;该数组元素的下一个元素与对应虚参数组的第二个元素结合,依此类推。,例:programmainsubroutinectx(y)dimensionx(6)dimensiony(3)callctx(x(3)endend,注:虚参数组的最后一个元素必须落在实参数组范围内。对上例而言,若定义y(6),则会出现“超界错”。,例:分别计算二维数组a(15,15),b(15,15)的主对角线元素之积P,Q,再求P*Q。,Functionacc(x)dimensionx(15,15)Acc=x(1,1)do10i=2,15acc=acc*x(i,i)10continueend,MainprogramDimensiona(15,15),b(15,15)Read*,(a(I,J),j=1,15),I=1,15)Read*,(b(I,J),j=1,15),I=1,15)P=acc(a)Q=acc(b)R=p*qPrint*,p=,p,q=,q,result=,rend,考虑:若只需求A数组主对角线的前三个元素之积呢?,我们前面所用的数组,维界都是常数,其大小不可改变。要求解n阶线性方程组,对不同的n都要各编一套程序,这显然不合适。于是提出使用可调数组的想法,数组说明符中的维界用变量。,上例中,将函数子程序或子例程中的A(20)改为A(N),此数组即为可调数组。但是,A与N均需出现在形参中。可调数组的使用规则:(1)可调数组只能在子程序中使用(2)可调数组与可调维中的变量均需列在形参中,PROGRAMMAINDIMENSIONA(10),B(4,3)M14M23CALLSUB(A,10,B,M1,M2)ENDSUBROUTINESUB(X,NX,Y,N1,N2)DIMENSIONX(NX),Y(N1,N2).END,(1)可调数组只能在子程序中使用。(2)可调数组与可调维中的变量均需列在形参中。,从数组的虚实结合规则可知,如果虚参数组的下标不可调,那么就会极大地影响子程序的通用性和灵活性。设计可调数组可以较好地解决这一问题。,1、可调数组的概念:常界数组:上、下界和维数都是整型常数。如:a(15,15)主程序中用的定义数组语句中必须是整型常量,即常界数组。,8.5可调数组,可调数组:只能在子程序中使用,其上、下界可以是整型虚参变量,其值可以通过对应的实参传递过来。,Functionacc(x,n)dimensionx(n,n)Acc=x(1,1)do10i=2,nacc=acc*x(i,i)10continueend,主程序中可以这样调用:DIMENSIONA(30,30),B(60,60)P=acc(a,30)Q=acc(b,60)WRITE(*,*)P=,PWRITE(*,*)Q=,QEND,求方阵主对角上元素的乘积。,如果只想求一部分元素之积,可以再多设一个虚参变量,增加灵活性。,Functionacc(x,n,m)dimensionx(n,n)Acc=x(1,1)do10i=2,macc=acc*x(i,i)10continueend,主程序中可以这样调用:P=acc(a,30,20)Q=acc(b,60,40),重申一下:1、可调数组只能出现在子程序中,不允许出现在主程序里。2、可调数组的数组名和界都必须作为虚参出现在虚参表中。这样,通过虚实结合后,它们就会被赋值。例:programmainsubroutinesub(x,nx,y,n1,n2)parameter(m1=4,m2=3)dimensionx(nx),y(n1,n2)dimensiona(10),b(m1,m2)callsub(a,10,b,m1,m2)endend,函数和子例程复习与小结,例1读程序,写结果:PROGRAMMAIN1M5N3CALLS(M,N)WRITE(*,*)M,NENDSUBROUTINES(N,M)M=M+1N+N*2+MM=N*MEND,例2读程序,写结果:PROGRAMMAIN2DATAA,B,C/1.,2.,3./CALLS(B,C,A,F)WRITE(*,10)A,B,C,F10FORMAT(1x,4F5.1)ENDSUBROUTINES(A,B,C,D)A=CB=A+CC=A+BD=A+B+CEND,例3:阅读下列程序,请写出该程序运行后的结果。(注意:不同程序单位中同名变量互不干扰)subroutineexten(a,b,w,x)a=a+1.0b=b+2.0y=1.0 x=w+ywrite(*,200)y200format(1x,y=,f8.4)end,Mainprogramx=1.0y=2.0callexten(x,y,z,3.0)10y=y+1.0write(*,100)x,y,z100format(1x,3f10.4)end,运行结果:y=1.0002.0005.0004.000,A(1)B(1,1),C(2),Y,X,8.5数据共享存储单元和数据块子程序,一等价语句EQUIVALENCE,等价语句用来指定同一个程序单位内两个或多个变量共同使用一个存储单元。,EQUIVALENCE(变量名表),,INTEGERA(4),B(2,2),C(3),X,YEQUIVALENCE(A,B),(C(2),B),(C(3),Y),(X,Y),举例,XYQ(1)Q(2)Q(3),S(1)S(2)S(3)P(1,1)P(2,1)P(1,2)P(2,2),二公用区语句COMMON,公用区语句是用来建立公用区,使不同程序单位的相应变量共用一个存储单元,达到不同程序单位之间传送数据的目的。公用区分有名公用区和无名公用区。,语句格式:COMMON/公用区名/名字表,,举例,COMMONS(3)/A1/X,Y/A2/A,B,C/COMMON/A2/K,L/P(2,2)COMMON/A1/Q(3),ABCKL,无名:,A1:,A2:,三数据块子程序,数据块子程序是用来给有名公用区中的变量赋初值。数据块子程序属于非执行程序,程序体中不能出现执行语句,只能使用说明语句(如类型语句、参数语句、数组说明语句、公用语句等)和DATA语句,其中COMMON和DATA语句必不可少。,数据块子程序结构形式:,BLOCKDATA子程序名END,说明语句DATA语句,三数据块子程序,两点说明:若只给某公用区部分变量赋初值,也必须在COMMON语句中将该公用区中的成员全部列出;不允许把一个公用区中的变量分在几个数据块子程序中赋初值。,综合举例,PROGRAMMAINCOMMON/A1/X,Y,ZCOMMONS1,S2EQUIVALENCE(X,X3)S1=2.0S2=3.0CALLS(X1,X2)PRINT*,X,Y,ZPRINT*,X1,X2,X3PRINT*,S1,S2END,SUBROUTINES(Y1,Y2)COMMON/A1/A,B,C/Q1A=A+3.0B=B+4.0C=C+5.0Y1=A+BY2=C-AQ1=Q1+2.0END,BLOCKDATACOMMON/A1/P,Q,RDATAP,Q,R/3*1.0/END,谢谢观看!,更多网络共享资源:,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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