版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1FORTRAN77 四 则 运 算 符+ - */ * ( 其中 * 表示乘方)在表达式中按优先级次序由低到高为:+ 或 -* 或 /* 函数 ()2 FORTRAN77变量类型隐含约定:I-N 规则凡是以字母I , J, K, L, M, N 六个字母开头的,即认为是整型变量,其它为实型变量。用类型说明语句确定变量类型:可以改变I-N 规则INTEGERREALDOUBLE PRECISIONCOMPLEXLOGICALCHARACTER*N整型实型双精度实型复型,赋值形式为( 实部,虚部), 如 D=+,C=, 如果含表达式则用CMPLX, 如 C=CMPLX*A,+B)逻辑型,逻辑常量
2、有“T和” “F,”“T表示”“ .TRUE. ”,表示“F”“.FALSE.字符型 ,N 为字符串长度,可以在变量名称后重新指定长度,如CHARACTER*8 STR1,STR2*10 , 赋值形式为STR2='I''M A BOY.'用 IMPLICIT 语句将某一字母开头的全部变量指定为所需类型如 IMPLICIT REAL (I,J)三种定义的优先级别由低到高顺序为:I-N 规则 IMPLICIT 语句 类型说明语句,因此,在程序中IMPLICIT 语句应放在类型说明语句之前。数组的说明与使用使用 I-N 规则时用DIMENSION 说明数组,也可在定义
3、变量类型同时说明数组,说明格式为:数组名( 下标下界 , 下标上界),也可省略下标下界,此时默认为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)使用 DATA 语句给数组赋初值变量表中可出现变量名, 数组名,数组元素名,隐含 DO 循环,但不许出现任何形式的表达
4、式:例如DATA A,B,C/,DATA A/,B/,C/DATA A,B,C/3*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. 逻辑不等运算符优先级由高到低顺序为:() * * 或 / + 或 - .GT. 或 .GE. 或 .LT. 或 .LE
6、. 或 .EQ.或 .NE. .NOT. .AND. .OR. .EQV. 或 .NEQV5 FORTRAN77语句语句说明备注WRITE(*,*)X1,X2输出语句第一个* 号是指输入输出文件设备号或其它设备,如果不指定则是指显示器或打印机, 第二个* 号是指表控格式语句的行号,如不指定则用默认格式PRINT *,X1,X2输出语句* 号是指表控格式语句的行号,如不指定则用默认格式READ *,X1,X2输入语句* 号是指表控格式语句的行号,如不指定则用默认格式FORMAT( 格式 符)请见附录一。请见附录二。END结束程序或子 程序STOP N结束程序并输出信息NN 为数字或字符串信息PA
7、USE N暂停程序执行 并输出信息N 为数字或字符串信息N ,输入回车 后继续执行PARAMETER (PI=参数语句,用来 定义常量,在程 序中应放在类 型说明语句之 后EQUIVALENCE( 变量表)等价语句,() 内变量共用一个存储单元。EQUIVALENCE(X1,X2, XN),(X1,X2, XN), COMMONX1, 公用语句,其后 变量相等,用来 在程序单位间 传递数据,同时 可以用来说明 数组。程序中可 有一个无名公 用区和多个有 名公用区。无名公用区: 在主程序各子程序中相同,均在可执行语句之前 ,如COMMON A(5),I有名公用区:名称放在两个“ /之间 ”, 如
8、COMMONELSE IF ( 逻辑表达式N) THEN程序块NELSE程序块N+1END IF7 FORTRAN77循环语句GO TO 语句标号程序行程序块GO TO 标号DO 语句DO 标号 ,记数变量 = 起始值,终止值,步距 ”语句,如DO 标号 ,N=1,100,1程序块标号 CONTINUEDO WHILE 语句DO 标号程序块标号 CONTINUEDO UNTIL 语句DO 标号 ,UNTIL ( 逻辑表达式) ”语句,如DO 标号程序块标号 CONTINUE8 FORTRAN77内部函数INT(X)将数字串或数值X 转换为整型数REAL(X)将数字串或数值X 转换为实型数DBE
9、L(X)将数字串或数值X 转换为双精度型数CMPLX(X)将数字串或数值X 转换为复型数CHAR(X)将数值X 转换为字符(0 X 255)ICHAR(X)将字符X 转换为整数AINT(X)截去X 的小数部分ANINT(X)将 X 舍入到最接近的整数NINT(X)将 X 舍入到最接近的整型数ABS(X)返回X 的绝对值MOD(X1,X2)返回X1/X2 的余数SIGN(X1,X2)取 X2 的符号, 取 X1 的绝对值DIM(X1,X2)当 X1>X2 时 , 等于X1-X2, 当 X1 X2 时 ,等于0DPROD(X1,X2)双精度乘(X1,X2 均为实数)AIMAG(X)返回字符串
10、X 的虚部CONJG(X)返回字符串X 的共轭MAX(X1,X2,X3,.,XN)返回X1,X2,X3,.,XN 中最大值MIN(X1,X2,X3,.,XN)返回X1,X2,X3,.,XN 中最小值SQRT(X)返回X 的平方根(X 0)EXP(X)返回E 的 X 次方LOG(X)返回以E 为底的X 的对数即自然对数(X>0)LOG10(X)返回以10 为底的X 的对数即常用对数(X>0)SIN(X)返回弧度值X 的正弦值COS(X)返回弧度值X 的余弦值TAN(X)返回弧度值X 的正切值ASIN(X)返回弧度值X 的反正弦值ACOS(X)返回弧度值X 的反余弦值ATAN(X)返回
11、弧度值X 的反正切值SINH(X)返回X 的双曲正弦值COSH(X)返回X 的双曲余弦值TANH(X)返回X 的双曲正切值LEN(X)返回字符串X 的长度INDEX(X1,X2)返回字符串X2 在字符串X1 中的位置, 不包含时返回0LGE(X1,X2)如果字符串X1 X2 则等于.TRUE., 否则等于.FALSE.LGT(X1,X2)如果字符串X1 > X2 则等于.TRUE., 否则等于.FALSE.LLE(X1,X2)如果字符串X1 X2 则等于.TRUE., 否则等于.FALSE.LLT(X1,X2)如果字符串X1 < X2 则等于.TRUE., 否则等于.FALSE.9
12、 FORTRAN77函数与子程序FORTRAN77 语句函数当函数十分简单,用一条语句足以定义时(允许使用继续行)才用;应该放在所有可执行语句之前和有关类型说明语句之后,是非执行语句; 只在其所在程序单位中有意义; 语句函数中的虚参就是变量名,不能是常量、表达式或数组元素等;语句函数定义语句中的表达式可以包含已经定义过的语句函数、外部函数或内部函数。语句函数通过表达式得一个函数值,此数值类型必须与函数名的类型一致。语句函数的 使用同内部函数相同。语句函数例子:ZMJ=YMJ(5)FORTRAN77 自定义函数定义格式:类型说明FUNCTION 函数名(虚拟参数1, 虚拟参数2, , 虚拟参数N
13、)程序块( 可以含有RETURN)函数名= 函数值END调用格式与内部函数相同。FORTRAN77 子程序定义格式:SUBROUTINE 子程序名(虚拟参数1, 虚拟参数2, , 虚拟参数N)程序块( 可以含有RETURN)END调用格式:CALL 子程序名( 实在参数1, 实在参数2, , 实在参数N)数据块子程序:只是用来给有名公用区中的变量赋初值,格式如下:BLOCK DATA 子程序名DATA 语句块END附录一、FORTRAN7控制输入输出格式 71. 在打印输出时,每一行第1 个字符不显示,用来控制纵向走纸或显示行。第 1 个字符作用空格正常回车换行0回车并跳过1 行1换页+只回车
14、不换行其它通常是回车换行2. 输入小数时,自带小数点优先。3. 输出字段宽度不够时用* 号填充。附录二、FORTRAN7控制输入输出格式语句 71IW 或整数型W 为字段宽度,M 为最少数字位数2实数型D 为小数位数3 或指数实数型E 为指数位数,通常为3 或 445自动实数型双精度型6LW逻辑型7A 或 AW字符型不指定W 时自动8'字符串'插入字符串两个 '表示一个字符'9NH 字符串插入长度为N 的字符串10 NX插入N 个空格11 RIW,R(NX,R 个 IW,R 个 (NX,R 为重复系数12 /换行13 ,$禁止换行目录:? 一、说明? 二、概述?
15、 三、数据类型及基本输入输出? 四、流程控制? 五、循环? 六、数组? 七、函数?八、文件一、说明?本文多数内容是我读彭国伦 Fortran 95 程序设计的笔记。 只读到第九章,主要是 39章, 都是最基本的用法(原书共16 章) 。 这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。外,由于我之前没有用过Fortran
16、,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果有不妥的方,希望大家指正。谢谢! 文中 蓝色 的部分是程序代码,! 后面的内容为注释。二、概述?1、名词解释Fortran= For mula Tran slator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始, IBM设计的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一目标。 ortran奠定了高级语言发展的基础。现在Fortran 在科研和机械方面应用很广。2、 Fortr
17、an 的主要版本及差别按其发展历史,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)每行前六个字符不能写程序代码
18、,可空着, 或者15字符以数字表明行代码(用作格式化输入出等);772 为程序代码编写区;73 往后被忽略;( 3)太长的话可以续行,所续行的第六个字符必须是"0" 以外的任何字符。Fortran 90 : 自由格式(free format ), 扩展名:.f90( 1) 以 "!" 引导注释;( 2) 每行可132 字符,行代码放在每行最前面;( 3) 以 &续行,放在该行末或下行初。以下都是讨论Fortran 90 。3、 Fortran 的一些特点,和C的一些不同其实很多,在下面涉及具体方面时可以看到。这里只是大致提一些。( 1)不分大小写
19、( 2)每句末尾不必要写分号( 3)程序代码命令间的空格没有意义( 4)不像C, Fortran 不使用 ( 5)数据类型多出了复数和逻辑判断类型。比如复数类型complex : a ! 声明复数的方法。复数显然方便了科学计算,满足了工程方面需求a=, ! a=1+i ( 6)多出了乘幂运算(* )。乘幂除了整数还可以是实数形式。如开方, 开立方 a=* , a=* 。 ( 7) 数组有一些整体操作的功能;可以方便的对部分元素进行操作( 8)有些情况下可以声明大小待定的数组,很实用的功能4、 Fortran 的基本程序结构?先看一看所谓的"Hello Fortran" 程序
20、。?program main ! 程序开始,main 是 program 的名字,完全自定义?write(*,*) "Hello"! 主程序?stop ! 终止程序?end programmain !end 用于封装代码,表示代码编写完毕。 中的内容可省略,下同。?再看一段实用一些的程序,好有点感性认识。程序用于计算圆柱的表面积,要求输入底面 半径和。其中展示了Fortran 的一些特色用法。程序摘自维基。其实是一个叫的网上引的维基的网页。推荐去看看! 能查到不少有意思的东西。?program cylinder ! 给主函数起个名字?! Calculate the area
21、 of a cylinder.?! Declare variables and constants.?! constants=pi ?! variables=radius squared and height implicit none ! Require all variables to be explicitly declared !这个一般都是要写上的。下面会进一步说明。?integer : ierr?character : yn?real : radius, height, area?! 这是常量的声明方法?interactive_loop: do!do 循环, Fortran 中的循
22、环可以加标签,如d 前面的 !interactive_loop 就是标签! Prompt the user for radius and height and read them.write (*,*) 'Enter radius and height.'! 屏幕输出read (*,*,iostat=ierr) radius,height! 键盘输入。isotat 的值用判断输入成功否。! If radius and height could not be read from input, then cycle through the loop.if (ierr /= 0) t
23、hen?write(*,*) 'Error, invalid input.'cycle interactive_loop!cycle 相当于 C里的 continueend if! Compute area. The * means "raise to a power."area = 2 * pi * (radius*2 + radius*height)! 指数运算比C 方便! Write the input variables (radius, height)and output (area) tothe screen. ?write (*,'(1
24、x,a7,5x,a7,5x,a5,') &!"&" 表示续行。这里还显示了格式化输出 'radius=',radius,'height=',height,'area=',area yn = ' '?yn_loop: do ! 内嵌的另一个do 循环?write(*,*) 'Perform another calculation yn'?read(*,'(a1)') yn?if (yn='y' .or. yn='Y')?exi
25、t yn_loop ?if (yn='n' .or. yn='N' .or. yn=' ')?exit interactive_loop?end do yn_loop ! 结束内嵌do 循环?end do interactive_loop end program cylinder?Fortran 程序的主要结构就是这样了。一般还会有些module的部分在主函数前,函数在主函 数后。三、数据类型及基本输入输出?1、数据类型,声明及赋初值?( 1) integer : 短整型 kind=2, 长整型 kind=4 ?integer(kind=2) :
26、 a=3 如果声明成integer:a,则默认为长整型。!":"在声明并同时赋初值时必须要写上;类型名后面有形容词时也必须保留: ;其他情况可略去 ! 所谓形容词,可以看一下这个。比如声明常数real , parameter : pi= 。parameter 就是形容词。?( 2) real :单精度kind=4 (默认),双精度kind=8 ?real(kind=8) : a=还有指数的形式,如1E10 为单精度,1D10 为双精度?( 3) complex单精度和双精度complex(kind=4) b ?( 4) character character(len=10)
27、 c!len 为最大长度?( 5) logical logical*2 : d=.ture.( 等价于 logical(2):d=.ture.) ?( 6)自定义类型type :类似于C中的struct ?Fortran 77 中给变量赋初值常用DATA命令,可同时给多个变量赋初值? data a,b,string /1, , 'fortran'/与 C 不同的是,Fortran 中变量不声明也能使用, 即有默认类型(跟 implicit 命令有关) 。 按照默认的定,以 i,j,k,l,m,n 开头的变量被定义为integer, 其余为 real 。取消该设置需在程序声明部分
28、之前implicit none 。 彭国伦建议一般都使用该语句。?另一点关于声明的不同是Fortran 有 " 等价声明" : integer a,b equivalence(a,b)使得 a,b 使用同一块内存。这样可以节省内存;有时可精简代码。如:equivalence( 很长名字的变量如三维数组的某个元素,a) ,之后使用a 来编写程序就简洁多了。2、基本输入输出?输入: read(*,*) a ! 从键盘读入?输出: write(*,*) "text"! 在屏幕上输出。Fortran 77 用 ' text' 。 Fortan 9
29、0 中一般 " " 和 ' ' 都可?print *, "text" ! 只能用于屏幕输出( *,* )完整写为(unit=*,fmt=* )。其中unit为输入 / 输出位置,如屏幕,文件等;fmt 为 格式。如这两项都写成*,则按默认的方式进行,即上面描述的。print 后面的 *表示按默认格式输出。四、流程控制?1、运算符?( 1)逻辑运算符= /= > >= < <= !Fortran 90 用法?.EQ. .NE. .GT. .GE. .LT. .LE. !Fortran 77用法?( 2)涉及相互关系的
30、集合运算符?.AND. .OR. .NOT. .EQV. .NEQV. ! 仅 .NOT.连接一个表达式,其余左右两边都要有表达式(可以是logical 类型的变量)!.EQV. :当两边逻辑运算值相同时为真,.NEQV.:当两边逻辑运算值不同时为真2、 IF(1) 基本 :?if( 逻辑判断式) then end if ?如果 then 后面只有一句,可写为if( 逻辑判断式) !then 和 end if 可省略(2) 多重判断:if (条件 1 ) thenelse if (条件 2) thenelse if (条件 3) thenelseend if(3) 嵌套:if(逻辑判断式)th
31、enif(逻辑判断式)thenif(逻辑判断式)thenelse if( 逻辑判断式) thenelseend if ?end ifend if(4) 算术判断:program exampleimplicit nonereal cwrite (*,*) "input a number"read (*,*) cif(c) 10,20,30 !10,20 和 30 为行代码, 根据 c 小于 /等于 /大于 0, 执行 10/20/30行的程10 write (*,*) "A"goto 40 !goto 可实现跳到任意前面或后面的行代码处,但用多了破坏程序结
32、20 write (*,*) "B"goto 4030 write (*,*) "C"goto 4040 stop end3、 SELECT CASE类似于C的 switch 语句select case( 变量 )case (数值 1 ) ! 比如 case(1:5) 代表 1<=变量 <=5 会执行该模块 !case ( 1 , 3, 5)代表变量等于1 或 3 或 5 会执行该模块case (数值2) ! 括号中数值只能是integer,character 或 logical 型常量,不能real 型case defaultend cas
33、e4、 PAUSE, CONTINU? Epause 暂停程序执行,按enter 可继续执行?continue 貌似没什么用处,可用作封装程序的标志五、循环?1、 DO?do counter= 初值 , 终值 , 增 / 减量 !counter 的值从初值到终值按增/ 减量变, !counter 每取一个值对应着一次循环。增/ 减量不写则认为1 ? ? ! 循环主体也没有必要用 ?end do ?Fortran 77 中不是用end do 来终止,而是下面这样子:?do 循环最后一行的行代码counter= 初值 , 终值 , 增 / 减量? ?行代码 ! 这是 do 的最后一行2、 DO W
34、HIL?Edo while( 逻辑运算) ? ? ?end do 类似于C中的while( 逻辑运算 ) 。 一开始那个计算圆柱表面积的程序中,应该也算是这一类。不过它是通过内部的if 语句来 控制循。看来也是可以的,不过在这本书上没看到这样写。其实应该也可以归于下面这种。3、没看到和C里面的dowhile( 逻辑运算); 相对应的循环语句,不过可以这样,保证至少做一循环:do while(.ture.) ? ?if( 逻辑运算 ) ?exit !exit 就好比 C 里面的 break 。 C里的 continue 在 Fortran 里是 cycle end do4、 Fortran 的一
35、个特色:带署名的循环可以这样,不易出错:?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 特有,很实用
36、。六、数组?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) ! 配置内存空间之
37、后该数组和通过一般方法声明的数组完全相同。与 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,2
38、,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 ?in
39、teger : 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 维数和
40、大小相同,下同?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、 WHER? Ewhere 形式上类似于if ,但只用于设置数组。设有两个同样类型、维数和大小的数组a,b?w
41、here(a<3) b=a !a 中小于 3 的元素赋值给b 对应位置的元素?end where ?再如:where(a(1:3)/=0) c=a ! 略去了 end where, 因为只跟了一行where 可嵌,也! 可类似do 循环有署名标签。7、 FORAL?L有点像 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?又如:
42、 ?forall(i=1:5,j=1:5,a(i,j)/=0) a(i,j)=1/a(i,j)?forall 也可以嵌套使用,好比C中 for 循环的嵌套。七、函数?Fortran 中函数分两类:子程序(subroutine )和自定义函数(function )。自定义函数本 质上就是学上的函数,一般要传递自变量给自定义函数,返回函数值。子程序不一定 是这样,可以没有返值。传递参数要注意类型的对应,这跟C是一样的。?1、子程序?目的:把某一段经常使用的有特定功能的程序独立出来,可以方便调用。 把子程序放在主程序结束之后。? 形式:?subroutine name (parameter1, pa
43、rameter2)! 给子程序起一个有意义的名字。可以传递参数,这样可以有返回值。括号内也可以空着,代不传递参数。?implicit none ?integer: parameter1, parameter2! 需要定义一下接收参数的类型。? ! 接下来的程序编写跟主程序没有任何别。? return ! 跟 C不同,这里表示子程序执行后回到调用它的地方继续执行下面的程序。不一定放在最后。可以放在子程序的其他位置,作用相同;子程序中return 之后的部分不执行。?end subroutine name ?调用:使用call 命令直接使用,不需要声明。在调用处写:?call subroutine
44、 name(parameter1,parameter2)?注意点:?a. 子程序之间也可相互调用。直接调用就是了,像在主程序中调用子程序一样。?b. 传递参数的原理和C中不同。Fortran 里是传址调用(call by address/reference) ,就是传递时用参数和子程序中接收时用的参数使用同一个地址,尽管命名可以不同。这样如果子程序的执行改子程序中接收参数的值,所传递的参数也相应发生变化。?c. 子程序各自内部定义的变量具有独立性,类似于C。 各自的行代码也具有独立性。因此各个子程序主程序中有相同的变量名、行代码号,并不会相互影响。2、自定义函数?和子程序的明显不同在于:需要在
45、主程序中声明之后才能使用。调用方式也有差别。另外按照惯例用函数不去改变自变量的值。如果要改变传递参数的值,习惯上用子程序来做。?声明方式:real, external : function_name一般自定义函数也是放在主程序之后。形式:?function function_name(parameter1, parameter2)?implicit none real: parameter1, parameter2! 声明函数参数类型,这是必需的?real:function_name ! 声明函数返回值类型,这是必需的? ? ?function_name= .! 返回值的表达式?return
46、?end ?也可以这样直接声明返回值类型,简洁些:?real function function_name(parameter1, parameter2)?implicit none ?real: parameter1, parameter2! 这个还是必需的? ? ?function_name= .! 返回值表达式?return ?end ?调用:function_name(parameter1,parameter2)不需要 call 命令。 自定义函数可以相互调用。调用时也需要事先声明。总之,调用自定义函数前需要做声明,调用子程序则不需要。3、关于函数中的变量?( 1)注意类型的对应。Fo
47、rtran 中甚至可以传递数值常量,但只有跟函数定义的参数类型对应才会到想要的结果。如 call ShowReal 就必须用而不是1。?( 2)传递数组参数,也跟C一样是传地址,不过不一定是数组首地址,而可以是数组某个 指定元素地址。比如有数组a(5) ,调用 call function(a) 则传递 a(1) 的地址,调用call functio n(a(3) 则递 a(3) 的地址。?( 3)多维数组作为函数参数,跟C相反的是,最后一维的大小可以不写,其他维大小必须 写。这决于Fortran 中数组元素column major 的存放方式。?( 4)在函数中,如果数组是接收用的参数,则在声
48、明时可以用变量赋值它的大小,甚至可 以不指定小。例如:subroutine Array(num,size)?implicit noneinteger: size integer num(size)! 可以定义一个数组,其大小是通过传递过来的参数决定的。这很实用 ? ?return ?end ?( 5) save 命令:将函数中的变量值在调用之后保留下来,下次调用此函数时该变量的值就 是上次保的值。只要在定义时加上save 就行:?integer, save : a=1?( 6)传递函数(包括自定义函数、库函数、子程序都是可以的)。类似于C中的函数指针需要在主程序和调用函数的函数中都声明作为参数
49、传递的函数。如?real, external : function! 自定义函数?real, intrinsic : sin! 库函数?external sub ! 子程序?( 7)函数使用接口(interface ):一段程序模块。以下情况必需:a. 函数返回值为数组 b. 指定参数位置来传递参数时c. 所调用的函数参数个数不固定d. 输入指标参数时e. 函数返回值为指针时。具体用法结合例子容易看懂。例子都很长。看书吧。4、全局变量功能就不用说了。原理:根据声明时的相对位置关系而取用,不同与C中根据变量名使用。如果在主程序中定义:integer : a,bcommon a,b ! 就是这样定
50、义全局变量的在子程序或自定义函数中定义:integer : 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 noneinteger a,b,creal d,ecommon a b ccommon /group1/ d,edata a,b,c,d,e /1,2,3, end block data name5、 Module Module 不是函数。它用于封装程序模块,一般是把具有相关功能的函数及变量封装在一起。用法很单,但能提供很多方便,使程序变得简洁,比如使用全局变量不必每次都声明一长串,写在 odule 里调用就行了。Module一般写在主程序开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗合同范本
- 转让秘方合同范本
- 智慧停车建设项目方案建议书V2.0
- 独立授权维修合同范本
- 景区树木收购合同范本
- 酒水饮料购销合同范本
- 定制软件购买合同范本
- 未来五年健康管理与促进服务企业数字化转型与智慧升级战略分析研究报告
- 未来五年涉农土壤污染治理与修复行业直播电商战略分析研究报告
- 未来五年稻丰散行业直播电商战略分析研究报告
- 金属硬度转换表【HLD,HRC,HRB,HV,HB,HSD】
- 大庆一中、六十九中初四上学期期末质量检测物理试题
- 建材有限公司砂石卸车作业安全风险分级管控清单
- 小学生一、二、三年级家庭奖罚制度表
- 中石化华北分公司钻井定额使用说明
- 矿山压力与岩层控制智慧树知到答案章节测试2023年湖南科技大学
- 机加工车间主任年终总结3篇
- WB/T 1119-2022数字化仓库评估规范
- GB/T 5125-1985有色金属冲杯试验方法
- GB/T 4937.3-2012半导体器件机械和气候试验方法第3部分:外部目检
- 我国尾管悬挂器研制(for cnpc)
评论
0/150
提交评论