收藏 分销(赏)

FORTRAN子程序.ppt

上传人:精*** 文档编号:12884883 上传时间:2025-12-23 格式:PPT 页数:96 大小:3.82MB 下载积分:10 金币
下载 相关 举报
FORTRAN子程序.ppt_第1页
第1页 / 共96页
FORTRAN子程序.ppt_第2页
第2页 / 共96页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,精选课件ppt,*,FORTRAN77/90-第七讲 子程序,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,精选课件ppt,*,第七讲 子程序,7.1 语句函数,7.5 可调数组,7.2 函数子程序,7.3 子例行子程序,7.4 虚实结合,7.6 程序举例,1,精选课件ppt,7.1语句函数,一、语句函数的概念,二、语句函数的定义,三、语句函数的引用,2,精选课件ppt,一、语句函数的概念,引例:计算W0.2P(X)+0.3P(Y)+0.5P(Z)其中P(T)=0.812T,3,+1.256T,2,-3.378T+0.689,WRITE(*,*)请输入X,Y,Z的值:,READ(*,*)X,Y,Z,P1 0.812*X*3+1.256*X*2-3.378*X+0.689,P2 0.812*Y*3+1.256*Y*2-3.378*Y+0.689,P3 0.812*Z*3+1.256*Z*2-3.378*Z+0.689,W0.2*P1+0.3*P2+0.5*P3,WRITE(*,*)W,END,重复使用同一,公式,繁琐,3,精选课件ppt,上例三次使用同一公式,下面利用FORTRAN提供的语句函数来简化之,程序可改写如下:,P(T)0.812*T*3+1.256*T*2-3.378*T+0.689,WRITE(*,*)请输入X,Y,Z的值:,READ(*,*)X,Y,Z,P1P(X),P2 P(Y),P3 P(Z),W0.2*P1+0.3*P2+0.5*P3,WRITE(*,*)W,W,END,对语句函数的引用,4,精选课件ppt,规定,:语句函数是在使用的程序段内部用,一个语句定义,的函数,,必须在程序段的开头定义,,且只能在该段的内部使用。,在程序中有时可能在好几处需要进行同样的某种表达式计算,而这种计算又,不是某个内部函数所能完成的,,这时,程序设计者,可以自已来定义一个语句函数,,通过引用语句函数来实现这种特殊运算。,5,精选课件ppt,二、语句函数的定义,语句函数定义的形式:,f_name(x,x)=e,6,精选课件ppt,使用规定,1),语句函数定义语句必须,位于该程序段的说明语句之后,第一个可执行语句之前,。它是非执行语句。,2),语句函数名不能与本程序单元中的任何其它名字同名。,f_name的类型可以隐含,也可以显式说明。,f_name与e的关系遵循语句的赋值规则。,3),形参X只能是变量,,用于表示函数中自变量的个数、类型和顺序,与本程序段中的其它名字无关。,x1,x2,xn,本身是没有值的,只有在函数引用时用实在自变量(实参)代替虚参情况下,才能得到函数值,虚参在形式上与普通变量名相同,虚参之间不能同名。,7,精选课件ppt,使用规定,4),e,是含有x1,x2,xn的表达式,在这个表达式中,除必须包含有关虚参外,还可以包含常量,变量,外部和内部函数和已定义过的语句函数。,5)语句函数只能在定义它的程序段使用。,8,精选课件ppt,三、语句函数的引用,语句函数的引用就是对语句函数定义的使用。它和内部函数一样,总是在表达式中作为一个运算分量或单独作为一个表达式出现。它的一般引用形式为:,f_name(a1,a2),注:实参的个数、类型及排列顺序必须,与相应的形参一致!,9,精选课件ppt,三、语句函数的引用,REALA,B,C,SUM(A,B,C)A+B*B+C*3,DATAA,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+Y3,WRITE(*,*)Y1,Y2,Y3,Z,END,Y10.5+0.7,2,+0.8,3,Y22.0+2.0,2,+3.0,3,Y13.0+2.0,2,+1.0,3,10,精选课件ppt,语句函数的引用过程,当程序执行到一个语句函数的引用时,要经过下列几个过程:,当实元为表达式时,先求出表达式的值,然后控制转到语句函数定义语句去执行;,实元和对应的虚元进行结合,即实元的值传给虚元(称为虚实结合过程);,求表达式e,的值;,11,精选课件ppt,这一过程是由计算机系统来完成的,用户可不必担心。,根据语句函数名的类型和表达式e,求值结果,按赋值规则得到函数引用的值由函数名带回,并控制返回到原表达式函数引用处,继续计算表达式值。,语句函数的引用过程,12,精选课件ppt,三、语句函数的引用,DATAA/2.0/,F(X)X+1,BF(F(F(A),WRITE(*,*)B,END,F(F(F(2.0),F(F(3.0),F(4.0),13,精选课件ppt,例1:二分法:,1、基本思路:把区间(x1,x2)二,等分,找到中点x求出f(x)值,然后,判断f(x)和f(x1)是否同号,如同,号则说明根在(x,x2)区间,否则,,根在(x,x1)区间。依次方法对有根,区间再折半,直到满足条件为止。,例:用二分法求f(x)=x,3,-6x-1=0在x=2附近的一个实根,区间为x1=0,x2=5,x,y,x1,x2,x,f(x1),f(x),f(x2),0,14,精选课件ppt,F(X)=X*3-6.0*X-1.0,100 READ(*,*)X1,X2,FX1=F(X1),FX2=F(X2),IF(FX1*FX2.GT.0.0)GOTO 100,10 X=(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,END,SIGN(x1,x2)是符号传递函数,函数值取x2的的符号,取x1的绝对值,15,精选课件ppt,算法:弦截法的基本思路与“二分法”,相似,它是取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:用语句函数采用弦截法求X,3,-2X,2,-7X+4=0的根。,x,f(x),0,x1,x2,x,f(x1),f(x),f(x2),16,精选课件ppt,LOGICAL S,F(X)=X*3-2.0*X*2-7.0*X+4.0,S(A,B)=SIGN(A,B).EQ.A,10 READ(*,*)X1,X2,F1=F(X1),F2=F(X2),IF(S(F1,F2)GOTO 10,F0=1.0,20 IF(ABS(X1-X2).GT.1E-5).AND.(ABS(F0).GT.1E-6)THEN,X=X2-(X2-X1)/(F2-F1)*F2,F0=F(X),IF(S(F0,F1)THEN,X1=X,F1=F0,END IF,17,精选课件ppt,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,精选课件ppt,语句函数小结:,语句函数必须先定义,后引用,。,且语句函数只可在包含该语句函数定义的程序单位中引用,即不能引用其他程序单位所定义的语句函数。,语句函数定义语句是非执行语句。它应该放在所有可执行语句之前和有关的类型说明语句之后。,19,精选课件ppt,语句函数定义中的函数名和虚元是具有类型的,可以用类型说明语句说明其类型 或按隐含约定确定其类型。如:,INTEGER G,X,Y,G(X,Y,N)=X*X+N*Y,以上语句说明G,函数是整型函数,即函数值为整型,且说明虚元X,Y为整型,隐含约定N为整型。,语句函数小结:,20,精选课件ppt,在语句函数定义的语句中,也可出现其他的语句函数引用,但被引用的语句函和须在它前面已定义。不允许引用自身或在它后面定义的语句函数。,例:S(A,B,C)=(A+B+C)/2.0,PP(A,B,C)=SQRT(S(A,B,C),A,),PP 函数引用了它前面所定义的S,函数,语句函数小结:,21,精选课件ppt,引用语句函数时,给定的实元必须和对应的虚元个数相等,类型一致,位置相符。在进行虚实结合时,虚元与实元不是以名字相同传值,而是按位置类型一一传值。,语句函数小结:,22,精选课件ppt,例:,F(X)=X,XX1.0,X=3,.0,Y=(X+3.0)/2.0,Z=F(1.0)+F(2.0)+F(3.0),T=F(X),在同一程序单位中不允许变量名与函数名同名,但允许变量与虚元同名,。,23,精选课件ppt,程序第一行的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),24,精选课件ppt,7.2 函数子程序(外部函数),语句函数只能用一个语句定义,而且只能在定义它的程序段中使用。,分析:函数f(X)是用两个表达式定义的,不能用简单的语句函数来表示。怎么办?FORTRAN提供了一种方法,就是把函数的计算部份从程序中独立出来,并按一定的格式编成一个单独的子程序段,称为外部函数或函数子程序。,25,精选课件ppt,7.2 函数子程序(外部函数),DIMENSIONX(10),READ(*,*)X,Y=0.0,DO 1 I=1,10,Y=Y+F(X(I),CONTINUE,Y=Y/10.0,WRITE(*,*)Y=,Y,END,FUNCTION,F(X),IF(X.GE.0)F=2*X+1,IF(X.LT.0)F=-3*X+1,END,引,用,返回,一、引例,26,精选课件ppt,一个FORTRAN,程序可以由一个以上程序单位组成,这程序单位分别称为,主程序和子程序,,,每个程序单位都可由FORTRAN编译程序单独进行编译,进行语法检查,生成目标代码,最后再连接装配在一起,成为一个可执行程序,图1是一个可执行FORTRAN程序的结构示意图,其中每个方框代表一个单独的程序单位,可以看到,一个FORTRAN程序必须有一个主程序,而且只能有一个主程序,一个程序中,可以根据需要包含任意数量的子程序,子程序可以被主程序调用,也可以被 其它子程序调用,但不能发生直接或间接地自已调用自己,如图2中所示的调用关系是错误的。,27,精选课件ppt,主程序,子程序C,子程序B,子程序A,子程序D,子程序E,子程序D,子程序E,子程序G,子程序F,子程序F,图1,28,精选课件ppt,主程序,子程序C,子程序A,子程序B,子程序C,子程序B,图2,29,精选课件ppt,FORTRAN,子程序,函数子程序(外部函数),子例行子程序,数据块子程序(说明子程序),30,精选课件ppt,FUNCTION 函数名(a,1,a,2,a,n,),说明语句,可执行语句,END,SUBROUTINE 子例行程序名(a,1,a,2,a,n,),说明语句,可执行语句,END,BLOCK DATA 名字,说明语句,END,(a),函数子程序结构,(b),子例行程序结构,(c),数据块子程序结构,31,精选课件ppt,子程序是一个独立的程序单位,其主要特点:,(1),形式独立,每种类型的子程序均以子程序单位语句开始,以END,结束。,(2),符号独立。子程序单位中使用的语句标号、变量名、数组名等是独立的,即使与其他程序单位的符号相同,无需特殊声明,也彼此无关。,32,精选课件ppt,(3),位置独立。子程序可以放在主程序之前或之后都无所谓,执行时总是从主程序开始执行。,(4),编译独立。如果每个子程序是以一个文件存贮的。则可以单独进行编译。这样使得便于编写,便于维护,并能实现软件共享。,33,精选课件ppt,二、外部函数的定义,函数子程序通常称为外部函数,它也是根据程序设计者的需要由自己定义的函数。和语句函数不同的是,函数子程序是一个,由若干语句组成的独立的程序单位,。当某些函数的值不可能用一条语句来求得时,就可借助函数子程序来定义一个函数。,34,精选课件ppt,二、外部函数的定义,一般形式:,类型说明 FUNCTION 函数名(虚参表),函数子程序体,END,FUNCTION 函数名(虚参表),类型说明 函数名,函数子程序体,END,35,精选课件ppt,说明:,1、FUNCTION语句,是函数子程序的第一条语句,标志着该函数子程序的开始。,类型说明 function 函数名(虚参表),六种类型,说明,函数,名,的类型,关键字,该函数子,程序的名字,虚元表,例:function rdh(n,h)实型函数,Integer function rdh(n,h)整型函数,36,精选课件ppt,注意:,(1)函数名的命名规则和类型都与变量相同,(2)虚参可以是变量名、数组名和过程名,但不允许用常量和数组元素。,例:function fat(n,x(i),),它表示了函数自变量的,个数,,,顺序,和,类型,(3)虚参,是一个属于该函数子程序的局部变量。虚元的类型也可以用类说明语句在函数体中进行说明或按隐含约定方法确定。,例:real function intep(x1,x2,x3),integer x1,x2,x3,37,精选课件ppt,2、子程序体,用来完成具体任务的一个程序段,结构:,说明语句,可执行语句,END语句独立的程序单位,单独编译,注意:,若无虚参时,括号不能省。,例:function proc(),函数子程序中所有变量和标号(除函数名和虚参外),与其它程序单位无任何联系。,38,精选课件ppt,函数体的说明部分包括对虚参和本函数体内所用变量和数组的说明。,例:function rdh(a,x),integer a,b,c,dimension x(2,3),end,39,精选课件ppt,函数体中可设置一条或多条return语句,表示执行到此语句时返回调用程序。当然也可以不设return语句。,例:function fat(n),return,end,两种情况:,当return语句和end语句紧挨着时,可省略return语句。,需从中间返回时,return语句必不可少,40,精选课件ppt,函数名的作用,函数名在函数体中,至少要有一次出现在赋值语句的左边,即:,函数名=表达式,。(因为函数名要负责把函数值带回调用程序。),例:求一个一维数组A(n)的各数组元素之和。,Function,sum,(A,n),Dimension a(50),Sum=0.0,Do 10 i=1,n,sum=sum+a(i),10 Continue,return,end,这里,sum是函数子程序的名字,它应作为一个变量名出现在程序体中,并且至少被赋值一次。这样,它才有值,在被调用后将值带回到主程序中。,在主程序中可能有这样的语句:,S1=sum(x,50),S2=sum(g,30),S=s1+s2,.,41,精选课件ppt,例2:编一个求n!的子程序,function fac(n),fac=1.0,do 15 i=1,n,fac=fac*i,15 continue,end,主程序中可以这样调用:,fac(8),fac(11),fac(5),42,精选课件ppt,三、函数子程序的引用,函数子程序是不能直接执行的,只有在其他程序单位中对它引用时,才能控制转移到它的内部执行。函数子程序的引用和前面讲过的内部函数或语句函数引用形式完全一样,仅在表达式中出现,,即只能出现在赋值语句的右边或WRITE,语句中,。,43,精选课件ppt,三、函数子程序的引用,数组传递,的首地址,该元素与数组的,第一个元素对应,44,精选课件ppt,实参与虚参在个数、类型、位置上必须一一对应,但名字可以不同。,如:主程序 子程序,kh=erg(,a,m,x,)function erg(,x,n,q,),三、函数子程序的引用,45,精选课件ppt,函数子程序的执行过程,函数子程序是一个外部过程,它不能直接单独控制执行,只有在其他程序单位中引用该函数名时才会控制转到函数子程序内部。大致分为四步:,第一步:首先对实元是表达式的项求出表达式的值,然后将控制转移到函数子程序的FUNCTION,语句。,第二步:按排列顺序依次让对应的虚元和实元结合(程序单位之间的数据的传递),这个过程称为虚实结合。,INTEGER SQ,L=6,M=SQ(10,L,4/5,),WRITE(,,10,)M,10 FORMAT(1X,M,15),END,46,精选课件ppt,第三步:执行函数体中的各语句。,第四步:当执行遇到END,语句或RETURN语句时,函数子程序名带着赋给它的值返回到引用处继续执行程序。,函数子程序的执行过程,INTEGER SQ,L=6,M=SQ(10,L,4/5,),WRITE(,,10,)M,10 FORMAT(1X,M,15),END,FUNCTION SQ(N,K),INTEGER SQ,SQ N,K,END,47,精选课件ppt,四、函数子程序应用举例,例1:已知三角形三边a,b,c,求面积S。,*函数子程序,FUNCTIONS(X,Y,Z),T(X+Y+Z)/2.0,SSQRT(T*(T-X)*(T-Y)*(T-Z),END,*主程序,WRITE(*,*)输入A,B,C:,READ(*,*)A,B,C,AREA=S(A,B,C),WRITE(*,*)面积=,AREA,END,48,精选课件ppt,49,精选课件ppt,50,精选课件ppt,实际计算是:,ZX(1)*Y(6)+X(2)*Y(7)+X(3)*Y(8),实参数组,不够用,51,精选课件ppt,52,精选课件ppt,*Sub(1),FUNCTION FAC(L),FAC=1.0,DO I=2,L,FAC=FAC*I,ENDDO,END,*Sub(2),FUNCTION COM(N,M),COM=FAC(N)/FAC(M),$,/FAC(N-M),END,*MAIN PROGRAM,DEMENSION C(11),C(1)=1.0,DO N=1,10,DO M=1,N,C(M+1)=COM(N,M),ENDDO,WRITE(*,10)(C(I),%,I=1,N+1),ENDDO,10 FORMAT(1x,11F6.0),END,53,精选课件ppt,例5、编写一外部函数求一批数的最大值。,*函数子程序,FUNCTIONBIG(A,N ),DIMENSION A(20),BIG=A(1),DO I=2,N,IF(A(I).GT.BIG)THEN,BIG=A(I),ENDIF,ENDDO,END,*主程序,PARAMETER(M=10),DIMENSION X(M),WRITE(*,*)输入X(10):,READ(*,*)X,Y=BIG(X,M ),WRITE(*,*)Y,END,思考:,如何在外部函数中将最大,值的的序号也求出?,K,K=1,K=I,K,K,54,精选课件ppt,例6、求n(20)个数组元素之和及其平均值。,*函数子程序,FUNCTIONSUM(A,N,AVG),DIMENSION A(20),SUM=0.0,DO I=1,N,SUM=SUM+A(I),ENDDO,AVG=SUM/N,END,函数子程序不仅可以由函数名,带回函数值,还可以通过实参-形,参的结合带回其它值。但不规范。,主程序在引用了,函数SUM后,可使,用平均值AVG。,55,精选课件ppt,例7:编写一个函数子程序课计算二维数组,x(5,4)中任意行或任意列的元素之和。然后调用它来计算a(5,4),b(5,4)数组任一行或任一列元素之和。,分析:,任一行或任一列用变量L表示,设置一个逻辑变量GOG,来控制行或列:GOG=.true.-第L,行,GOG=.false.-第L列,56,精选课件ppt,Function sum(x,l,gog),dimension x(5,4),logical gog,sum=0.0,if(gog)then,do 20 i=1,4,sum=sum+,x(L,i),20 continue,else,do 30 i=1,5,sum=sum+,x(i,L),30 continue,endif,end,Main program,dimension a(5,4),b(5,4),logical k,k1,read(*,*)k,L,(a(I,j),j=1,4),I=1,5),p=sum(a,L,k),read(*,)k1,L1,(b(I,j),j=1,4),I=1,5),q=sum(b,L1,k1),write(*,*)k,L,p,write(*,*),k1,L1,q,end,考虑:更通用的情况:,任意矩阵,任意行,任意列,57,精选课件ppt,7.3子例程子程序,一、子例程子程序的概念,二、子例程子程序的定义,三、子例程子程序的调用,四、子例程子程序应用举例,58,精选课件ppt,子例行子程序,子例行子程序也是Fortran的外部过程,它与函数子程序的主要差别在于:,名字的作用不同。,函数子程序名除了供调用外,还代表函数值,而子例行子程序名只供调用。,要求返回值的方式不同。,函数子程序是通过函数名将函数值带回调用程序,而子例行子程序是通过“虚实结合”将其新值转送回调用程序。,调用方式不同。,函数子程序的调用总是出现在表达式中,而子例行子程序必须用一条独立的语句调用。,59,精选课件ppt,一、子例程的概念,*函数子程序,FUNCTIONSUM(A,N,AVG),DIMENSION A(20),SUM=0.0,DO I=1,N,SUM=SUM+A(I),ENDDO,AVG=SUM/N,END,当返回的值超过1个时,用函数子程序不规范。我们另辟蹊径。,*子例程,SUBROUTINE,#,S(A,N,SUM,AVG),DIMENSION A(20),SUM=0.0,DO I=1,N,SUM=SUM+A(I),ENDDO,AVG=SUM/N,END,引例,(前例6)求数组元素之和及平均值。,60,精选课件ppt,一般形式:,SUBROUTINE,S,(虚参表),(子例程子程序体),END,二、子例行子程序的定义,子例行语句,开头,结尾,子例行程序名,(无类型,不携带值),61,精选课件ppt,说明几点:,子例行程序名的命名规则与变量名相同。(,但不标识类型,),如果没有虚参,括号可以省略。,例:subroutine abc,虚参可以是变量名、数组名和过程名,但不允许用常量和数组元素。,它,的说明部分包括对虚参和本子例行程序所用变量和数组的说明。,子例行子程序的名字只起标识作用,没有值的概念,仅仅为了调用。因此,在子程序体中,它,不允许出现,。,62,精选课件ppt,三、子例行子程序的调用,一般形式:,call 子例行程序名(实参表),call 子例行程序名,执行过程:类似函数子程序,63,精选课件ppt,数组传递,的首地址,该元素与数组的,第一个元素对应,与函数同,64,精选课件ppt,四、子例程序,应用举例,例1:,计算函数y=sinx+x,及其导数的子例程子,程序.,PROGRAMMAIN,READ(*,*)X,CALL SC(x,Y,DY),WRITE(*,*)Y,DY,END,SUBROUTINE SC(X,Y,DY),Y=SIN(X)+X,DY=COS(X)+1.0,END,输入(从主程序,传入数据),输出(从主程序,回传结果),65,精选课件ppt,例2打印错误信息的子例程子程序,SUBROUTINEERR,WRITE(*,*)10,10 FORMAT(10X,*语法错误*),END,PROGRAM MAIN5,CALL ERR,END,运行结果:,*语法错误*,无参子例程,66,精选课件ppt,例:编写子例行程序分别求出55矩阵两个对角线上元素之和。,program main,subroutineopp(a,s1,s2),real w(5,5),real a(5,5),read*,(w(i,j),j=1,5),i=1,5),s1=0.0,call opp(w,x1,x2),do i=1,5,write(*,50)x1,x2,s1=s1+a(i,i),50 format(1x,x1=,f5.2,end do,$2x,x2=,f5.2),s2=0.0,end,do i=1,5,j=5-i+1,运行结果:,s2=s2+a(i,j),x1=15.00 x2=25.00,enddo,end,67,精选课件ppt,PROGRAM MAIN6,REAL W(5,5),CALL READIN(W),CALL OPP(W,X1,X2),WRITE(*,100)X1,X2,10 FORMAT(1x,X1=,F8.2,$X2=,F8.2),END,SUBROUTINE READIN(A),REAL A(5,5),WRITE(*,*)Enter 5X5矩阵,DO 10 I=1,5,READ(*,*)(A(I,J),J=1,5),10 CONTINUE,END,68,精选课件ppt,总结,函数子程序和子例行子程序的不同点:,1、定义语句不同,2、名字的作用不同,3、调用方法不同,4、用途不同:,函数子程序带回一个值。,子例行子程序可以带回一批值(数组),或者完成特定的,操作,。(如:交换,排序等),69,精选课件ppt,7.4 实参和虚参之间的数据传递,在Fortran程序设计中子程序的,虚参,可以是,变量名,、,数组名,、函数名、子例行程序和星号。,下面讨论当虚参为,变量名,和,数组名,时的实参和虚参之间的数据传递问题,也称“虚实结合”问题。,一、变量名作虚参时的虚实结合,对应的实参可为同类型的,常量、变量,或,数组元素,。,结合方式,是,按地址结合,的。即虚参和实参共用一个存储单元。,70,精选课件ppt,结合过程,program main,integer a,b,c,d,data a,b/10,15/,call sub(a,b,c,d),print*,a,b,c,d,end,subroutine sub(w,x,y,z),integer w,x,y,z,y=w*x,z=x*y,w=x,x=y,end,71,精选课件ppt,注意:,当实参是,数组元素,时,虚实结合的过程和变量名相同。,例:program main,subroutine sub(x,a),integer a,c(3),integer x,a,data c/1,2,3/,a=2*x,a=100,x=2*a,call sub(a,c(2),end,print*,a=,a,c(2)=,c(2),end,子程序:x a,主程序:a c(2),C,C(1),72,精选课件ppt,二、数组名作虚参时的虚实结合,(仅说明数值型数组),此时,对应的实参必须为同类型的,数组名,或,数组元素,。,实参为,数组名,时的虚实结合,是,按地址结合,的。即实参数组的第一个元素与对应虚参数组的第一个元素结合;,实参数组的第二个元素与对应虚参数组的第二个元素结合,依此类推。,73,精选课件ppt,几种情况:,同维同体积(不同体积):,例:,program main,subroutine ctx(b),dimension a(8),dimension b(5),call ctx(a),end,end,74,精选课件ppt,若数组a,b均为二维数组,如a(2,3),b(2,3)则:,不同体积:如:b(2,2),结合方式,主程序:,子程序:,a(1,1)a(2,1)a(1,2)a(2,2)a(1,3)a(2,3),b(1,1)b(2,1)b(1,2)b(2,2)b(1,3)b(2,3),结合方式,主程序:,子程序:,a(1,1)a(2,1)a(1,2)a(2,2)a(1,3)a(2,3),b(1,1)b(2,1)b(1,2)b(2,2),75,精选课件ppt,不同维不同体积:,若主程序中a(2,3),子程序中b(5),则:,总结:,数组的虚实结合与维数无关。,结合原则:,按照存储结构一一结合,但注意:虚参数组的体积应小于实参数组的体积,最好是同维同体积,不易出错,程序可读性强。,76,精选课件ppt,实参为,数组元素,时的虚实结合,仍按地址结合,但该数组元素与对应虚参数组的第一个元素结合;该数组元素的下一个元素与对应虚参数组的第二个元素结合,依此类推。,例:,program main,subroutine ctx(y),dimension x(6),dimension y(3),call ctx(x(3),end,end,77,精选课件ppt,注:,虚参数组的最后一个元素必须落在实参数组范围内。,对上例而言,若定义y(6),则会出现“,超界错,”。,78,精选课件ppt,例:分别计算二维数组a(15,15),b(15,15)的主对角线元素之积P,Q,再求P*Q。,Function acc(x),dimension x(15,15),Acc=x(1,1),do 10 i=2,15,acc=acc*x(i,i),10 continue,end,Main program,Dimension a(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*q,Print*,p=,p,q=,q,result=,r,end,考虑:若只需求A数组主对角线的前三个元素之积呢?,79,精选课件ppt,我们前面所用的数组,维界都是常数,其大小不可改变。要求解n阶线性方程组,对不同的n都要各编一套程序,这显然不合适。于是提出使用可调数组的想法,数组说明符中的维界用变量。,80,精选课件ppt,*函数子程序,FUNCTIONSUM(A,N,AVG),DIMENSION A(20),SUM=0.0,DO I=1,N,SUM=SUM+A(I),ENDDO,AVG=SUM/N,END,*子例程,SUBROUTINE,#S(A,N,SUM,AVG),DIMENSION A(20),SUM=0.0,DO I=1,N,SUM=SUM+A(I),ENDDO,AVG=SUM/N,END,引例,求n(20)个数组元素之和及平均值。,N,N,81,精选课件ppt,上例中,将函数子程序或子例程中的A(20)改为,A(N),此数组即为可调数组。但是,A与N均需出现,在形参中。,可调数组的使用规则:,(1)可调数组只能在子程序中使用,(2)可调数组与可调维中的变量均需列在形参中,82,精选课件ppt,PROGRAM MAIN,DIMENSIONA(10),B(4,3),M14,M23,CALLSUB(A,10,B,M1,M2),END,SUBROUTINE SUB(X,NX,Y,N1,N2),DIMENSIONX(NX),Y(N1,N2),.,END,(1)可调数组只能在子程序中使用。,(2)可调数组与可调维中的变量均需列在形参中。,83,精选课件ppt,从数组的虚实结合规则可知,如果虚参数组的下标不可调,那么就会极大地影响子程序的,通用性,和,灵活性,。设计可调数组可以较好地解决这一问题。,1、可调数组的概念:,常界数组:,上、下界和维数都是整型,常数,。如:a(15,15),主程序,中用的定义数组语句中必须是整型常量,即常界数组。,8.5可调数组,84,精选课件ppt,可调数组:,只能在,子程序,中使用,其上、下界可以是整型虚参,变量,,其值可以通过对应的实参传递过来。,Function acc(x,n,),dimension x(,n,n,),Acc=x(1,1),do 10 i=2,n,acc=acc*x(i,i),10 continue,end,主程序中可以这样调用:,DIMENSION A(30,30),B(60,60),P=acc(a,30),Q=acc(b,60),WRITE(*,*)P=,P,WRITE(*,*)Q=,Q,END,求方阵主对角上元素的乘积。,85,精选课件ppt,如果只想求一部分元素之积,可以再多设一个虚参变量,增加灵活性。,Function acc(x,n,,m,),dimension x(,n,n,),Acc=x(1,1),do 10 i=2,m,acc=acc*x(i,i),10 continue,end,主程序中可以这样调用:,P=acc(a,30,20),Q=acc(b,60,40),86,精选课件ppt,87,精选课件ppt,88,精选课件ppt,89,精选课件ppt,重申一下:,1、可调数组只能出现在,子程序,中,不允许出现在主程序里。,2、可调数组的,数组名,和,界,都必须作为,虚参,出现在虚参表中。这样,通过虚实结合后,它们就会被赋值。,例:,program main,subroutine sub(,x,nx,y,n1,n2),parameter(m1=4,m2=3),dimension,x(nx),y(n1,n2),dimension a(10),b(m1,m2),call sub(a,10,b,m1,m2),end,end,90,精选课件ppt,函数和子例程复习与小结,91,精选课件ppt,92,精选课件ppt,93,精选课件ppt,例1读程序,写结果:,PROGRAMMAIN1,M5,N3,CALLS(M,N),WRITE(*,*)M,N,END,SUBROUTINE S(N,M),M=M+1,N+N*2+M,M=N*M,END,例2读程序,写结果:,PROGRAMMAIN2,DATA A,B,C/1.,2.,3./,CALLS(B,C,A,F),WRITE(*,10)A,B,C,F,10 FORMAT(1x,4F5.1),END,SUBROUTINE S(A,B,C,D),A=C,B=A+C,C=A+B,D=A+B+C,END,94,精选课件ppt,例3:阅读下列程序,请写出该程序运行后的结果。(注意:不同程序单位中同名变量互不干扰),subroutine exten(a,b,w,x),a=a+1.0,b=b+2.0,y=1.0,x=w+y,write(*,200)y,200 format(1x,y=,f8.4),end,Main program,x=1.0,y=2.0,call exten(x,y,z,3.0),10 y=y+1.0,write(*,100)x,y,z,100 format(1x,3f10.4),end,运行结果:,y=1.000,2.000 5.000 4.000,95,精选课件ppt,此课件下载可自行编辑修改,供参考!,感谢您的支持,我们努力做得更好!,96,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服