收藏 分销(赏)

FORTRAN90程序设计9.pptx

上传人:胜**** 文档编号:1643306 上传时间:2024-05-07 格式:PPTX 页数:27 大小:96.21KB
下载 相关 举报
FORTRAN90程序设计9.pptx_第1页
第1页 / 共27页
FORTRAN90程序设计9.pptx_第2页
第2页 / 共27页
FORTRAN90程序设计9.pptx_第3页
第3页 / 共27页
FORTRAN90程序设计9.pptx_第4页
第4页 / 共27页
FORTRAN90程序设计9.pptx_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、第9部分 模块l9.1模块的定义模块的定义l9.2USE语句语句l9.3接口块接口块l9.4超载和定义操作符超载和定义操作符l9.5模块的应用模块的应用模块的定义模块的定义 l模块定义的一般形式是:模块定义的一般形式是:MODULE模块名模块名类型说明部分类型说明部分CONTAINS内部过程子程序内部过程子程序1内部过程子程序内部过程子程序NENDMODULE模块名模块名lMODULE是关键字,模块定义以是关键字,模块定义以MODULE语句开始,语句开始,ENDMODULE语语句结束。模块名后面通常加后缀句结束。模块名后面通常加后缀“_MODULE”(也可以不加该后缀也可以不加该后缀),以增,

2、以增强可读性。强可读性。模块的定义模块的定义l类型说明部分可以是类型说明语句、派生类型定义及接口块类型说明部分可以是类型说明语句、派生类型定义及接口块等,但不能有执行语句、语句函数、等,但不能有执行语句、语句函数、ENTRY语句或语句或FORMAT语句。这些语句可以出现在模块所包含的内部过语句。这些语句可以出现在模块所包含的内部过程中。程中。l模块的内部过程以模块的内部过程以CONTAINS语句开始,这部分是可选的。语句开始,这部分是可选的。当模块有内部过程时,必须将整个过程完整地写入,各内部当模块有内部过程时,必须将整个过程完整地写入,各内部过程次序可以任意。过程次序可以任意。l一个程序中可

3、以有多个模块程序单元,每个模块程序单元都一个程序中可以有多个模块程序单元,每个模块程序单元都要独立编写。要独立编写。l模块名对程序来说是全局的,不能与本程序内的任何程序单模块名对程序来说是全局的,不能与本程序内的任何程序单元名相同,也不得与模块内的任何局部变量同名。元名相同,也不得与模块内的任何局部变量同名。模块的定义模块的定义l下面是一个包含模块内部过程的例子:下面是一个包含模块内部过程的例子:MODULEMY_MODULEREAL,PARAMETER:PI=3.1415926CONTAINSSUBROUTINESWAP(X,Y)REALTEMP,X,YTEMP=XX=YY=TEMPENDS

4、UBROUTINESWAPENDMODULEMY_MODULEUSE语句语句 lUSE语句的最简单形式为:语句的最简单形式为:lUSE模块名模块名1,模块名,模块名2,模块名,模块名Nl这条语句提供了对模块的所有公共的有名数据对象、派生类型、接口块、这条语句提供了对模块的所有公共的有名数据对象、派生类型、接口块、过程等的访问。过程等的访问。l在作用域单位内,在作用域单位内,USE语句必须出现在其他说明语句之前。语句必须出现在其他说明语句之前。l如果需要对两个或两个以上的模块进行访问,可能会在不同的模块中用如果需要对两个或两个以上的模块进行访问,可能会在不同的模块中用到了相同的名字,因此允许到了

5、相同的名字,因此允许USE语句对被访问的对象重新命名,以解决语句对被访问的对象重新命名,以解决局部对象和模块中访问对象之间的名字的冲突问题。要重新命名时,局部对象和模块中访问对象之间的名字的冲突问题。要重新命名时,USE语句应具有下列形式:语句应具有下列形式:lUSE模块名,更名表模块名,更名表l其中,更名表的形式为:其中,更名表的形式为:l局部名局部名=使用名,局部名使用名,局部名=使用名,使用名,l例如:例如:lUSESTATS_LIB,S_PROD=PRODUSE语句语句l对于只需要使用模块中的部分对象的情况,可在对于只需要使用模块中的部分对象的情况,可在USE语句中语句中使用使用ONL

