首页 FORTRAN90学习资料Visual Fortran90第6章2

FORTRAN90学习资料Visual Fortran90第6章2

举报
开通vip

FORTRAN90学习资料Visual Fortran90第6章2功能:用于通知编译程序主调程序所调用的外部过程的名字、虚元名字及它们的类型等。位置:写在主调程序的类型说明语句之前,IMPLICIT语句之后。最简接口块结构形式:INTERFACE;接口入口    被调程序的单位定义语句,说明语句,单位结束语句ENDINTERFACE;接口出口说明:功能简单的程序,不必写接口块。如有接口,主调程序不必再说明外部函数名的类型。6.2.3接口块(InterfaceBlock)PROGRAMTESTIMPLICITNONEINTERFACEFUNCTIONFunc(X)Result(F)...

FORTRAN90学习资料Visual Fortran90第6章2
功能:用于 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 编译程序主调程序所调用的外部过程的名字、虚元名字及它们的类型等。位置:写在主调程序的类型说明语句之前,IMPLICIT语句之后。最简接口块结构形式:INTERFACE;接口入口    被调程序的单位定义语句,说明语句,单位结束语句ENDINTERFACE;接口出口说明:功能简单的程序,不必写接口块。如有接口,主调程序不必再说明外部函数名的类型。6.2.3接口块(InterfaceBlock)PROGRAMTESTIMPLICITNONEINTERFACEFUNCTIONFunc(X)Result(F)REAL::X,FENDFUNCTIONENDINTERFACEREAL::X  !有接口不能说明FuncPRINT*,‘ENTERx:‘READ*,xWRITE(*,*)Func(x)ENDPROGRAMTEST例如:利用外部函数完成X3的计算。FUNCTIONFunc(X)Result(F) REAL::X,F F=X**3ENDFUNCTION主程序函数子程序接口块的内容就是被调用过程的变元及函数返回变量等说明部分的拷贝1、实元是关键字变元2、实元是缺省的可选变元。3、一个外部函数使系统中的内在操作符扩展了原有的功能。4、外部过程扩展了赋值号的使用范围。5、用一个类属名调用过程。6、调用的外部过程是一个函数,且函数结果是一个数组;或函数结果值是一个字符型,且长度不是常数,也不是假定长度(*);或被调用过程中的虚元是一个假定形状数组、一个指针变量、一个目标变量。但下例情形必须使用接口块:6.4虚实结合 一般原则:实元与虚元个数相等,类型一致,按位置结合 灵活原则关键字变元、可选择变元、虚元改名1、计算实元值(作为输出的可预先无值)2、虚实按地址结合:虚元按顺序借用实元存储 单元 初级会计实务单元训练题天津单元检测卷六年级下册数学单元教学设计框架单元教学设计的基本步骤主题单元教学设计 3、运行权至子程序的第一句,直至遇子程序的END语句返回到主调程序:①运行权返回至调用点②函数值返回给调用表达式③虚实脱离结合,但子程序运行时造成的实元值的改变将保留。子程序阅读技巧:逐语句运行,画出虚实结合表 复习 预应力混凝土预制梁农业生态学考研国际私法笔记专题二标点符号数据的收集与整理 :调用的执行过程:PROGRAMMAINIMPLICITNONEINTEGER::X,Y,Z,fZ=f(X,Y)PRINT*,X,Y,ZZ=f(Y,X)PRINT*,X,Y,ZENDFUNCTIONf(X,Y)RESULT(f_RESULT) IMPLICITNONE INTEGER::X,Y,f_RESULT,K K=1;X=3*K;Y=2*K f_RESULT=X+YENDFUNCTION注意:一个变量只有一个存储单元按顺序结合,不是按名结合1、虚元为变量,实元为同类型的变量PROGRAMMAIN REAL::MN,X,S X=3.0 PRINT*,S(X,MN(X)),X!按从左向右依次输出END2、虚元为变量,实元为常量、表达式:FUNCTIONS(A,C)RESULT(S_RESULT) REAL::A,C,S_RESULT,B A=A+1;B=A*A S_RESULT=B-CENDFUNCTIONSFUNCTIONMN(X)RESULT(MN_RESULT) REAL::X,MN_RESULT MN_RESULT=3.0*XENDFUNCTIONMN7.04.0PROGRAMMAIN INTEGER::X,Y CALLSUB(X,X,Y) CALLSUB(X,Y,Y)ENDSUBROUTINESUB(X,Y,Z) INTEGER::X,Y,Z I=1 X=3*I;Y=2*I;Z=X+Y PRINT*,X,Y,ZENDsubroutine子例行子程序例: 24 556.4.1实元用关键字变元通常在调用过程中要记住虚元名及其位置,而使用关键字变元后,就不必记住虚元的次序了,填写的实元次序可以是任意的。关键字变元是调用过程的一种现代形式,它的一般形式为:虚元名=实元表达式PROGRAMmain IMPLICITNONE INTERFACE FUNCTIONF(X,Y,Z)RESULT(F_RESULT) INTEGER::F_RESULT,X,Y,Z END ENDINTERFACE INTEGER::M,N,L,K READ*,M,N K=F(X=M,Z=L,Y=N) PRINT*,LEND关键字变元举例FUNCTIONF(X,Y,Z)RESULT(F_RESULT) INTEGER::F_RESULT,X,Y,Z F_RESULT=X+Y Z=X-YEND注意:1、关键字变元不需考虑虚元的次序,但必须知道虚元的名字。2、主调程序中如采用关键字变元调用程序,就必须写出被调子程序的接口块。3、当部分实元用关键字调用子程序时,第一个关键字变元前面的所有实元都必须与相应的虚元一一对应,一旦使用一个关键字,其后面的变元也必须使用关键字变元。例如,对子例子程序语句:SUBROUTINEHF(A,B,M,N)如希望A与5结合,B与25结合,M与10结合,N与1结合,则如下调用语句都是正确的: CALLHF(5,25,10,1) CALLHF(B=25,A=5,M=10,N=1) CALLHF(5,25,M=10,N=1)但如下的调用语句是错误的: CALLHF(25,5,N=1,M=10) CALLHF(5,25,M=10,1)错?6.4.2可选择变元调用时可根据实际需要,只对虚元表中部分虚元作虚实结合(即虚元可无对应的实元)。虚元必须在过程中被说明成是可选择的。即要求它具有OPTIONAL属性。OPTIONAL属性:若一个虚元的类型说明语句中有该属性,便是可选的,没有该属性的是必选变元。PRESENT(X)函数:用来检查虚元X是否在程序执行时结合到对应实元,有对应实元则返回为“真”。PROGRAMMAININTERFACESUBROUTINES(Y,X)INTEGER::XINTEGER,OPTIONAL::YENDENDINTERFACEINTEGER::A,BA=2;B=3CALLS(X=B)CALLS(X=B,Y=A)ENDSUBROUTINES(Y,X)INTEGER::C,XINTEGER,OPTIONAL::YIF(PRESENT(Y))THENC=X+YELSEC=XENDIFPRINT*,CEND35可选变元例为什么采用关键字变元调用?例6-8编写一个函数子程序。根据需要,既能求出圆柱的底面积值,也能求出圆柱的体积值。此时可将高度H列为可选择变元。可选变元应用FUNCTIONSS(R,H)RESULT(SS_RESULT) IMPLICITNONE REAL,INTENT(IN)::R REAL,OPTIONAL,INTENT(IN)::H REAL::SS_RESULT REAL::TEMP_H IF(PRESENT(H))THEN TEMP_H=H ELSE TEMP_H=1.0 ENDIF SS_RESULT=3.141593*R**2*TEMP_HENDFUNCTIONSS函数子程序说明H是可选变元检查虚元H是否在程序执行时结合到对应实元主调程序PROGRAMSS_OPTIONAL IMPLICITNONE INTERFACE FUNCTIONSS(R,H)RESULT(SS_RESULT) REAL,INTENT(IN)::R REAL,OPTIONAL,INTENT(IN)::H REAL::SS_RESULT ENDFUNCTIONSS ENDINTERFACE PRINT'(1X,A,F10.3)','AREA=',SS(2.5) PRINT'(1X,A,F10.3)','VOLUME=',SS(2.5,9.6)ENDPROGRAMSS_OPTIONAL 实元是缺省的可选变元时,主调程序必须有接口块!6.4.3通过接口块更改虚元名称Fortran90允许调用子程序时用关键字变元改变虚元的名称,但必须写出接口块。并且要保持新、旧虚元名的对应位置不变。PROGRAMMAININTERFACESUBROUTINES(X,Y,Z)INTEGER::X,Y,ZENDENDINTERFACEREAD*,M,NCALLS(X=M,Y=N,Z=L)PRINT*,LENDSUBROUTINES(XX,YY,ZZ) INTEGER::XX,YY,ZZ ZZ=XX+YYEND6.4.4虚数组 虚元也可以是一个数组名。 实元是形相同的数组或其成分。 当函数返回结果为数组,或过程虚元为一个假定形状数组时,主调程序要增加接口块。 虚数组的详细使用 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 将在第7章介绍。6.5子程序的嵌套调用FORTRAN语言允许子程序的嵌套调用(也称多层调用),即在调用一个子程序的过程中该被调子程序又调用了另一个子程序。如图6-1。子程序嵌套调用Functionf(y,x)result(f_result)real::x,y,f_result f_result=y*x-yendProgrammainreal::x,y,z read*,x,y Calls(x,y,z) Print*,zEndSubroutines(a,b,c)real::a,b,c,f c=a+b+f(a,b)End6.5.2虚过程虚过程:虚元是一个过程名,对应的实元可以是内在函数或外部过程。1、如果实元为内在函数:主调程序中用INTRINSIC属性说明。(属性见课本P38)2、如果实元为外部过程:主调程序中用EXTERNAL属性或接口块说明,以便让编译系统清楚该实元不是一般变量。3、虚实过程的结合 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 是:等价虚过程的使用增加了程序的功能,使程序更灵活!内在函数作为实过程PROGRAMMAIN IMPLICITNONE REAL,INTRINSIC::cos,sin REAL::X,Y X=60.0 CALLF1(X,Y,cos) PRINT*,X,Y CALLF1(X,Y,sin) PRINT*,X,YENDPROGRAMMAINSUBROUTINEF1(X,Y,FUN) IMPLICITNONE REAL::X,Y,FUN Y=FUN(X/180*3.14) ENDSUBROUTINEF1说明cos和sin是内部函数,不是一般变量。外部函数作为实过程(例6-10)设有一个过程PROC,在调用它的时候,每次实现不同的功能。输入A和B两个数,第一次调用时求出A、B之和,第二次调用时求出A、B之差。程序如下:!虚元FUN是虚过程的子例行子程序SUBROUTINEPROC(A,B,FUN) IMPLICITNONE INTERFACE FUNCTIONFUN(X,Y)RESULT(FUN_RESULT) INTEGER,INTENT(IN)::X,Y INTEGER::FUN_RESULT ENDFUNCTIONFUN ENDINTERFACE INTEGER,INTENT(IN)::A,B PRINT*,FUN(A,B)ENDSUBROUTINEPROCINTEGER::FUN等价!求两数之和函数子程序FUNCTIONSUM(X,Y)RESULT(SUM_RESULT) IMPLICITNONE INTEGER,INTENT(IN)::X,Y INTEGER::SUM_RESULT SUM_RESULT=X+YENDFUNCTIONSUM!求两数之差函数子程序FUNCTIONMINU(X,Y)RESULT(MINU_RESULT) IMPLICITNONE INTEGER,INTENT(IN)::X,Y INTEGER::MINU_RESULT MINU_RESULT=X-YENDFUNCTIONMINUPROGRAMACTUAL_PROCEDURE IMPLICITNONE INTERFACE FUNCTIONSUM(X,Y)RESULT(SUM_RESULT) INTEGER,INTENT(IN)::X,Y INTEGER::SUM_RSULT ENDFUNCTIONSUM FUNCTIONMINU(X,Y)RESULT(MINU_RESULT) INTEGER,INTENT(IN)::X,Y INTEGER::MINU_RESULT ENDFUNCTIONMINU ENDINTERFACE INTEGER::A,B READ*,A,B CALLPROC(A,B,SUM) CALLPROC(A,B,MINU)ENDPROGRAMACTUAL_PROCEDURE使用接口块说明SUM和MINU是外部函数,不是一般变量。INTEGER,EXTERNAL::SUM,MINU等价虚过程的应用:数值计算程序设计1、编写通用子程序求定积分2、方程求根:方程的定义类似计算定积分:函数的定义用外部函数单位(接口)Functiont(a,b,n,g)result(t1)Real::a,b,g,h,t1,f1,f2Integer::I,nH=(b-a)/nT1=0;f1=g(a)DoI=1,nf2=g(a+I*h)t1=t1+(f1+f2)*h/2f1=f2EnddoendProgrammainreal,external::fInteger::n;real::s,tRead*,nS=t(0.0,1.0,n,f)Print*,sEndprogramFunctionf(x)result(f_result)Real::x,f_resultf_result=1.0/(1.0+x)Endfunction6.6模块功能:提供共享常量、变量、类型定义和过程;即公用的信息可放入模块单位。各程序单位共享信息的途径:①虚实结合②模块单位模块也是一种独立编写的程序单元6.6.1模块定义模块单位写法:一般形式MODULE模块名类型说明部分[CONTAINS内部过程子程序1……内部过程子程序n]ENDMODULE[模块名]模块名通常加后缀“_MOUDLE”(也可以不加该后缀),以增加易读性。另模块名为全局名:不能与本程序内的任何程序单元名、外部名同名,也不得与模块内的任何局部名同名。说明包括:类型说明语句、派生类型定义及接口块等各过程是可选的。当模块内有内部过程时,必须把整个过程完整地写入,各内部过程次序可以任意。说明:1、一个程序中可以有多个模块程序单元,每个模块都要独立编写;2、模块包含程序说明语句及在模块内定义的过程,但不能直接运行;3、其他程序单元引用模块时,就是复制该模块内的全部语句,并且与模块中的名字相同的变量共享存储单元,所以引用模块起两个作用:共享与复制。4、假设有几个子程序或函数中都用到了同一些变量,只需把它们放在一个模块中,从而实现共享数据。(1)模块应先定义,(2)模块不给其它单位调用,而用USE语句引用(3)模块中无可执行语句模块和子程序之间的区别:各单位用USE语句共享模块中的信息USE语句的一般形式为:USE模块名1,模块名2,……USE语句位置:单位定义语句之后,IMPLICITNONE语句之前6.6.2模块的引用FUNCTIONAVER3(A,B,C)RESULT(AVER_VALUE) IMPLCITNONE REAL::A,B,C REAL::AVER_VALUE AVER_VALUE=(A+B+C)/3.0ENDFUNCTION例6-11读入3个数,调用函数AVER3求平均值,调用函数MAX3求最大值FUNCTIONMAX3(A,B,C)RESULT(MAX_VALUE) IMPLCITNONE REAL::A,B,C REAL::MAX_VALUE MAX_VALUE=A IF(B>MAX_VALUE)MAX_VALUE=B IF(C>MAX_VALUE)MAX_VALUE=CENDFUNCTION!主程序PROGRAMAVER_MAX_1 IMPLICTNONE REAL::A,B,C REAL::AVER3,MAX3 READ*,A,B,C PRINT*,AVER3(A,B,C),MAX3(A,B,C)ENDPROGRAM方法1:通过虚实结合传递数据例6-11读入3个数,调用函数AVER3求平均值,调用函数MAX3求最大值MODULEEXAM_MODULE REAL::A,B,CENDMODULEEXAM_MODULE例6-11读入3个数,调用函数AVER3求平均值,调用函数MAX3求最大值FUNCTIONAVER3()RESULT(AVER_VALUE) USEEXAM_MODULE REAL::AVER_VALUE AVER_VALUE=(A+B+C)/3.0ENDFUNCTIONFUNCTIONMAX3()RESULT(MAX_VALUE) USEEXAM_MODULE REAL::MAX_VALUE MAX_VALUE=A IF(B>MAX_VALUE)MAX_VALUE=B IF(C>MAX_VALUE)MAX_VALUE=CENDFUNCTION!主程序PROGRAMAVER_MAX_1 USEEXAM_MODULE REAL::AVER3,MAX3 READ*,A,B,C PRINT*,AVER3(),MAX3()ENDPROGRAM例6-11读入3个数,调用函数AVER3求平均值,调用函数MAX3求最大值方法2:利用模块实现数据的共享在主程序中输入A、B、C后,函数AVER3和MAX3中的A、B和C具有了同样的值。因此不必再把A、B、C作为变元,使AVER3和MAX3成为无参的函数1、通过模块共享可以取代程序单元间的虚实结合,使子程序减少或不用虚元。2、允许共享模块中的部分变量,其形式为:use模块名,only:变量名表例:useexam,only:a,b3、更名共享例:useexam,x=>a,y=>b  x,y引用单位的局部名a,b模块中的名即把a,b换名为x,y关于模块概念的理解4、可以对模块内说明的变量、派生类型及其成员的使用范围进行限制。 加PRIVATE(专用)属性,模块以外的程序单元不能使用。 加PUBLIC(公用)属性。例:TYPE,PRIVATE::DATA_TYPE INTEGER::M,N REAL::X,YENDTYPEDATA_TYPE或:TYPEDATA PRIVATE INTEGER::A ...ENDTYPE表示模块中的派生类型、派生类型的内部成员是“专用”的,模块以外的程序单元不能使用。5、模块的内部过程也可供引用模块的的各程序单元使用。例6-11的方法3:将函数放入模块内MODULEEXAM_MODULE IMPLICITNONE REAL::A,B,C CONTAINS FUNCTIONAVER3()RESULT(AVER_VALUE) IMPLICITNONE REAL::AVER_VALUE AVER_VALUE=(A+B+C)/3.0 ENDFUNCTIONAVER3 FUNCTIONMAX3()RESULT(MAX_VALUE) IMPLICITNONE REAL::MAX_VALUE MAX_VALUE=A IF(B>MAX_VALUE)MAX_VALUE=B IF(C>MAX_VALUE)MAX_VALUE=C ENDFUNCTIONMAX3ENDMODULEEXAM_MODULE函数要完整书写,次序任意主调程序:不再需要对调用的函数的类型进行说明。即不需要:REAL::AVER3,MAX3PROGRAMAVER_MAX_3 USEEXAM_MODULE IMPLICITNONE READ*,A,B,C PRINT*,AVER3(),MAX3()ENDPROGRAMAVER_MAX_37、通常用模块来建立新的数据类型及规定新类型的操作、赋值等MODULETYPE_A TYPEREC_TYPE INTEGER::NO REAL::A,B,C CHARATER(LEN=20)::NAME ENDTYPEENDMODULE当某程序需要使用类型REC_TYPE时,便可以用USETYPE_A引用它程序阅读:先读模块单位及各单位的USE,画共享表(按名结合),再读主程序.MODULEA1 COMPLEX::X,YENDMODULESUBROUTINECOMP(A,B) USEA1 COMPLEX::A,B A=X+Y B=X-YENDSUBROUTINEPROGRAMMAIN USEA1 X=(3.0,4.0) Y=(4.0,3.0) CALLCOMP(X,Y) CALLCOMP(X,X) CALLCOMP(Y,X) PRINT*,X,YEND递归调用是指过程内直接或间接地调用自己,能进行递归调用的过程称为递归过程。可以是子例行子程序,也可以是函数子程序。在递归调用中,一个过程执行的某一步要用到它自身的前面一步或前若干步的结果。例:用递归方法求N!6.7递归过程递归调用终止条件(1)可将一个问题转化为具有同样解法的规模较小的问题;(2)可以通过转化使问题得到解决;(3)必须有一个结束递归过程条件(又称为终止条件或边界条件),使递归过程是有限递归过程,例如上例中边界条件是:n!=1(n=1).一个问题采用递归方法来解决时必须符合以下条件:递归过程需要在子程序的入口语句前加上关键字RECURSIVE,这样才可在过程体中实现递归调用。其他语句的写法没有特殊要求。6.7.1递归函数例6-12用递归方法求n!recursiveFunctionfac(n)result(fac_result) Integer,intent(in)::n Integer::fac_result If(n==1)then fac_result=1 Else fac_result=n*fac(n-1) endifEndfunctionN!的递归函数子程序递归结束条件递归调用:重复执行子程序主调程序的写法与调用非递归函数的写法基本相同。Programrecursive_fun Implicitnone Interface Recursivefunctionfac(n)result(fac_result) Integer,intent(in)::n Integer::fac_result Endfunction Endinterface Integer::n Read*,n Print*,fac(n)Endprogram例,Fac(5)的执行过程例6-13:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁,问第4个人的岁数,他说比第3个人大2岁,问第3个人的岁数,他说比第2个人大2岁,问第2个人,他说比第1个人大2岁,问第一个人,他说是10岁。请问第5个人的岁数?分析:显然这是一个递归问题。即:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10递归举例*递归举例RECURSIVEFUNCTIONAGE(N)RESULT(AGE_RESULT) IMPLICITNONE INTEGER,INTENT(IN)::N INTEGER::AGE_RESULT IF(N==1)THEN AGE_RESULT=10 ELSE AGE_RESULT=AGE(N-1)+2 ENDIFENDFUNCTIONAGEPROGRAMRECURSIVE_AGE IMPLICITNONE INTEGER::AGE PRINT*,AGE(5)ENDPROGRAMRECURSIVE_AGE*例6-23:Fibonacci数列,用递归函数求此数列的第n项。程序清单如下:RecursiveFunctionfib(n)result(fib_result) integer::fib_result,n if(n==0.or.n==1)then fib_result=1 else fib_result=fib(n-1)+fib(n-2) endifEndfunction*读程序,写出运行结果:Programmain Implicitnone Integer::n=5,sum1 Print*,sum1(n) Print*,nEndRecursivefunctionsum1(m)result(sum_result) Integer::m,sum_result Selectcase(m) Case(1) Sum_result=1 Casedefault Sum_result=sum1(m-1)+m Endselect m=m+2Endfunction157递归的分类RecursiveFunctionfunc(x)result(f_result) integer::y,z,f_result … z=func(y) … Endfunction直接递归:自己调用自己*RecursiveFunctionf1(x)result(f1_res) Integer::y,z,f1_res … z=f2(y) … f1_res=(2*x)EndfunctionRecursiveFunctionf2(t)result(f2_res) integer::a,c,f2_res … c=f1(a) … f2_res=(3+c)Endfunction间接递归:通过别人调用自己递归的分类间接递归例:6-15验证角谷猜想 任意一个自然数,若为偶数则除以2;若为奇数则乘以3后加1。如此经过有限次运算后最终能得到自然数1。RECURSIVEFUNCTIONDECREASE(A)RESULT(DE_RES) IMPLICITNONE INTEGER,INTENT(IN)::A INTEGER::DE_RES,INCREASE DE_RES=A DOWHILE(MOD(DE_RES,2)==0) DE_RES=DE_RES/2 PRINT*,'DECREASE:',DE_RES ENDDO IF(DE_RES/=1)DE_RES=INCREASE(DE_RES)ENDFUNCTIONDECREASERECURSIVEFUNCTIONINCREASE(B)RESULT(IN_RES) IMPLICITNONE INTEGER,INTENT(IN)::B INTEGER::IN_RES,DECREASE IN_RES=3*B+1 PRINT*,'INCREASE:',IN_RES IN_RES=DECREASE(IN_RES)ENDFUNCTIONINCREASE偶数除2奇数乘3+1PROGRAMINDIRECT IMPLICITNONE INTEGER::DECREASE INTEGER::N,X READ*,N X=DECREASE(N) PRINT'(1X,"FINAL=",I8,",",I4)',N,XENDPROGRAM主调程序有三根针A、B、C,A针上有64个盘子,盘子大小不等。大的在下,小的在上。要求把这64个盘子从A针移到C针,在移动的过程中可借助B针,每次只允许移动一个盘,且在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。例6-14:Hanoi塔问题(自学)。*6.8其它部分 外部过程与内部过程 类属过程 超载运算符 自定义运算符 超载赋值号6.8.1外部过程与内部过程 外部过程:未包含在主程序单元(或过程、模块)中的过程。外部过程独立成为一个程序单元,与主程序单元分别编译。 内部过程:写在主程序单元(或过程、模块)之内,作为主程序(或某一过程、某一模块)内包含的一个过程。1.内部过程的位置SubroutineName[DeclarationStatements][ExecutableStatements][ContainsInternalSubprograms]End[Subroutine[Name]] 或是FunctionName([arguments])[DeclarationStatements][ExecutableStatements][ContainsInternalSubprograms]End[Function[Name]]PROGRAMNAME[主程序的说明部分][主程序的执行部分][CONTAINS内部子例子程序内部函数子程序]END[PROGRAM[NAME]]1)内部过程通常没有说明语句,使用的变量等实体的说明应统一放在包含它的程序单元的说明部分。2)内部过程一般没有虚元。主调程序调用时也不需要虚实结合。变量可以直接使用。调用过程名也只要简单的写一个过程名。在一些特殊场合,内部过程也可保留自己单独说明的少量虚元。如果变量是在内部子程序中单独说明的,它只是局部变量。2.内部过程与外部过程的区别:例6-16编写一过程,求两个数之和。方法一:用外部过程实现Programexternal_proc integer::A,B,sumread*,A,Bcalladd(A,B,sum)print*,’sum=’,sumEndSubroutineadd(A,B,sum) integer,intent(in)::A,B integer,intent(out)::sum sum=A+BEnd方法二:利用内部过程实现Programinternal_procinteger::A,B,sumread*,A,Bcalladdprint*,’sum=’,sumcontainssubroutineadd sum=A+B endsubroutineaddEnd主、子单位分开编译,变量A,B为不同的变量。一起编译,主、子单位中的变量A,B为同一个变量,但如子程序中重新说明A、B的类型则为不同变量。使用内部或外部过程时还应注意以下几点: 包含内部过程的主程序(或模块、子程序)中,一定要有contains语句。 一个内部过程应在包含该过程的主程序或过程中说明,内部过程中不得再含有内部过程。 内部过程名为局部名,不得作为实元。 内部过程只能给包含它的程序及其他并列的内部过程调用,其他外部过程不能调用该内部过程。 主程序能调用外部过程,外部过程也可以调用外部过程。 模块中包含的内部过程可供主程序和过程引用,可以通过USE语句实现。6.8.2类属过程、超载运算符、自定义运算符、超载赋值号1、类属过程类属过程是过程的一种。它允许实元与对应的虚元类型不同,放宽了虚实结合时类型必须一致的条件。编写方法:1)编写若干个功能相同的过程,分别有不同的类型的虚元。2)在主调程序中编写接口,为接口取一个统一的名字,接口名就是类属过程名(各过程统一的名字)。接口内分别列出虚元类型不同的过程说明部分的语句。3)主调程序可使用类属名调用子程序,由类型决定调用的过程。功能相同,类型不同subroutineswap_real(a,b) implicitnone real,intent(inout)::a,b real::temp temp=a;a=b;b=tempendsubroutinesubroutineswap_int(a,b) implicitnone integer,intent(inout)::a,b integer::temp temp=a;a=b;b=tempendsubroutine例6-17编写交换两个存储单元数据的类属过程。programswap_dataimplicitnoneinterfaceswap!类属过程名subroutineswap_real(a,b)real,intent(inout)::a,bendsubroutinesubroutineswap_int(a,b)integer,intent(inout)::a,bendsubroutineendinterfacereal::x1,x2integer::y1,y2read*,x1,x2read*,y1,y2callswap(x1,x2)!由类型决定如何调用print*,x1,x2callswap(y1,y2)print*,y1,y2endprogram主调程序中使用接口块说明类属过程名:类属过程必须提供接口块说明: 各过程的说明可以写在一个接口块内,也可以写在几个接口块内,但每个接口块的类属名要相同 类属名可以任取 类属过程可以是函数过程或子例子程序过程2、超载运算符、自定义运算符通过特定过程扩展普通运算符的功能,使其具有新的含义。具有新含义的运算符仍符合规定的运算优先等级。1、超载运算符有两类:内在运算符(+-*/等)自定义:.一串字符.2、超载运算符由接口定义3、超载运算符运算规则由函数子程序(过程)定义4、超载运算的执行:调用子程序再假设用符号“+”来完成这个运算。那么‘JOHN’+‘DOT’=‘JOHNDOT’例6-18:假设定义一个字符串运算,让它删除两个字符串的尾部空格后将两个字符串连接起来。functionconcat(str1,str2)result(concat_result)implicitnonecharacter(len=200)::concat_resultcharacter(len=100),intent(in)::str1,str2concat_result=str1concat_result(len_trim(str1)+1:len_trim(str1)+&len_trim(str2))=str2endfunction先定义一个普通函数续行标记programconectimplicitnoneinterfaceoperator(+)functionconcat(str1,str2)result(concat_result)character(len=200)::concat_resultcharacter(len=100),intent(in)::str1,str2endfunctionendinterfacecharacter(len=100)::ch1,ch2character(len=200)::yread*,ch1,ch2y=ch1+ch2!y=concat(ch1,ch2)print*,yendprogram在主调程序中编写接口块,将函数功能定义为超载运算符“+”:使用时不能与它原有的运算对象有相同的类型和种类注意:①由类型决定是内在运算还是超载运算如上述“+”运算符可以用于连接两个字符串,但仍可以做数值的加法运算。操作数为数值,做加法运算操作数不为数值,操作含义要到functionconcat中找②子程序的虚元一定要有INTENT属性③阅读画虚实表时注意顺序(第一操作数为第一个实元,第二操作数为第二个实元……)自定义运算符自定义的运算符可由字母组成。两边用小数点作定界符。.一串字符.注意:通常程序员定义的单目运算符都有一个相同的优先级,它比所有固有的运算符的等级要低,但程序员定义的二目运算符比固有运算符的优先级要高。自定义运算符的名称可以任取,但不能与固有运算符同名,也不能与逻辑常量同名。FUNCTIONupper_str(str)result(upper_string) implicitnone character(len=*),intent(in)::str character(len=255)::upper_string integer::i character::ch doi=1,len_trim(str) ch=str(i:i) if(ch>='a'.and.ch<='z')then upper_string(i:i)=achar(ichar(ch)-32) else upper_string(i:i)=ch endif enddoendfunction例6-19:定义一个新运算符,能将一个字符串中小写字母改成大写。内部函数(P208)achar:根据ASC码值返回对应字符Ichar:返回该字符的ASC码值programmain_upperimplicitnoneinterfaceoperator(.upper.)FUNCTIONupper_str(str)result(upper_string)character(len=*),intent(in)::strcharacter(len=255)::upper_stringendfunctionendinterfacecharacter(len=6)::ch1,ch2read(*,'(a)')ch1ch2=.upper.ch1!ch2=upper_str(ch1)print'(a,/a)',ch1,ch2endprogram书写相应的接口块,使用自定义运算符.UPPER.字符变量作虚元时可以不指明其具体长度,则它可与任意长度实元结合3、超载赋值 超载赋值是指把赋值的含义扩展到新的数据类型。 按规定赋值号两边的类型必须相容。用超载赋值时,可以进行类型不同的数据间赋值。 例:把.true.赋给一个整型变量得值1;把.false.赋给一个整型变量得值0。实现赋值号超载的方法是:1、先编写一个不同类型变量之间一一对应关系的子例子程序。 子程序只有两个虚元,第一个虚元具有intent(out)属性,第二个虚元具有intent(in)属性2、再在主调程序中编写一个接口,接口语句的形式为:interfaceassignment(=)3、超载赋值的执行:调用子程序注意:①子程序的虚元一定要有INTENT属性②阅读画虚实表时注意顺序(左操作数为第一个实元,右操作数为第二个实元)Subroutinelog_int(I,L)Integer,intent(out)::ILogical,intent(in)::LIf(L)thenI=1ElseI=0Endifendsubroutineprogramover_loadingimplicitnoneInterfaceassignment(=)Subroutinelog_int(I,L)Integer,intent(out)::ILogical,intent(in)::LendsubroutineEndinterfaceInteger::k1,k2K1=.true.K2=.false.Print*,k1,k2end例6-20编写一个子例子程序,把逻辑表达式的值超载赋值给整型变量。注意: 进行超载赋值运算时,必须编写成子例子程序形式; 要实现超载运算符功能时,必须编成函数子程序形式。6.9程序举例例6-21用函数子程序求自然数A和B的最大公约数。 例5-18已给出了用辗转相除法求两数的最大公约数。本例用函数子程序法实现,A和B为函数变元,函数结果返回最大公约数。!函数子程序FUNCTIONGCD(A,B)RESULT(GCD_RESULT) IMPLICITNONE INTEGER::A,B INTEGER::GCD_RESULT,R DO R=MOD(A,B) IF(R==0)EXIT A=B B=R ENDDO GCD_RESULT=BENDFUNCTIONGCD!主调程序PROGRAMGCD_FUN IMPLICITNONE INTEGER::A,B,GCD READ*,A,B PRINT*,GCD(A,B)ENDPROGRAMGCD_FUNRECURSIVEFUNCTIONGCD(A,B)RESULT(GCD_RESULT) IMPLICITNONE INTEGER::A,B,GCD_RESULT,R R=MOD(A,B) IF(R==0)THEN GCD_RESULT=B ELSE A=B B=R GCD_RESULT=GCD(A,B) ENDIFENDFUNCTIONGCD递归函数子程序(P1486.15)例6-24编写通用子程序求定积分积分公式通用函数TRPFUNCTIONTRP(F,A,B,N)RESULT(TRP_RESULT) IMPLICITNONE REAL::F,A,B,TRP_RESULT,H,SUM INTEGER::N,I H=(B-A)/N SUM=(F(A)+F(B))/2.0 DOI=1,N-1 SUM=SUM+F(A+I*H) ENDDO TRP_RESULT=SUM*HENDFUNCTIONF是虚过程F1、F2两个实过程FUNCTIONF1(X)RESULT(F1_RESULT) IMPLICITNONE REAL::X,F1_RESULT F1_RESULT=X**2+3*X+2ENDFUNCTIONF1FUNCTIONF2(X)RESULT(F2_RESULT) IMPLICITNONE REAL::X,F2_RESULT F2_RESULT=X*SIN(X)ENDFUNCTIONF2主调程序PROGRAMMAIN IMPLICITNONE REAL,EXTERNAL::F1,F2 REAL::TRP REAL::A1,A2,B1,B2 INTEGER::N1,N2 READ*,A1,B1,N1 PRINT*,TRP(F1,A1,B1,N1) READ*,A2,B2,N2 PRINT*,TRP(F2,A2,B2,N2)ENDPROGRAMMAIN说明F1和F2是外部过程,也可使用接口块。A)函数过程由FUNCTION语句来说明,函数名的命名方式与变量相同。B)虚参数表中可以包含变量名、过程名、数组名和指针等。C)结果变量用于存放函数执行结果,它应该在过程体中至少被赋值一次。D)内部函数子程序不是一个独立的程序单位,它能被任何程序单位调用。1.下面对函数程序过程的描述,哪一句是错误的?A)接口块说明必须以INTERFACE开始,ENDINTERFACE结束。B)任何程序单位内均可使用接口块说明。C)定义超载运算符必须使用接口块说明。D)定义超载赋值符必须使用接口块。2.有关主调程序单位内使用接口块说明,以下说法中错误的是:A)模块名可以与其他程序单位同名。B)除模块中的内部过程外,模块不能包含可执行语句。C)模块内定义的变量可供使用该模块的所有程序单位引用(共享)。D)一个模块内可以使用另一个模块。3.关于模块,以下说法中错误的是:A)CONTAINS语句用来分隔程序单位的主体部分与内部过程部分。B)除模块外,CONTAINS语句必须位于程序单位可执行部分和结尾语句END之间。C)内部过程中不能再包含CONTAINS语句。D)CONTAINS语句是可执行语句。4.关于定义内部过程的CONTAINS语句,以下说法中错误的是:A)直接递归过程只需用一个过程就能定义。B)间接递归过程至少用两个过程才能定义。C)间接递归过程只能用两个过程定义。D)直接递归能解决的问题用间接递归方法也能解决,但后者开销大。5.关于递归过程,以下说法中错误的是:本章小结 外部过程:函数子程序、子例行子程序 虚实结合:一般原则、关键字变元、可选变元、虚元更名 子程序嵌套调用、虚过程(EXTERNAL、INTRINSIC) 接口块(必须提供P116) 模块定义、引用 递归过程:直接、间接 其他部分:内部过程、类属过程、超载运算符、自定义运算符、超载赋值号*****
本文档为【FORTRAN90学习资料Visual Fortran90第6章2】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
潮起潮落
一线信息技术教师,具有丰富教学经验和管理经验,多次被评为地级优秀教师
格式:ppt
大小:1MB
软件:PowerPoint
页数:0
分类:高中思想政治
上传时间:2019-09-24
浏览量:10