1、1 FORTRAN77 四则运算符+ - * / * (其中* 表示乘方)在表达式中按优先级次序由低到高为: +或- *或/ * 函数()2 FORTRAN77 变量类型2.1 隐含约定:I-N 规则凡是以字母 I,J ,K,L,M,N 六个字母开头的,即认为是整型变量,其它为实型变量。2.2 用类型说明语句确定变量类型:可以改变 I-N 规则INTEGER 整型REAL 实型DOUBLE PRECISION 双精度实型COMPLEX复型,赋值形式为(实部,虚部),如 D=(8.76E+0.5,-67.8E-3),C=(3.0,6.3),如果含表达式则用 CMPLX,如C=CMPLX(3.0*
2、A,6.0+B)LOGICAL 逻辑型, 逻辑常量有 “T”和“F”,“T”表示“.TRUE.”,“F”表示“.FALSE.”CHARACTER*N 字符型,N 为字符串长度 ,可以在变量名称后重新指定长度,如CHARACTER*8 STR1,STR2*10 ,赋值形式为 STR2=IM A BOY.2.3 用 IMPLICIT 语句将某一字母开头的全部变量指定为所需类型如 IMPLICIT REAL (I,J)三种定义的优先级别由低到高顺序为:I-N 规则IMPLICIT 语句类型说明语句,因此,在程序中 IMPLICIT 语句应放在类型说明语句之前。2.4 数组的说明与使用使用 I-N 规
3、则时用 DIMENSION 说明数组,也可在定义变量类型同时说明数组,说明格式为:数组名(下标下界, 下标上界),也可省略下标下界,此时默认为 1,例:DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3)REAL IA(10),ND(80:99)使用隐含 DO 循环进行数组输入输出操作:例如WRITE(*,10) (I=,I,A=,A(I),I=1,10,2)10FORMAT(1X,5(A2,I2,1X,A2,I4)2.5 使用 DATA 语句给数组赋初值变量表中可出现变量名,数组名 ,数组元素名,隐含 DO 循环,但不许出现任
4、何形式的表达式:例如DATA A,B,C/-1.0,-1.0,-1.0/DATA A/-1.0/,B/-1.0/,C/-1.0/DATA A,B,C/3*-1.0/CHARACTER*6 CHN(10)DATA CHN/10* /INTEGER NUM(1000)DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/3 FORTRAN77 程序书写规则程序中的变量名,不分大小写;变量名称是以字母开头再加上 1 到 5 位字母或数字构成,即变更名字串中只有前 6 位有效;一行只能写一个语句;程序的第一个语句固定为 PROGRAM 程序名称字
5、符串某行的第个字符至第个字符位为标号区,只能书写语句标号或空着或注释内容;某行的第个字符为或号时,则表示该行为注释行,其后面的内容为注释内容;某行的第个字符位为非空格和非字符时,则该行为上一行的续行,一个语句最多可有 19 个续行;某行的第至字符位为语句区,语句区内可以任加空格以求美观;某行的第至字符位为注释区,字符位以后不能有内容。4 FORTRAN77 关系运算符.GT. 大于.GE. 天于或等于.LT. 小于.LE. 小于或等于.EQ. 等于.NE. 不等于 .AND. 逻辑与.OR. 逻辑或.NOT. 逻辑非.EQV. 逻辑等.NEQV. 逻辑不等运算符优先级由高到低顺序为:() *或
6、/+或-.GT.或.GE. 或.LT.或.LE.或.EQ.或.NE.NOT.AND. .OR. .EQV.或.NEQV5 FORTRAN77 语句语句 说明 备注WRITE(*,*) X1,X2 输出语句第一个*号是指输入输出文件设备号或其它设备,如果不指定则是指显示器或打印机,第二个*号是指表控格式语句的行号,如不指定则用默认格式PRINT *,X1,X2输出语句 *号是指表控格式语句的行号,如不指定则用默认格式READ *,X1,X2 输入语句 *号是指表控格式语句的行号,如不指定则用默认格式FORMAT(格式符) 请见附录一。 请见附录二。END 结束程序或子程序STOP N 结束程序并
7、输出信息N N为数字或字符串信息PAUSE N暂停程序执行并输出信息N,输入回车后继续执行N为数字或字符串信息PARAMETER (PI=3.14)参数语句,用来定义常量,在程序中应放在类型说明语句之后EQUIVALENCE (变量表)等价语句,()内变量共用一个存储单元。EQUIVALENCE(X1,X2,XN),(X1,X2,XN),COMMON X1,公用语句,其后变量相等,用来在程序单位间传递数据,同时可以用来说明数组。程序中可有一个无名公用区和多个有名公用区。无名公用区:在主程序各子程序中相同, 均在可执行语句之前,如COMMON A(5),I有名公用区:名称放在两个“/”之间,如C
8、OMMON /X1,X2,X3/C1/X4,X5,X6OPEN (说明项1)打开旧文件或创建新文件说明项 1 中内容:UNIT=N, FILE=NAM, STATUS=STR1, ACCESS=STR2, FORM=STR3, RECL=C, BLANK=STR4, ERR=BH, IOSTAT=M其中:1.N=199;2.NAM 为文件名,可以是字符常量或变量;3.STR1=NEW时新建文件; OLD时打开文件;SCRATCH时表示临时文件,关闭时自动删除 ,且不能与FILE=NAM 项共存;UNKNOWN时由计算机系统规定文件状态;4.STR2 为文件存取方式,SEQUENTIAL 表示顺
9、序存取,DIRECT表示直接存取,省略此项时表示按顺序存取;5.STR3 为记录格式说明,FORMATTED表示记录按有格式形式存放, UNFORMATTED表示记录按无格式形式存放。省略此项时,对于顺序文件是有格式的 ,对于直接存取文件是无格式的;6.C 表示记录长度,以字节为单位, 直接存取文件必指定,顺序文件必省略;7.STR4 表示数字值格式输入字段中空格含意,NULL时表示忽略不计,ZERO 时表示按 0 计。省略此项时按 0 计;8.BH 表示出错时处理语句行标号, 可以省略此项;9.M 为整数 ,出错时返回该整数,可以省略此项。CLOSE (说明项2)关闭已打开文件说明项 2 中
10、内容:UNIT=N,STATUS=STR5,ERR=BH,IOSTAT=M其中 STR5 为文件关闭状态,KEEP 时保留,DELETE 删除,省略此项时为保留;ERR=BH,IOSTAT=M 可以省略。REWIND (说明项 3)将文件读写指针置于文件开头说明项 3 中内容:UNIT=N,ERR=BH,IOSTAT=MERR=BH,IOSTAT=M 可以省略BACKSPACE (说明项 3)将文件读写指针回退一行6 FORTRAN77 选择判断语句6.1 逻辑 IF 语句IF (逻辑表达式) 程序语句6.2 无 ELSE 块IF (逻辑表达式) THEN程序块END IF6.3 标准选择IF
11、 (逻辑表达式) THEN程序块 1ELSE程序块 2END IF6.4 多重选择块IF (逻辑表达式 1) THEN程序块 1ELSE IF (逻辑表达式 2) THEN程序块 2ELSE IF (逻辑表达式 2) THEN程序块 2ELSE IF (逻辑表达式 N) THEN程序块 NELSE程序块 N+1END IF7 FORTRAN77 循环语句7.1 GO TO 语句标号程序行程序块GO TO 标号7.2 DO 语句DO 标号,记数变量=起始值, 终止值,步距”语句,如DO 标号,N=1,100,1程序块标号 CONTINUE7.3 DO WHILE 语句DO 标号,WHILE(PI
12、.EQ.3.14159)程序块标号 CONTINUE7.4 DO UNTIL 语句DO 标号,UNTIL (逻辑表达式 )”语句,如DO 标号,UNTIL(PI.GT.3.14159)程序块标号 CONTINUE8 FORTRAN77 内部函数INT(X) 将数字串或数值 X 转换为整型数REAL(X) 将数字串或数值 X 转换为实型数DBEL(X) 将数字串或数值 X 转换为双精度型数CMPLX(X) 将数字串或数值 X 转换为复型数CHAR(X) 将数值 X 转换为字符(0X255)ICHAR(X) 将字符 X 转换为整数AINT(X) 截去 X 的小数部分ANINT(X) 将 X 舍入到
13、最接近的整数NINT(X) 将 X 舍入到最接近的整型数ABS(X) 返回 X 的绝对值MOD(X1,X2) 返回 X1/X2 的余数SIGN(X1,X2) 取 X2 的符号,取 X1 的绝对值DIM(X1,X2) 当 X1X2 时 ,等于 X1-X2,当 X1X2时, 等于 0DPROD(X1,X2) 双精度乘(X1,X2 均为实数)AIMAG(X) 返回字符串 X 的虚部CONJG(X) 返回字符串 X 的共轭MAX(X1,X2,X3,.,XN) 返回 X1,X2,X3,.,XN 中最大值MIN(X1,X2,X3,.,XN) 返回 X1,X2,X3,.,XN 中最小值SQRT(X) 返回
14、X 的平方根(X0)EXP(X) 返回 E 的 X 次方LOG(X) 返回以 E 为底的 X 的对数即自然对数 (X0)LOG10(X) 返回以 10 为底的 X 的对数即常用对数(X0)SIN(X) 返回弧度值 X 的正弦值COS(X) 返回弧度值 X 的余弦值TAN(X) 返回弧度值 X 的正切值ASIN(X) 返回弧度值 X 的反正弦值ACOS(X) 返回弧度值 X 的反余弦值ATAN(X) 返回弧度值 X 的反正切值SINH(X) 返回 X 的双曲正弦值COSH(X) 返回 X 的双曲余弦值TANH(X) 返回 X 的双曲正切值LEN(X) 返回字符串 X 的长度INDEX(X1,X2
15、) 返回字符串 X2 在字符串 X1 中的位置,不包含时返回 0LGE(X1,X2) 如果字符串 X1X2则等于 .TRUE.,否则等于.FALSE.LGT(X1,X2) 如果字符串 X1X2 则等于.TRUE.,否则等于.FALSE.LLE(X1,X2) 如果字符串 X1X2则等于 .TRUE.,否则等于.FALSE.LLT(X1,X2) 如果字符串 X1X2 则等于.TRUE.,否则等于.FALSE.9 FORTRAN77 函数与子程序9.1 FORTRAN77 语句函数当函数十分简单,用一条语句足以定义时(允许使用继续行)才用;应该放在所有可执行语句之前和有关类型说明语句之后,是非执行语
16、句;只在其所在程序单位中有意义;语句函数中的虚参就是变量名,不能是常量、表达式或数组元素等;语句函数定义语句中的表达式可以包含已经定义过的语句函数、外部函数或内部函数。语句函数通过表达式得一个函数值,此数值类型必须与函数名的类型一致。语句函数的使用同内部函数相同。语句函数例子:YMJ(R)=3.14159265*R*RZMJ=YMJ(5)9.2 FORTRAN77 自定义函数定义格式:类型说明 FUNCTION 函数名 (虚拟参数 1,虚拟参数 2,虚拟参数 N)程序块(可以含有 RETURN)函数名=函数值END调用格式与内部函数相同。9.3 FORTRAN77 子程序定义格式:SUBROU
17、TINE 子程序名(虚拟参数 1,虚拟参数 2,虚拟参数 N)程序块(可以含有 RETURN)END调用格式:CALL 子程序名(实在参数 1,实在参数 2,实在参数 N)数据块子程序:只是用来给有名公用区中的变量赋初值,格式如下:BLOCK DATA 子程序名DATA 语句块END附录一、FORTRAN77 控制输入输出格式1.在打印输出时,每一行第 1 个字符不显示,用来控制纵向走纸或显示行。第 1 个字符 作用空格 正常回车换行0 回车并跳过 1 行1 换页+ 只回车不换行其它 通常是回车换行2.输入小数时,自带小数点优先。3.输出字段宽度不够时用*号填充。附录二、FORTRAN77 控
18、制输入输出格式语句1 IW 或 IW.M 整数型 W 为字段宽度,M 为最少数字位数2 FW.D 实数型 D 为小数位数3 EW.D 或 EW.DEE 指数实数型 E 为指数位数,通常为 3 或 44 GW.M 自动实数型5 DW.D 双精度型6 LW 逻辑型7 A 或 AW 字符型 不指定 W 时自动8 字符串 插入字符串 两个表示一个字符9 NH 字符串 插入长度为 N 的字符串10 NX 插入 N 个空格11 RIW,R(NX,IW.M) R 个 IW,R 个(NX,IW.M) R 为重复系数12 / 换行13 ,$ 禁止换行目录: 一、说明 二、概述 三、数据类型及基本输入输出 四、流
19、程控制 五、循环 六、数组 七、函数 八、文件一、说明 本文多数内容是我读彭国伦Fortran 95 程序设计的笔记。只读到第九章,主要是 39 章,都是最基本的用法(原书共 16 章)。这里主要摘录了我看书过程中总结的一些 Fortran 和 C 不 同的地方,主要是语法方面。希望这份笔记能够给学过 C 但没有接触过 Fortran 的同学带去一些帮 助。要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有 C 语言的基础, 看完前九应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起 来了。外,由于我之前没有用过 Fortran,这次为了赶文档看书又
20、看得很粗浅,大多数东西看过 之后都没得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果 有不妥的方,希望大家指正。谢谢! 文中蓝色的部分是程序代码,!后面的内容为注释。二、概述 1、名词解释 Fortran=Formula Translator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始 ,IBM 设计的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一 目标。ortran 奠定了高级语言发展的基础。现在 Fortran在科研和机械方面应用很广。2、Fortran 的主要版本及差别 按
21、其发展历史,Fortran 编译器的版本其实很多。现在在广泛使用的是 Fortran 77 和 Fortr an90。ortran 90 在 Fortran 77 基础上添加了不少使用的功能,并且改良了 77 编程的版面格式, 所以编程时推荐使用 90。鉴于很多现成的程序只有 77 版本,有必要知道 77 的一些基本常识,至少保 证能够看 77 程序。以下是 77 和 90 的一些格式上的区别。 Fortran 77: 固定格式(fixed format),程序代码扩展名:.f 或.for (1)若某行以 C,c 或*开头,则该行被当成注释; (2)每行前六个字符不能写程序代码,可空着,或者
22、15 字符以数字表明行代码(用作格 式化输入出等);772 为程序代码编写区;73 往后被忽略; (3)太长的话可以续行,所续行的第六个字符必须是“0“以外的任何字符。 Fortran 90: 自由格式(free format), 扩展名:.f90 (1)以“!“引导注释; (2)每行可 132 字符,行代码放在每行最前面; (3)以 相对应的循环语句,不过可以这样,保证至少做一循环:do while(.ture.) if(逻辑运算 ) exit !exit 就好比 C 里面的 break。C 里的 continue 在 Fortran 里是cycleend do4、Fortran 的一个特色
23、:带署名的循环 可以这样,不易出错: outer: do i=1,3 inner: do j=1,3 end do inner end do outer 还可以这样,很方便: loop 1: do i=1,3 loop2: do j=1,3 if(i=3) exit loop1 !exit 终止整个循环 loop1 if(j=2) cycle loop2 !cycle 跳出 loop2 的本次循环,进行 loop2 的下次循环 write(*,*) i,j end do loop2 end do loop1 还有一些循环主要用于 Fortran 中的数组运算,为 Fortran 特有,很实用。
24、六、数组 1、数组的声明和 C 不同的是,Fortran 中的数组元素的索引值写在()内,且高维的也只用一个(),如 integer a(5) !声明一个整型一维数组 real : b(3,6) !声明一个实型二维数组 类型可以是 integer, real, character, logical 或 type。最高可以到 7 维。 数组大小必须为常数。但是和 C 语言不同, Fortran 也有办法使用大小可变的数组,方法如: integer, allocatable : a(:) !声明小可变经过某个途径得知所需数组大小 size 之后,用下面的语句:allocate(a(size) !配
25、置内存空间之后该数组和通过一般方法声明的数组完全相同。 与 C 不同,Fortran 索引值默认为从 1 开始,而且可以在声明时改变该规则: integer a(-3:1) ! 索引值为-3 ,-2 ,-1,0,1 integer b(2:3,-1:3) !b(23,-13)为可使用的元素2、数组在内存中的存放和 C 不同,Fortran 中的数组比如 a(2,2)在内存中存放顺序为 a(1,1),a(2,1),a(1,2),a(2,2 )。原则是放低维的元素,再放高维的元素。此规则称为 column major。3、赋初值 (1)最普通的做法: integer a(5) data a /1,
26、2,3,4,5/ 或 integer : a(5)=(/1,2,3,4,5/) 若 integer : a(5)=5,则 5 个元素均为 5 对于 integer : a(2,2)=(/1,2,3,4/) 根据数组元素在内存中存放的方式,等价于赋值 a(1,1)=1,a(2,1)=2,a(1,2)=3,a(2,2)=4 (2)利用 Fortran 的特色:隐含式循环。看例子就明白了。 integer a(5) integer i data (a(i),i=2,4)/2,3,4/ !(a(i),i=2,4)表示 i 从 2 到 4 循环,增量为默认值 1 还可以这样: integer i int
27、eger : a(5)=(/1,(2,i=2,4),5/) !五个元素分别赋值为1,2,2,2,5 integer : b(5)=(/i, i=1,5/) !五个元素分别赋值为 1,2 ,3,4 , 还可以嵌套 data (a(i,j),i=1,2),j=1,2)=/1,2,3,4/ !a(1,1)=1,1(2,1)=2,a(1,2)=3,a(2,2)=44、操作整个数组 设 a,b 为相同类型、维数和大小的数组 a=5 !所有元素赋值为 5 a=(/1,2,3/) !这里假设 a 为一维,a(1)=1,a(2)=2,a(3)=3 a=b !对应元素赋值,要求 a,b,c 维数和大小相同,下同
28、 a=b+c a=b-c a=b*c a=b/c a=sin(b) !内部函数都可以这样用5、操作部分数组元素 a 为一维数组 a(3:5)=(/3,4,5/) !a(3)=3,a(4)=4,a(5)=5 a(1:5:2)=3 !a(1)=3,a(3)=3,a(5)=3 a(3:)=5 !a(3)以及之后的所有元素赋值为 5 a(1:3)=b(4:6) !类似于这种的要求左右数组元素个数相同 a(:)=b(:,2) !a(1)=b(1,2),a(2)=b(2,2),以此类推6、WHERE where 形式上类似于 if,但只用于设置数组。设有两个同样类型、维数和大小的数组 a,b where(
29、a3) b=a !a 中小于 3 的元素赋值给 b 对应位置的元素 end where 再如:where(a(1:3)/=0) c=a !略去了 end where,因为只跟了一行 where 可嵌,也 !可类似 do 循环有署名标签。7、FORALL 有点像 C 中的 for 循环: forall(triplet1,triplet2 ,triplet3,mask) 其中 triplet 形如 i=2:6:2,表示循环,最后一个数字省略则增量为 1 例如: forall(i=1:5,j=1:5,a(i,j)10) a(i,j)=1 end forall 又如: forall(i=1:5,j=1
30、:5,a(i,j)/=0) a(i,j)=1/a(i,j) forall 也可以嵌套使用,好比 C 中 for 循环的嵌套。七、函数 Fortran 中函数分两类:子程序(subroutine)和自定义函数(function)。自定义函数本 质上就是学上的函数,一般要传递自变量给自定义函数,返回函数值。子程序不一定是这样,可 以没有返值。传递参数要注意类型的对应,这跟 C 是一样的。 1、子程序 目的:把某一段经常使用的有特定功能的程序独立出来,可以方便调用。 习惯上一般都把子程序放在主程序结束之后。 形式: subroutine name (parameter1, parameter2) !
31、给子程序起一个有意义的名字。可以传递参数,这样可以有返回值。括号内也可以 空着,代不传递参数。 implicit none integer: parameter1, parameter2 !需要定义一下接收参数的类型。 !接下来的程序编写跟主程序没有任何别。 return !跟 C 不同,这里表示子程序执行后回到调用它的地方继续执行下面的程序。不一定放在最后。可以放在子程序的其他位置,作用相同;子程序中 return 之后的部分不执行。 end subroutine name 调用:使用 call 命令直接使用,不需要声明。在调用处写: call subroutine name(paramet
32、er1,parameter2) 注意点: a.子程序之间也可相互调用。直接调用就是了,像在主程序中调用子程序一样。b.传递参数的原理和 C 中不同。Fortran 里是传址调用(call by address/reference),就是传递时用参数和子程序中接收时用的参数使用同一个地址,尽管命名可以不同。这样如果子程序的执行改子程序中接收参数的值,所传递的参数也相应发生变化。 c.子程序各自内部定义的变量具有独立性,类似于 C。各自的行代码也具有独立性。因此各个子程序主程序中有相同的变量名、行代码号,并不会相互影响。2、自定义函数 和子程序的明显不同在于:需要在主程序中声明之后才能使用。调用方
33、式也有差别。另外按照惯例用函数不去改变自变量的值。如果要改变传递参数的值,习惯上用子程序来做。 声明方式:real, external : function_name 一般自定义函数也是放在主程序之后。形式: function function_name(parameter1, parameter2) implicit none real: parameter1, parameter2 !声明函数参数类型,这是必需的 real:function_name !声明函数返回值类型,这是必需的 function_name=. !返回值的表达式 return end 也可以这样直接声明返回值类型,简洁
34、些: real function function_name(parameter1, parameter2) implicit none real: parameter1, parameter2 !这个还是必需的 function_name=. !返回值表达式 return end 调用:function_name(parameter1,parameter2) 不需要 call 命令。 自定义函数可以相互调用。调用时也需要事先声明。 总之,调用自定义函数前需要做声明,调用子程序则不需要。3、关于函数中的变量 (1)注意类型的对应。Fortran 中甚至可以传递数值常量,但只有跟函数定义的参数类
35、型 对应才会到想要的结果。如 call ShowReal(1.0)就必须用 1.0 而不是 1。 (2)传递数组参数,也跟 C 一样是传地址,不过不一定是数组首地址,而可以是数组某个 指定元素地址。比如有数组 a(5),调用 call function(a)则传递a(1)的地址,调用 call functio n(a(3)则递 a(3)的地址。 (3)多维数组作为函数参数,跟 C 相反的是,最后一维的大小可以不写,其他维大小必须 写。这决于 Fortran 中数组元素 column major 的存放方式。 (4)在函数中,如果数组是接收用的参数,则在声明时可以用变量赋值它的大小,甚至可 以不
36、指定小。例如:subroutine Array(num,size) implicit none integer: size integer num(size) !可以定义一个数组,其大小是通过传递过来的参数决定的。这很实用 return end (5)save 命令:将函数中的变量值在调用之后保留下来,下次调用此函数时该变量的值就 是上次保的值。只要在定义时加上 save 就行: integer, save : a=1 (6)传递函数(包括自定义函数、库函数、子程序都是可以的)。类似于 C中的函数指针需要在 主程序和调用函数的函数中都声明作为参数传递的函数。如 real, external :
37、 function !自定义函数 real, intrinsic : sin !库函数 external sub !子程序 (7)函数使用接口(interface):一段程序模块。以下情况必需: a.函数返回值为数组 b.指定参数位置来传递参数时 c.所调用的函数参数个数不固定 d.输入指标参数时 e.函数返回值为指针时。 具体用法结合例子容易看懂。例子都很长。看书吧。4、全局变量功能就不用说了。原理:根据声明时的相对位置关系而取用,不同与 C 中根据变量名使用。如果在主程序中定义:integer : a,bcommon a,b !就是这样定义全局变量的在子程序或自定义函数中定义:intege
38、r : c,dcommon c,d则 a 和 c 共用相同内存, b 和 d 共用相同内存。全局变量太多时会很麻烦。可以把它们人为归类,只需在定义时在 common 后面加上区间名, 如common /groupe1/ a, common /group2/ b。这样使用时就不必把所有全局变量都列出来,再声明 common /groupe1/ c就可以用 a、 c 全局变量了。可以使用 block data 程序模块。在主程序和函数中不能直接使用前面提到的data 命令给全局变量赋初值。可以给它们各自赋初值;如果要使用 data 命令必须要这样:block data nameimplicit n
39、oneinteger a,b,creal d,ecommon a b ccommon /group1/ d,edata a,b,c,d,e /1,2,3,4.0,5.0/end block data name5、Module Module 不是函数。它用于封装程序模块,一般是把具有相关功能的函数及变量封装在一起 。用法很单,但能提供很多方便,使程序变得简洁,比如使用全局变量不必每次都声明一长串, 写在 odule 里调用就行了。Module一般写在主程序开始之前。 形式: module module_name end module module_name 使用:在主程序或函数中使用时,需要在声
40、明之前先写上一行:use module_name. Module 中有函数时必须在 contains 命令之后(即在某一行写上 contains 然后下 面开始写数,多所有函数都写在这个contains 之后)。并且 module 中定义过的变量在 module 里的 函数中可直接使用,函数之间也可以直接相互调用,连 module 中的自定义函数在被调用时也不用 先声明。6、include 放在需要的任何地方,插入另外的文件(必须在同一目录下)。如:include funcion.f90八、文件 1、文本文件 Fortran 里有两种读取文件的方式,对应于两种文件顺序读取:用于文本文件 直接读
41、取:用于二进制文件 这里只摘录关于文本文件的读取。一般模式如下。 character(len=20):filenamein=“in.txt“, filenameout=“out.txt“ !文件名 logical alive integer:fileidin=10,fileidout=20 !10,20 是给文件编的号,除 1,2 , 5,6 的正整数都可,因为 2、6 是默认的输出位置(屏幕 ),1 、5 是默认的输入位置(键盘) integer:error real:in,out !下面这一段用于确认指定名字的文件是否存在 inquire(file=filenamein, exist=al
42、ive) !如果存在,alive 赋值为 0 if(.NOT. alive) then write(*,*) trim(filenamein), “ doesnt exist.“!trim 用于删去 filenamein 中字串 !后面的 stop 多余空格,输出时好看些 end if open(unit=fileidin, file=filenamein, status=“old“) open(unit=fileidout,file=filenameout,status=“new“) !unit 指定输入 /输出的位置。打开已有文件一定要用 status=“old“;打开新文件用 statu
43、s=“new“; !不指定 status,则默认 status=“unknown“,覆盖已有文件或打开新文件 read(unit=fileidin, fmt=100,iostat=error )in !error=0表示正确读入数据。 100 format(1X,F6.3) !按一定格式输入输出,格式可以另外写并指定行代码,也可以直接写在 read/write 中 write(unit=fileidout, “(1X,F6.3)“)out close(fileidin) close(fileidout) !1X 代表一个空格。F6.3 代表 real 型数据用占 6 个字符(含小数点),其中小
44、数点后三位。 !常用的还有 I3,用于整型数据,共占三个字符;A8,字符型,占 8 个字符。换行用 / 二进制文件的读取有所不同。不再列举。2、内部文件 另一个很实用的读写功能是内部文件(internal file)。看看这个例子就明白了。 integer:a=1,b=2 character(len=20):string write(unit=string,fmt=“(I2,+,I2,=,I2)“)a,b,a+b write(*,*)string 则结果输出 1+2=3。反过来也是可以的: integer a character(len=20):string=“123“ read(string,*)a write(*,*)a 则输出 123。!全文结束。