6、Y选项。这时选项。这时USE语句具有下列形式:语句具有下列形式:lUSE模块名,模块名,ONLY:ONLY表表l其中,其中,ONLY表的形式为:表的形式为:l局部名局部名=使用名,使用名,局部名局部名=使用名,使用名,l例如:例如:lUSESTATS_LIB,ONLY:S_PROD=PROD,MULT接口块接口块 l要使编译器能够正确地调用子程序,它必须知道这个子程序要使编译器能够正确地调用子程序,它必须知道这个子程序的一些信息,如程序名、变量的数目和变量的类型等。我们的一些信息,如程序名、变量的数目和变量的类型等。我们将这些信息收集在一起,就称为子程序的接口。将这些信息收集在一起,就称为子程

7、序的接口。l接口块必须放在调用程序的作用域内。接口块必须放在调用程序的作用域内。l接口块的一般形式为:接口块的一般形式为:lINTERFACE类属说明类属说明l接口体接口体l模块过程语句模块过程语句lENDINTERFACEl接口块能将子程序中所需的信息精确的拷贝过来,通过它可接口块能将子程序中所需的信息精确的拷贝过来,通过它可以为主调程序和被调用子程序指明一个显式接口。以为主调程序和被调用子程序指明一个显式接口。几点应该注意l(1)接口块以接口块以INTERFACE语句开始,以语句开始,以ENDINTERFACE语句结束,块内只能取被调用过程中的说名部分,不允许出语句结束,块内只能取被调用过

8、程中的说名部分,不允许出现任何可执行语句。现任何可执行语句。l(2)类属说明的形式为:类属说明的形式为:l类属名类属名l或或OPERATOR(定义的运算符定义的运算符)l或或ASSIGNMENT(=)l其中,类属名用于定义类属过程、其中,类属名用于定义类属过程、OPERATOR用于定义运算用于定义运算符、符、ASSIGNMENT用于超载赋值运算。用于超载赋值运算。几点应该注意l(3)接口块内的语句称为接口体。接口体的形式为:接口块内的语句称为接口体。接口体的形式为:l函数语句函数语句l说明部分说明部分l函数的函数的END语句语句l或或l子程序语句子程序语句l说明部分说明部分l子程序的子程序的E

9、ND语句语句l(4)接口体中不能包含接口体中不能包含ENTRY语句、语句、DATA语句、语句、FORMAT语句或语句语句或语句函数。函数。l(5)接口块不允许出现在接口块不允许出现在BLOCKDATA程序单元中。程序单元中。l(6)当接口块说明的是一个模块的内部过程时,应使用模块过程语句来当接口块说明的是一个模块的内部过程时,应使用模块过程语句来说明。模块过程语句的形式为:说明。模块过程语句的形式为:lMODULEPROCEDURE过程名表过程名表几点应该注意l(7)只有当接口块中有一个类属说明,并且其宿主使一个模块或用只有当接口块中有一个类属说明,并且其宿主使一个模块或用USE语句使一语句使

10、一个模块可见时,才允许有模块过程语句。其中的各过程必须是其宿主中可见的个模块可见时,才允许有模块过程语句。其中的各过程必须是其宿主中可见的模块过程名。例如:模块过程名。例如:lMODULEINTERVAL_ARITHMETIClTYPEINTERVALlREAL:LOWER,UPPERlENDTYPEINTERVALlINTERFACEOPERATOR(+)lMODULEPROCEDURECOMB_INTERVALSlENDINTERFACElCONTAINSlFUNCTIONCOMB_INTERVALS(A,B)lTYPE(INTERVAL):COMB_INTERVALS,A,BlCOMB_

