




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、9 模块,9.1 模块的定义 9.2 USE语句 9.3 接口块 9.4 重载和定义操作符 9.5 模块的应用,模块是一种不能直接执行的程序单元,可以包含数据说明和过程,通过USE语句对模块进行引用,可提供数据类型、数据和过程的共享。,9.1 模块的定义,定义的格式 MODULE 模块名 类型说明部分 Contains 内部过程子程序1 内部过程子程序2 内部过程子程序n END MODULE模块名,模块名是全局标识符,必须是唯一的,不能与其它程序单元或本模块内的局部变量同名。 模块如果有内部过程子程序,则子程序必须完全定义在模块内,各模块的书写顺序是任意的。 说明部分可以是类型说明语句、派生
2、类定义、接口块,不能有执行语句或Format语句。,9.1 模块的定义,模块引用是通过Use语句进行的,格式为: Use 模块名,9.2 Use语句,当程序单元引用多个模块时,可能存在名字冲突:两个模块中用到的变量有相同的名字,但却有不同的意义。这时可用更名的方法: Use 模块名,更名表 更名表的格式为:局部名=引用名,局部名=引用名,局部名=引用名,局部名=引用名,Use Beam, Area=Ar,Force=St 引用模块Beam时,通过使用名Area,Force来访问模块中的对象Ar,St。,模块中可以定义许多内部子过程和数据,如果只要使用模块中的部分对象,则可在Use语句中加入On
3、ly选项,格式为: Use 模块名,Only:Only表,9.2 Use语句,Only表的形式: 局部名=引用名,局部名=引用名, 局部名=引用名,Use Beam,Only: Area=Ar,Force 只引用模块Beam的Force和Ar,并用Area来访问模块中的对象Ar, Force 用原名访问。,例如: MODULE MY_MODULE REAL,PARAMETER:PI=3.14159 CONTAINS SUBROUTINE SWAP(X,Y) REAL TEMP,X,Y TEMP=X X=Y Y=TEMP END SUBROUTINE SWAP END MODULE MY_MOD
4、ULE,PROGRAMUSE_MODULE UES MY_MODULE IMPLICIT NONE REAL A,B READ*,A B=PI CALL SWAP(A,B) PRINT*,A,B END,格式: Interface 类属说明 接口体 模块过程说明语句 END Interface,接口块中只能有说明语句,不能有执行语句或FORMAT语句。 类属说明可以是:类属名,或OPERATOR,或ASSIGNMENT(=),分别用于定义类属过程, 定义运算 ,重载赋值运算符。 接口块不允许出现在Block Data程序单元中。,9.3 接口语句,接口块中的语句称接口体。形式为: 过程语句 !
5、函数语句或子程序语句 过程的说明部分 过程的END语句,用接口块说明模块的内部过程时,必须用模块过程语句加以说明。形式为: Module Procedure 过程名表 过程名表中的各过程必须是其宿主中可见的。用模块过程语句时,接口块中必须含有一个类属说明。,例如: MODULE INTERVAL_ARITHMETIC TYPE INTERVAL REAL LOWER, UPPER END TYPE INTERVAL INTERFACE OPERATOR(+) MODULE PROCEDURE COMB_INTERVALS END INTERFACE CONTAINS FUNCTION COMB
6、_INTERVALS (A,B) TYPE(INTERVAL ) COMB_INTERVALS ,A,B COMB_INTERVALS %LOWER=MIN(A%LOWER ,B%LOWER) COMB_INTERVALS % UPPER =MAX(A%UPPER ,B% UPPER) END FUNCTION COMB_INTERVALS END MODULE INTERVAL_ARITHMETIC,9.3 接口语句,一个接口块中可以有多个接口体。程序单元的接口块中不能含有本程序单元定义的过程的接口体。换言之,过程用接口块或内部过程与宿主联系是两种方式,不能同时并用。,当然可以用接口块代替E
7、XTERNAL语句来说明外部过程或虚过程,此种方法为过程提供了显式的调用接口,提高了程序的可读性。,9.4 超载和定义操作符,类属过程是一种过程,它允许不同类型的实参和同一个虚参结合,使得过程调用更方便。 类属过程的方法是根据实参的不同类型,定义了几个函数或子程序过程,它们属于一类,然后用类属过程接口块给它们另取一个共同的名字(类属名),程序中使用类属名可以调用它们中的任何一个,由编译系统根据实参类型确定究竟是调用哪个过程。使用这些过程的专用名调用也是可以的,但必须注意保持参数类型的一致性。,9.4.1 类属过程,例:整数,实数,点的坐标的交换 module swap_them implici
8、t none TYPE POINT REAL X,Y,Z END TYPE POINT interface swap module procedure swapi,swapr,swapp end interface contains subroutine swapi(a,b) integer a,b,t t=a;a=b;b=t end subroutine swapi,subroutine swapr(a,b) real a,b,t t=a;a=b;b=t end subroutine swapr subroutine swapp(a,b) type(point):a,b,t t=a;a=b;
9、b=t end subroutine swapp end module swap_them,use swap_them real a,b integer c,d type(point):p,q a = 1.1;b=2.2;c=3;d=4 p = point(5,6,7);q=point(8,9,10) print *,a,b,c,d print *,p,q call swap(p,q) !交换点的坐标 call swap(a,b) !交换实数值 call swap(c,d) !交换整数值 print *,a,b,c,d print *,p,q end,9.4 超载和定义操作符,所谓超载(Ove
10、rLoad)也称为重载,在现代面向对象的程序设计中广泛应用。 通常的赋值语句要求赋值号两端的类型是赋值兼容的,可以重载赋值号,对赋值的意义进行重新定义。 重载赋值号的过程有两个参数,第一个属性为INTENT(out),第二个为INTENT(IN),9.4.2 超载赋值号,例:将百分制的成绩用四级记分制表示。 module level interface Assignment(=) ! 重载赋值号 module procedure slevel end interface contains subroutine Slevel(b,a) !赋值的新定义 integer,intent(in):a c
11、haracter(2),intent(out):b Select case(a) case(90:);b = 优; case(75:89);b=良 case(60:74);b=中;case(:59);b=差 End select end subroutine slevel end module level,简单的主程序如下: use level integer a character(2) b print *,请输入百分制成绩 read*,a b=a print (I4,2a),a,分的等级为,b end,9.4 超载和定义操作符,运算符的意义也可以重新定义,这就是所谓重载运算符。 重载固有运
12、算符时,不能引起二义性。例如:对于数值型操作数,不能重载+,-,*,/等运算符。 重载运算符的函数子程序有一个或两个参数,其属性为Intent(in)。例如,-号作为减号时有两个参数,是双目运算符;而作为负号是只有一个参数,是单目运算符。,9.4.3 超载运算符,9.4 超载和定义操作符,例:重载加号运算符,用于矢量加法。 module operate implicit none TYPE POINT REAL X,Y,Z END TYPE POINT interface Operator(+) !双目运算符 module procedure vectp end interface,9.4.3
13、 超载运算符,interface Operator(-) !单目运算符 module procedure vectm end interface interface Operator(-) !双目运算符 module procedure vects end interface contains Function vectm(a)Result(b) type(point),intent(in):a type(point):b b%x = -a%x b%y=-a%y b%z=-a%z end function vectm,Function vectp(p,q)Result(b) type(poin
14、t),intent(in):p,q type(point):b b%x=p%x+q%x; b%y=p%y+q%y b%z=p%z+q%z end function vectp Function vects(p,q)Result(b) type(point),intent(in):p,q type(point):b b%x=p%x-q%x; b%y=p%y-q%y b%z=p%z-q%z; end function vects end module operate,简单的测试主程序: use operate type(point):p,q,s print *,请输入两个点的坐标 read*,p,
15、q s = p+q !矢量相加 print *,p print *,q print *,s Print *,-p !负矢量 Print *,p-q !矢量相减 end,9.4 超载和定义操作符,把某种变换看作是运算,给它定义一种运算符,这就是用户定义的运算符。 用户定义的运算符用一个夹在两个点.之间的字符串表示,这个字符串不能与逻辑常量相同,也不能是固有运算符。其长度不大于31。 定义运算符的函数子程序有一个或两个参数,其属性为Intent(in)。 自定义的双目运算符优先级别低于其他运算符,自定义的单目运算符优先级别高于其他运算符。,9.4.4 用户定义的运算符,例:定义运算符.conj.计
16、算两电阻的并联电阻 module operate implicit none interface Operator(.conj.) module procedure combr end interface contains Function combr(r1,r2)Result(r) real,intent(in):r1,r2 real r r = r1*r2/(r1+r2) end function combr end module operate,简单的测试主程序: use operate real a,b,c print *,请输入两个电阻值 read*,a,b c=a.conj.b p
17、rint (3f8.2), a,b,c end,9.4 超载和定义操作符,重载固有函数的办法与定义类属过程的方法几乎一样,只不过类属名不能由用户自定,而必须与所要重载的固有函数相同。,9.4.5 超载固有函数,例:重载ABS()函数,计算矢量的长度。 module overloadabs implicit none TYPE POINT REAL X,Y,Z END TYPE POINT interface abs module procedure vectabs end interface,contains Function vectabs(p)Result(d) type(point),i
18、ntent(in):p real d d = sqrt(p%x*2+p%y*2+p%z*2) end function vectabs end module overloadabs !主程序如下: use overloadabs type(point):p;real d print *,“请输入点的坐标”;read*,p d = abs(p) print *,p,d END,利用模块的特性和用法,可以实现数据的共享。将所有或部分程序单元用到的数据有组织地放在一些模块中,通过Use语句引用,就可以在相关的程序单元之间传递数据。这是有别于虚实结合方法的一种新方法。必要时,可以用Use语句的Only选项选择过滤共享数据;也可以利用Use语句的变量更名功能避免名字冲突。,9.5 模块的应用,9.5.1 数据共享,将派生类型的定义放在一个模块内,在使用这些派生类型的程序单元中就不必再定义这些派生类型了,通过Use语句引用,可以实现多个程序单元共享这些派生类型。,9.5 模块的应用,9.5.2 公用派生类型,9.5.3 可分配数组的共享,作为数据共享的一个特例,将在多个程序单元中使用的可分配数组的定义放在一个模块内,就实现了可分配数组的共享。,抽象数据类型可以用派生类型来实现,前面定义的派生类型point可以当作矢量来用。关于矢量的运算有:负矢量、矢量加减、矢量长度与方向、点积、叉
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论