fortran模块

上传人:xins****2008 文档编号:104377757 上传时间:2019-10-09 格式:DOC 页数:49 大小:310.50KB
返回 下载 相关 举报
fortran模块_第1页
第1页 / 共49页
fortran模块_第2页
第2页 / 共49页
fortran模块_第3页
第3页 / 共49页
fortran模块_第4页
第4页 / 共49页
fortran模块_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《fortran模块》由会员分享,可在线阅读,更多相关《fortran模块(49页珍藏版)》请在金锄头文库上搜索。

1、目录第7章 FORTRAN模块7.1 模块概述7.2 模块的基本组成与使用7.2.1 模块的基本组成形式7.2.2 模块的共享使用7.2.3 公有共享和私有使用7.2.4 别名共享和部分共享7.3 面向对象的程序设计概述7.4 类的定义与对象的使用7.4.1 类的定义7.4.2 对象的使用7.4.3 组合类对象的使用7.5 过程重载与新运算符的定义7.5.1 过程重载7.5.2 运算符重载7.5.3 重载赋值号(=)7.5.4 定义新运算符7.6 继承性和多态性7.6.1 基类和派生类7.6.2 多态性7.7 模块应用举例习题 7第7章 FORTRAN模块7.1 模块概述 在FORTRAN中有

2、四种不同的程序单元:主程序、外部过程、数据块子程序和模块。模块是在FORTRAN 90中新增加的一种独立编写的程序单元。 模块中可包含其它程序单元(主程序、函数子程序、子例行子程序)访问的数据、过程和派生类型的说明和定义。如变量、数组的说明,派生类型的定义,函数子程序、子例程子程序的定义等。 模块的主要作用是供其它程序单元引用和支持面向对象的程序设计。 一个程序单元如果引用模块,实际上就是把该模块内的全部语句复制到本程序单元中,并且所有与模块中的名字相同的变量,彼此共享存贮单元。如果模块程序单元中包含有过程的定义,那么,这些过程也可供其它程序单元使用。所以使用模块的第一个作用就是共享。 还可以

3、把某个算法的数据及其实现、或者对于某种派生类型的定义和操作封装在一个模块中。 例如,高精度数值积分、快速傅立叶变换等算法各自封装在一个模块中;对于高考生、职工等派生类型的定义和操作各自封装在一个模块中。 这样,通过模块,Fortran可以支持面向对象的程序设计方法。所以使用模块的第二个作用就是进行面向对象的程序设计。在Fortran的2003标准中,将增加和提高支持面向对象的程序设计的成分。使得模块的作用将进一步增强。 7.2 模块的基本组成与使用 7.2.1 模块的基本组成形式 MODULE 模块名 说明部分 CONTAINS 模块过程部分 END MODULE 模块名 其中: 说明部分可以

4、出现类型说明、COMMON语句、 DATA语句、DIMENSION语句、POINTER语句等,但是不能出现语句函数、FORMAT语句、 ENTRY语句。模块过程部分中可以包含若干个函数子程序、子例程子程序。因为这些过程是书写在模块内部,所以称它们为模块过程。CONTAINS语句把模块的说明部分与模块过程部分区分开。 例如:! 定义双精度数学常数Module MathConstants implicit none! INTEGER,PARAMETER:DP=SELECTED_REAL_KIND(15,307) INTEGER,PARAMETER:DP=KIND(1.d0) ! 前一注解中所含语句

5、的另一形式 real(DP),parameter:DegPerRad=57.295779513082320876798155_DP real(DP),parameter:RadPerDeg=0.017453292519943295769237_DP real(DP),parameter:eValue=2.71828182845904523560287_DP real(DP),parameter:Euler=0.5772156649015328606_DP real(DP),parameter:Gamma=0.577215664901532860606512_DP real(DP),parame

6、ter:Golden_Ratio=0.618033988749894848_DP real(DP),parameter:piValue=3.141592653589793238462643_DPend Module MathConstants! 定义双精度物理学常数Module PhysicalConstants ! 定义选择的精度 INTEGER,PARAMETER:DP=KIND(1.d0) ! = 物理学常数和单位 =real(DP),parameter:AMUValue=1.6605402E-27_DP ! kgreal(DP),parameter:AtmospherePres=9.8