11、INTERVALS%LOWER=MIN(A%LOWER,B%LOWER)lCOMB_INTERVALS%UPPER=MAX(A%LOWER,B%LOWER)lENDFUNCTIONCOMB_INTERVALSllENDMODULEINTERVAL_ARITHMETIC几点应该注意l(8)一个辅程序中的接口块不允许含有一个被该辅程序定义的过程的接一个辅程序中的接口块不允许含有一个被该辅程序定义的过程的接口体。一个接口块中可以有多个接口体。口体。一个接口块中可以有多个接口体。l(9)接口块还可用来说明一个外部过程或虚过程,并为之提供显式的调接口块还可用来说明一个外部过程或虚过程,并为之提供显式的调

12、用接口,这比用接口,这比EXTERNAL语句提供了更多的信息,因而也提高了程序语句提供了更多的信息,因而也提高了程序的可读性。例如:下面是没有类属说明的接口块:的可读性。例如:下面是没有类属说明的接口块:lINTERFACElSUBROUTINEEXT1(X,Y,Z)lREAL,DIMENSION(100,100):X,Y,ZlENDSUBROUTINEEXT1lFUNCTIONEXT2(P,Q)lLOGICAL:EXT2lINTEGER:P(100)lLOGICAL:Q(200)lENDFUNCTIONEXT2lENDINTERFACEl这个接口块为过程这个接口块为过程EXT1、EXT2说明

13、了显式接口。说明了显式接口。超载和定义操作符超载和定义操作符 l类属过程类属过程l类属过程是过程的一种。它类属过程是过程的一种。它允许不同类型的实参与同一个虚允许不同类型的实参与同一个虚参结合参结合,放宽了虚实结合时类型必须一致的条件。,放宽了虚实结合时类型必须一致的条件。l例如,编写一个交换任意两个变量值的过程,但使用虚实结例如,编写一个交换任意两个变量值的过程,但使用虚实结合方式进行数据传递时,要求虚参和实参的类型必须一致,合方式进行数据传递时,要求虚参和实参的类型必须一致,这样我们就不能通过一个过程名来实现既能交换整型变量,这样我们就不能通过一个过程名来实现既能交换整型变量,又能交换实型

14、变量的操作。又能交换实型变量的操作。l为此,可以用一个过程名为此,可以用一个过程名SWAP来代表几个不同类型的交换来代表几个不同类型的交换过程,各过程的名称不同,具体调用时根据实参类型选择相过程,各过程的名称不同,具体调用时根据实参类型选择相应的过程,就像应的过程,就像内在类属函数内在类属函数一样。一样。超载和定义操作符超载和定义操作符MODULESWAP_MODULEIMPLICITNONEINTEGFACESWAPMODULEPROCEDURESWAP_INT,SWAP_REALENDINTERFACECONTAINSSUBROUTINESWAP_INT(A,B)INTEGER:A,B,T

15、EMPTEMP=A;A=B;B=TEMPENDSUBROUTINESWAP_INTSUBROUTINESWAP_REAL(A,B)REAL:A,B,TEMPTEMP=A;A=B;B=TEMPENDSUBROUTINESWAP_REALENDMODULESWAP_MODULEPROGRAMTEST_SWAPUSESWAP_MODULEREAL:X=1.1,Y=2.2INTEGER:I=1,J=2CALLSWAP(X,Y)PRINT*,X,YCALLSWAP(I,J)PRINT*,I,JENDPROGRAMTEST_SWAP运行结果:运行结果:2.20000001.100000021超载和定义操作

16、符超载和定义操作符l超载赋值号超载赋值号l在执行赋值语句时,赋值号在执行赋值语句时,赋值号“=”右边表达式的数据类型将右边表达式的数据类型将会转换为左边变量的数据类型并赋值。会转换为左边变量的数据类型并赋值。l如果我们希望延伸这种功能,使得一个逻辑型的值能够赋予如果我们希望延伸这种功能,使得一个逻辑型的值能够赋予一个整型变量一个整型变量.l如在执行赋值语句:如在执行赋值语句:I=L时时(其中其中L是逻辑型,而是逻辑型,而I是整型是整型),使使.FALSE.相当于相当于0,使,使.TRUE.相当于相当于1。l需要编写一个过程完成此功能并用一个接口块来指明完成转需要编写一个过程完成此功能并用一个接

