资源描述
FORTRAN90程序设计,计算机中心2006.3,VisualFortran90程序设计,6.1概述,6.5子程序的嵌套调用,6.2函数子程序,6.6模块,6.3子例子程序,6.7递归过程,6.4虚实结合,6.8其他部分,6.9程序举例,6.1概述,主程序的结构:,单位定义说明部分输入计算或处理输出END,引入子程序的目的:模块化设计,所有功能都在主程序单位内完成,1、一个Fortran90程序主程序单元个数:1个2、子程序单元:0-n个子程序单元被主程序单元或被其它子程序单元调用,甚至可以递归调用(调用本身),源程序的结构,最简单的源程序的结构,子程序分类,1、函数子程序分为内部函数子程序外部函数子程序,2、子例行子程序分为内部子例行子程序外部子例行子程序,用于完成复杂的计算返回一个或多个值,用于完成复杂计算,返回一个或多个值,或用于其它数据处理,6.2外部函数子程序,单位定义语句说明部分程序体:具体计算END语句,外部函数子程序的结构,FUNCTIONF(X,Y,Z)RESULT(F_RESULT)IMPLICITNONEREAL:X,Y,z,F_RESULTF_RESULT=X+YZ=X-YEND,PROGRAMNAINREAD*,A,BD=F(A,B,c)PRINT*,C,DEND,两单位相互独立编译必须进行数据的传递,ENDFUNCTION函数名,子程序END语句写法,1、函数单位的结束标志2、将控制返回到主调程序。,子程序END语句功能,函数单位定义语句的写法,RECURSIVEFUNCTION函数名(虚元表)RESULT(结果名)1、函数子程序的第一行(注释行除外)。2、如果函数是递归的,则应以RECURSIVE开头。3、函数名为全局名:作用域为整个程序,不与已有的全局名同名。各独立程序单位的名字为全局名,4、主调程序与被调程序两个单位之间的数据传递,结果名:子程序的一个输出一般写法:函数名_RESULT,用于保存一个计算结果,称为函数值。且结果名有类型,必须在子程序说明部分说明类型。,虚元表:子程序的所有输入,及除函数值之外的其他计算结果的输出。,函数值返回给调用式,由实元传递给对应的虚元,虚元数据返回给对应的实元,FUNCTIONF(X,Y,Z)RESULT(F_RESULT)IMPLICITNONEREAL:X,Y,z,F_RESULTF_RESULT=X+YZ=X-YEND,PROGRAMNAINREAD*,A,BD=F(A,B,c)PRINT*,C,DEND,主,子,5、虚元的含义:编写子程序时没有具体值(调用时或调用结束后才获得数值),因此只是一个符号,表示输入、输出,名字可随便用户取。6、虚元可以是变量名、数组名、过程名、指针等。7、虚元的可选属性INTENT:INTENT(IN):作为子程序的输入(不得再改变其值)INTENT(OUT):子程序的输出(对应的实元不能是表达式)INTENT(INOUT):子程序的输入输出例:REAL,INTENT(IN):X,Y,子程序程序体的写法,分为说明部分和执行部分。1、说明部分应对程序体内一切变量、数组等实体(包括虚元)作出说明,同时还要说明函数结果变量名,但不可说明函数名。2、执行部分中必须对函数结果名至少赋值一次。,FUNCTIONF(X,Y,Z)RESULT(F_RESULT)IMPLICITNONEREAL:X,Y,z,F_RESULTF_RESULT=X+YZ=X-YEND,两单位独立编译,1、调用式是表达式,调用结束后调用式得到函数值。2、常见形式:Y=函数名(实元表)PRINT*,函数名(实元表)IF(函数名(实元表)注意:实元与虚元一般必须在个数、次序、类型上保持一致;但实元与虚元名字可以不同。,函数子程序的调用,例1:编写子程序求K=M*N,L=M-N,主程序输入2,3,调用子程序,计算2*3及2-3。,ProgrammainImplicitnoneInteger:M,N,K,L,FRead*,M,NK=F(M,N,L)PRINT*,K,LEND,FUNCTIONF(M,N,L)RESULT(F_RESULT)IMPLICITNONEINTEGER:M,N,L,F_RESULTF_RESULT=M*NL=M-NEND,注意:虚元名任意,但一般与实元一致。检查调用原则,程序体编写规则。,不能省略说明两单位独立编译,PROGRAMMAINIMPLICITNONEREAL:X,Y,F,G,GFREAD*,XF=X+SIN(30*3.1415926/180)G=GF(X,F)Y=F+GPRINT*,YEND,FUNCTIONGF(X,F)RESULT(GF_RESULT)IMPLICITNONEREAL:X,F,GF_RESULTIF(F0)THENGF_RESULT=X+1ELSEIF(F0)THENGF_RESULT=X-1,ELSEGF_RESULT=0ENDIFEND,G,GF不能同名,练习:计算函数Sinh(x)的值,当ex的通项值小于等于1E-6时停止。计算公式如下:,!主程序如下:Programmain1Real:MyExp,y,xWrite(*,*)Enterx:Read(*,*)xY=(MyExp(x)-MyExp(-x)/2.0Write(*,)YENDPROGRAM,!函数子程序FunctionMyExp(x)result(Exp_res)Real:Exp_res,x,s,Tinteger:NN=1;T=1;S=1doT=T*X/NIF(ABS(T)=1E-5)EXITS=S+T;N=N+1enddoExp_res=SENDFUNCTION,两次调用,1、计算实元值(作为输出的可预先无值)2、虚实按地址结合:虚元按顺序借用实元存储单元3、运行权至子程序的第一句,直至遇子程序的END语句返回到主调程序:运行权返回至调用点函数值返回给调用表达式虚实脱离结合,但子程序运行时造成的实元值的改变将保留。,调用的执行过程,子程序阅读技巧:画出虚实结合表,INTEGER:X,Y,Z,fY=f(X,X)PRINT*,YZ=f(y,x)PRINT*,ZEND,FUNCTIONf(X,Y)RESULT(f_RESULT)INTEGER:X,Y,f_RESULT,II=1;X=3*I;Y=2*If_RESULT=X+YEND,注意:一个变量只有一个存储单元按顺序结合,不是按名结合,1、虚元为变量,实元为同类型的变量,开辟临时单元存放常量或表达式的值REAL:MN,X,SX=3.0PRINT*,S(X,MN(X),XENDFUNCTIONS(A,C)RESULT(S_RESULT)REAL:A,S,S_RESULTA=A+1;B=A*AS_RESULT=B-CENDFUNCTIONSFUNCTIONMN(X)RESULT(MN_RESULT)MN_RESULT=3.0*XENDFUNCTIONMN,247.04.0,、虚元为变量,实元为常量、表达式:,6.3外部子例行子程序,外部子例行子程序的结构,外部子例行子程序:用户定义,用于完成复杂计算任务,返回一个或多个值,或用于其它数据处理,RecursiveSubroutine子程序名(虚元表)说明部分程序体EndSubroutine子程序名,与函数子程序的区别,1.没有RESULT关键字。2、虚元:负责子程序的全部输入和全部输出3、无虚元时:SUBROUTINT子程序名或SUBROUTINT子程序名()4、函数子程序的调用是表达式中。而子例子程序必须通过CALL语句来调用。CALL子程序名(实元表),例子程序求K=M+N,L=M-N主程序输入2,3调用子程序求2+3,2-3的值。,ProgrammainImplicitnoneInteger:M,N,K,LRead*,M,NCALLS(M,N,K,L)PRINT*,K,LEND,SubroutienS(m,n,k,l)ImplicitNoneInteger:m,n,k,lK=m+nL=m-nEnd,所有的输入、输出,1、计算实元值(作为输出的可预先无值)2、虚实按地址结合:虚元按顺序借用实元存储单元3、运行至子程序的第一句,直至遇子程序的END语句返回到主调程序:运行返回至CALL语句的下一个语句虚实脱离结合,但子程序运行时造成的实元值的改变将保留。,调用的执行过程,INTEGER:X,YCALLSUB(X,X,Y)CALLSUB(X,Y,Y)END,SUBROUTINESUB(X,Y,Z)INTEGER:X,Y,ZI=1X=3*I;Y=2*I;Z=X+YPRINT*,X,Y,ZEND,阅读程序:画虚实结合表,注意:一个变量只有一个存储单元按顺序结合,不是按名结合,
展开阅读全文