7、0665E+04_DP ! Pareal(DP),parameter:BohrMagneton=9.2740154E-24_DP ! J/Treal(DP),parameter:BohrRadius=5.29177249E-11_DP ! mreal(DP),parameter:Boltzmann=1.380657E-23_DP ! J/Kreal(DP),parameter:ElectronCompton=2.42631058E-12_DP ! mreal(DP),parameter:ElectronCharge=-1.60217738E-19_DP ! coulreal(DP),param

8、eter:ElectronMoment=9.2847700E-24_DP ! J/Treal(DP),parameter:ElectronRadius=2.81794092E-15_DP ! mreal(DP),parameter:Faraday=9.6485309E+04_DP ! C/moreal(DP),parameter:LightYear=9.46073E+15_DP ! mend Module PhysicalConstants MODULE MyUtils!说明部分 TYPE POINT REAL:X,Y END TYPE POINT!模块过程部分 CONTAINS SUBROU

9、TINE DisplayPoint( P ) TYPE(POINT):P WRITE(*, (,F7.2,F7.2,) )P END SUBROUTINE DisplayPoint FUNCTION DistanceOfPoints(P1,P2) RESULT(D) TYPE(POINT):P1,P2 REAL:D D=SQRT( (P1%X-P2%X)*2 + (P1%Y-P2%Y)*2 ) END FUNCTION DistanceOfPointsEND MODULE MyUtils7.2.2 模块的共享使用 一般形式: USE 模块名注意:USE语句必须作为一个程序单元内的第一个语句出现

10、例7.1 模块共享使用示例。MODULE MyUtils!说明部分 TYPE POINT REAL:X,Y END TYPE POINT!模块过程部分 CONTAINS SUBROUTINE DisplayPoint( P ) TYPE(POINT):P WRITE(*, (,F7.2,F7.2,) )P END SUBROUTINE DisplayPoint FUNCTION DistanceOfPoints(P1,P2) RESULT(D) TYPE(POINT):P1,P2 REAL:D D=SQRT( (P1%X-P2%X)*2 + (P1%Y-P2%Y)*2 ) END FUNCTI

11、ON DistanceOfPointsEND MODULE MyUtilsPROGRAM EX0701 USE MyUtils IMPLICIT NONE TYPE(POINT):A,B REAL:DIS PRINT *,输入两个点的坐标: READ*, A,B CALL DisplayPoint( A ) CALL DisplayPoint( B ) PRINT*, 两个点的距离=, DistanceOfPoints(A,B) END程序执行示例: 输入两个点的坐标:2,5,6,8( 2.00, 5.00)( 6.00, 8.00) 两个点的距离= 5.000000 7.2.3 公有共享和私

12、有使用 对于模块中的数据和过程,可以用PUBLIC或PRIVATE命令或属性,分别说明公有共享和私有使用。PUBLIC和PRIVATE表示访问权限。所有被说明为公有共享的数据和过程,在它们所在的模块内可以被引用,而且,在引用模块时都能够被直接引用。所有被说明为私有使用的数据和过程,在它们所在的模块内可以被引用,而在模块外均不允许被直接引用。未用PUBLIC或PRIVATE命令或属性说明的数据和过程,缺省访问权限为PUBLIC,即公有。例7.2 模块中数据和过程的公有共享和私有使用示例。module bank implicit none integer : money = 100000000 !

13、银行目前现金 integer : fileid = 8 !文件号 private money, fileid !私有数据 private TimeLog !私有子例行子程序 public LoadMoney,SaveMoney !公有子例行子程序 contains subroutine TimeLog() !登陆日期时间,私有子例行子程序 implicit none integer : num character(len=20) : date, time call date_and_time(date, time) write(fileid,99)date,time(1:2), time(3:4), time(5:6)99 format(日期:,A8, 时间:,A2,:,A2,:,A2) end subroutine subroutine LoadMoney(name,num) !取款,公有子例行子程序 implicit none character(len=*) : name integer : num if ( num=num ) then

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号