17、口块来指明完成转换的子程序名。换的子程序名。超载和定义操作符超载和定义操作符MODULEINT_LOGICALINTERFACEASSIGNMENT(=)MODULEPROCEDUREINTEGER_GETS_LOGICALENDINTERFACECONTAINSSUBROUTINEINTEGER_GETS_LOGICAL(I,L)INTEGER,INTENT(OUT):ILOGICAL,INTENT(IN):LIF(L)THENI=1ELSEI=0ENDIFENDSUBROUTINEINTEGER_GETS_LOGICALENDMODULEINT_LOGICALPROGRAMTEST_INT

18、_LOGICALUSEINT_LOGICALIMPLICITNONEINTEGER:I,JI=.FALSE.PRINT*,IJ=.TRUE.PRINT*,JENDPROGRAMTEST_INT_LOGICAL运行结果:运行结果:01超载赋值符的子程序必须只有两超载赋值符的子程序必须只有两个变量,第一个变量的个变量,第一个变量的INTENT属性为属性为OUT,第二个,第二个INTENT属属性为性为IN。超载和定义操作符超载和定义操作符l超载运算符超载运算符l如果我们希望用如果我们希望用+代替代替.OR.,用,用*代替代替.AND.,用,用-代替代替.NOT.来运算逻辑值,则可以用超载运算符来实现

19、。来运算逻辑值,则可以用超载运算符来实现。l需要在模块中写一个函数子程序和一个包含此函数子程序的需要在模块中写一个函数子程序和一个包含此函数子程序的接口块。这种情况下接口块。这种情况下INTERFACE语句中应包含关键字语句中应包含关键字OPERATOR。超载和定义操作符超载和定义操作符MODULELOGICAL_PLUSINTERFACEOPERATOR(+)MODULEPROCEDURELOG_PLUS_LOGENDINTERFACECONTAINSFUNCTIONLOG_PLUS_LOG(X,Y)RESULT(LOG_PLUS_LOG_RES)LOGICAL:LOG_PLUS_LOG_R

20、ESLOGICAL,INTENT(IN):X,YLOG_PLUS_LOG_RES=X.OR.YENDFUNCTIONLOG_PLUS_LOGENDMODULELOGICAL_PLUSPROGRAMTEST_LOGICAL_PLUSUSELOGICAL_PLUSIMPLICITNONEPRINT*,.FALSE.+.FALSE.PRINT*,.TRUE.+.TRUE.PRINT*,(2.25.5)+(3.31.1)ENDPROGRAMTEST_LOGICAL_PLUS运行结果:运行结果:FTT注意:第三条注意:第三条PRINT语句中的语句中的括号时必须的,因为运算符括号时必须的,因为运算符“+”

21、比比“”的运算优先级高。的运算优先级高。超载运算符的函数子程序必须超载运算符的函数子程序必须有一个或者两个变量有一个或者两个变量(依赖于被超依赖于被超载的运算符载的运算符),变量的,变量的INTENT属属性必须是性必须是IN。超载和定义操作符超载和定义操作符l用户定义的运算符用户定义的运算符l除了可以除了可以“超载超载”FORTRAN固有的运算符之外,用户还可以定义新的运固有的运算符之外,用户还可以定义新的运算符。算符。l如果我们想在程序中加入判定一个整数是否为素数的运算,可能就没有如果我们想在程序中加入判定一个整数是否为素数的运算,可能就没有哪个哪个FORTRAN固有的运算符适合于超载。这时

22、,我们可以定义一个新固有的运算符适合于超载。这时,我们可以定义一个新的运算符。的运算符。l它的名字应该是一个夹在两个它的名字应该是一个夹在两个“.”号之间长度介于号之间长度介于1和和31之间的一串字之间的一串字符,但这串字符不能与逻辑常量或者固有运算符相同。符,但这串字符不能与逻辑常量或者固有运算符相同。l定义一个新的运算符与超载一个已有的运算符的方式基本相似,可以在定义一个新的运算符与超载一个已有的运算符的方式基本相似,可以在INTEGFACE语句中含有这个运算符的名字,定义运算的函数子程序应语句中含有这个运算符的名字,定义运算的函数子程序应该有一个或两个该有一个或两个INTENT属性为属性

23、为IN的变量,函数子程序名应包含在的变量,函数子程序名应包含在MODULEPROCEDURE语句中。语句中。超载和定义操作符超载和定义操作符lINTERFACEOPERATOR(.PRIME.)lMODULEPROCEDUREPRIMElENDINTERFACEl现在这个运算符就可以和其它一元运算符一样使用,例如下现在这个运算符就可以和其它一元运算符一样使用,例如下面的面的IF语句:语句:lIF(.PRIME.B.AND.B100)THENl一个自定义二元运算符的优先级总低于其他运算符一个自定义二元运算符的优先级总低于其他运算符,而一个而一个自定义一元运算符的优先级总高于其他运算符。自定义一元

24、运算符的优先级总高于其他运算符。超载和定义操作符超载和定义操作符l超载固有函数超载固有函数l对于任何整数对于任何整数I,计算,计算SQRT(REAL(I)和计算和计算INT(SQRT(REAL(I)都不难,但如果只需写都不难,但如果只需写SQRT(I)则更则更好。我们可以超载好。我们可以超载SQRT函数,使它对一个整型量进行运算并返回一个整型值。函数,使它对一个整型量进行运算并返回一个整型值。MODULEINTEGER_SQRTINTERFACESQRTMODULEPROCEDURESQRT_INTENDINTERFACECONTAINSFUNCTIONSQRT_INT(I)RUEULT(SQ

25、RT_INT_RESULT)INTEGER:SQRT_INT_RESULTINTEGER,INTENT(IN):ISQRT_INT_RESULT=INT(SQRT(REAL(I)+0.5)ENDFUNCTIONENDMODULEINTEGER_SQRT PROGRAMTEST_INTEGER_SQRTUSEINTEGER_SQRTIMPLICITNONEINTEGER:II=5PRINT*,SQRT(I)ENDPROGRAMTEST_INTEGER_SQRT模块的应用模块的应用 l数据共享数据共享l可以把一些在整个程序范围内都用到的数据可以把一些在整个程序范围内都用到的数据(称全局数据称全局数

26、据)放在一个模块内统一说放在一个模块内统一说明,在需要使用这些数据的程序单元内用明,在需要使用这些数据的程序单元内用USE语句使用它们即可。语句使用它们即可。lMODULEDATA_MODULElSAVElREAL:A,B(10,10),C(23,2:25)lINTEGER:D(-2:12)lCOMPLEX:E(6,8,10)lENDMODULEl可以使用可以使用USE语句:语句:lUSEDATA_MODULE!访问这个模块中的全部数据。访问这个模块中的全部数据。l或者使用语句:或者使用语句:lUSEDATA_MODULE,ONLY:A,C!访问部分数据。访问部分数据。l为了避免名字冲突,还可

27、以进行更名,例如可以用:为了避免名字冲突,还可以进行更名,例如可以用:lUSEDATA_MODULE,ADO=A,BEI=B模块的应用模块的应用l模块还可以把一些将在整个可执行程序中都要用到的过程模块还可以把一些将在整个可执行程序中都要用到的过程(称全局过程称全局过程)放在一个模块内的放在一个模块内的CONTAINS语句和语句和ENDMODULE语句之间,作为内语句之间,作为内部过程,共引用模块的各程序单元使用,以实现过程共享。例如:将求部过程,共引用模块的各程序单元使用,以实现过程共享。例如:将求四个变量之和与四个变量之积的函数作为模块内部程序写入模块中。四个变量之和与四个变量之积的函数作为

28、模块内部程序写入模块中。MODULEABCDIMPLICITNONEREAL:A,B,C,DCONTAINSFUNCTIONADD()RESULT(ADD_RE)REAL:ADD_READD_RE=A+B+C+DENDFUNCTIONADDFUNCTIONPROD()RESULT(PROD_RE)REAL:PROD_REPROD_RE=A*B*C*DENDFUNCTIONPRODENDMODULEABCDPROGRAMAPUSEABCDREAD*,A,B,C,DPRINT*,ADD(),PROD()ENDPROGRAMAP模块的应用模块的应用MODULE WORK_ARRAYS INTEGER

29、:NREAL,ALLOCATABLE,SAVE:A(:),B(:,:),C(:,:,:)END MODULE WORK_ARRAYSPROGRAM MAIN USE WORK_ARRAYS CALL CONFIGURE_ARRAYS !分配数组 CALL COMPUTE !用分配好的数组进行计算 PRINT*,A;PRINT*,B;PRINT*,CEND PROGRAM MAINSUBROUTINE CONFIGURE_ARRAYS USE WORK_ARRAYSREAD*,NALLOCATE(A(N),B(N,N),C(N,N,2*N)END SUBROUTINE CONFIGURE_ARR

30、AYSSUBROUTINE COMPUTEUSE WORK_ARRAYSDO I=1,NA(I)=1DO J=1,NB(I,J)=1.8*I*JDO K=1,NC(I,J,K)=0.2*I*J/KEND DO;END DO;END DOEND SUBROUTINE COMPUTE练习题l一、选择题一、选择题1.下面的模块中,错误的语句是下面的模块中,错误的语句是_。A)MODULE MY_MODB)REAL:PIC)PI=3.14D)END MODULE MY_MOD2.下面关于模块的描述中,不正确的是:下面关于模块的描述中,不正确的是:_。A)模块是一种不能直接执行的程序单元模块是一种不能直

31、接执行的程序单元B)模块名后面必须加后缀模块名后面必须加后缀“_MODULE”C)模块中类型说明部分不能有可执行语句模块中类型说明部分不能有可执行语句D)一个程序中可以有多个模块程序单元一个程序中可以有多个模块程序单元练习题3.下面程序运行后的输出结果是下面程序运行后的输出结果是_。MODULEABCINTEGER:P=3,Q=5ENDMODULEABCPROGRAMTESTUSEABC,A=P,B=QREAL:P,QP=10;Q=20PRINT*,A,BENDPROGRAMTESTA)1020B)35C)320D)1054.在接口块的定义中,用于超载赋值运算的类属说明是:在接口块的定义中,用

32、于超载赋值运算的类属说明是:_。A)SWAPB)OPERATORC)ASSIGNMENTD)=练习题二、运行程序题二、运行程序题1下面程序的运行结果是:下面程序的运行结果是:_。MODULEMY_MODULEREAL:A=4,B=8CONTAINSSUBROUTINESWAP(X,Y)REALTEMP,X,YTEMP=X;X=Y;Y=TEMPENDSUBROUTINESWAPENDMODULEMY_MODULEPROGRAMUSE_MODULEUSEMY_MODULEIMPLICITNONECALLSWAP(A,B)PRINT*,A,BEND练习题三、填空题三、填空题1.下面程序段用于定义一个

33、名为下面程序段用于定义一个名为SWAP类属过程,用于交换两个整型数或实型数,类属过程,用于交换两个整型数或实型数,请在空白处填上适当的语句。请在空白处填上适当的语句。MODULESWAP_MODULEIMPLICITNONEINTEGFACE_MODULEPROCEDURE_ENDINTERFACE_SUBROUTINESWAPI(I,J)INTEGER:I,J,TEMPTEMP=I;I=J;J=TEMPENDSUBROUTINESWAPISUBROUTINESWAPR(A,B)REAL:A,B,TEMPTEMP=A;A=B;B=TEMPENDSUBROUTINESWAPRENDMODULESWAP_MODULE

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

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

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

关于我们      便捷服务       自信AI       AI导航        获赠5币

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

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

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

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服