fortran语法手册.doc_第1页
fortran语法手册.doc_第2页
fortran语法手册.doc_第3页
fortran语法手册.doc_第4页
fortran语法手册.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.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*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规则时用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循环,但不许出现任何形式的表达式:例如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 程序名称字符串某行的第个字符至第个字符位为标号区,只能书写语句标号或空着或注释内容;某行的第个字符为或号时,则表示该行为注释行,其后面的内容为注释内容;某行的第个字符位为非空格和非字符时,则该行为上一行的续行,一个语句最多可有19个续行;某行的第至字符位为语句区,语句区内可以任加空格以求美观;某行的第至字符位为注释区,字符位以后不能有内容。4 FORTRAN77关系运算符.GT. 大于.GE. 天于或等于.LT. 小于.LE. 小于或等于.EQ. 等于.NE. 不等于 .AND. 逻辑与.OR. 逻辑或.NOT. 逻辑非.EQV. 逻辑等.NEQV. 逻辑不等运算符优先级由高到低顺序为:()*或/+或-.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结束程序并输出信息NN为数字或字符串信息PAUSE N暂停程序执行并输出信息N,输入回车后继续执行N为数字或字符串信息PARAMETER (PI=3.14)参数语句,用来定义常量,在程序中应放在类型说明语句之后EQUIVALENCE (变量表)等价语句,()内变量共用一个存储单元。EQUIVALENCE(X1,X2,XN),(X1,X2,XN),COMMON X1,公用语句,其后变量相等,用来在程序单位间传递数据,同时可以用来说明数组。程序中可有一个无名公用区和多个有名公用区。无名公用区:在主程序各子程序中相同,均在可执行语句之前,如COMMON A(5),I有名公用区:名称放在两个“/”之间,如COMMON /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表示顺序存取,DIRECT表示直接存取,省略此项时表示按顺序存取;5.STR3为记录格式说明,FORMATTED表示记录按有格式形式存放, UNFORMATTED表示记录按无格式形式存放。省略此项时,对于顺序文件是有格式的,对于直接存取文件是无格式的;6.C表示记录长度,以字节为单位,直接存取文件必指定,顺序文件必省略;7.STR4表示数字值格式输入字段中空格含意,NULL时表示忽略不计,ZERO时表示按0计。省略此项时按0计;8.BH表示出错时处理语句行标号,可以省略此项;9.M为整数,出错时返回该整数,可以省略此项。CLOSE (说明项2)关闭已打开文件说明项2中内容: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 (逻辑表达式) THEN程序块1ELSE程序块2END IF6.4 多重选择块IF (逻辑表达式1) THEN程序块1ELSE IF (逻辑表达式2) THEN程序块2ELSE IF (逻辑表达式2) THEN程序块2.ELSE 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.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舍入到最接近的整数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)返回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)返回字符串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语句函数当函数十分简单,用一条语句足以定义时(允许使用继续行)才用;应该放在所有可执行语句之前和有关类型说明语句之后,是非执行语句;只在其所在程序单位中有意义;语句函数中的虚参就是变量名,不能是常量、表达式或数组元素等;语句函数定义语句中的表达式可以包含已经定义过的语句函数、外部函数或内部函数。语句函数通过表达式得一个函数值,此数值类型必须与函数名的类型一致。语句函数的使用同内部函数相同。语句函数例子:YMJ(R)=3.14159265*R*RZMJ=YMJ(5)9.2 FORTRAN77自定义函数定义格式:类型说明 FUNCTION 函数名(虚拟参数1,虚拟参数2,虚拟参数N)程序块(可以含有RETURN)函数名=函数值END调用格式与内部函数相同。9.3 FORTRAN77子程序定义格式:SUBROUTINE 子程序名(虚拟参数1,虚拟参数2,虚拟参数N)程序块(可以含有RETURN)END调用格式:CALL 子程序名(实在参数1,实在参数2,实在参数N)数据块子程序:只是用来给有名公用区中的变量赋初值,格式如下:BLOCK DATA 子程序名DATA语句块END附录一、FORTRAN77控制输入输出格式1.在打印输出时,每一行第1个字符不显示,用来控制纵向走纸或显示行。第1个字符作用空格正常回车换行0回车并跳过1行1换页+只回车不换行其它通常是回车换行2.输入小数时,自带小数点优先。3.输出字段宽度不够时用*号填充。附录二、FORTRAN77控制输入输出格式语句1IW或IW.M整数型W为字段宽度,M为最少数字位数2FW.D实数型D为小数位数3EW.D或EW.DEE指数实数型E为指数位数,通常为3或44GW.M自动实数型5DW.D双精度型6LW逻辑型7A或AW字符型不指定W时自动8字符串插入字符串两个表示一个字符9NH字符串插入长度为N的字符串10NX插入N个空格11RIW,R(NX,IW.M)R个IW,R个(NX,IW.M)R为重复系数12/换行13,$禁止换行目录:一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是我读彭国伦Fortran 95 程序设计的笔记。只读到第九章,主要是39 章,都是最基本的用法(原书共16章)。这里主要摘录了我看书过程中总结的一些Fortran和C不 同的地方,主要是语法方面。希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮 助。要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础, 看完前九应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起 来了。外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过 之后都没得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果 有不妥的方,希望大家指正。谢谢! 文中蓝色的部分是程序代码,!后面的内容为注释。二、概述1、名词解释 Fortran=FormulaTranslator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始 ,IBM设计的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一 目标。ortran奠定了高级语言发展的基础。现在Fortran在科研和机械方面应用很广。2、Fortran的主要版本及差别 按其发展历史,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)每行前六个字符不能写程序代码,可空着,或者15字符以数字表明行代码(用作格 式化输入出等);772为程序代码编写区;73往后被忽略; (3)太长的话可以续行,所续行的第六个字符必须是0以外的任何字符。Fortran 90:自由格式(free format), 扩展名:.f90 (1)以!引导注释; (2)每行可132字符,行代码放在每行最前面; (3)以&续行,放在该行末或下行初。 以下都是讨论Fortran 90。3、Fortran的一些特点,和C的一些不同 其实很多,在下面涉及具体方面时可以看到。这里只是大致提一些。 (1)不分大小写 (2)每句末尾不必要写分号 (3)程序代码命令间的空格没有意义 (4)不像C,Fortran不使用 (5)数据类型多出了复数和逻辑判断类型。比如复数类型complex : a!声明复数的方法。复数显然方便了科学计算,满足了工程方面需求a=(1.0,2.0)! a=1+i (6)多出了乘幂运算(*)。乘幂除了整数还可以是实数形式。如开方,开立方a=4.0*0.5,a=8.0*(1.0/3.0)。 (7)数组有一些整体操作的功能;可以方便的对部分元素进行操作 (8)有些情况下可以声明大小待定的数组,很实用的功能4、Fortran 的基本程序结构先看一看所谓的Hello Fortran程序。program main!程序开始,main是program的名字,完全自定义write(*,*) Hello!主程序stop!终止程序end programmain!end用于封装代码,表示代码编写完毕。 中的内容可省略,下同。再看一段实用一些的程序,好有点感性认识。程序用于计算圆柱的表面积,要求输入底面 半径和。其中展示了Fortran的一些特色用法。程序摘自维基。其实是一个叫的网上引的维基的网页。推荐去看看!能查到不少有意思的东西。program cylinder!给主函数起个名字! Calculate the area of a cylinder.! Declare variables and constants.! constants=pi! variables=radius squared and heightimplicit none! Require all variables to be explicitly declared !这个一般都是要写上的。下面会进一步说明。integer : ierrcharacter : ynreal : radius, height, areareal, parameter : pi = 3.1415926536!这是常量的声明方法interactive_loop: do!do循环,Fortran 中的循环可以加标签,如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) thenwrite(*,*) 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) to the screen.write (*,(1x,a7,f6.2,5x,a7,f6.2,5x,a5,f6.2) &!&表示续行。这里还显示了格式化输出radius=,radius,height=,height,area=,area yn = yn_loop: do!内嵌的另一个do循环write(*,*) Perform another calculation? ynread(*,(a1) ynif (yn=y .or. yn=Y)exit yn_loopif (yn=n .or. yn=N .or. yn= )exit interactive_loopend do yn_loop!结束内嵌do循环end do interactive_loop end program cylinderFortran 程序的主要结构就是这样了。一般还会有些module的部分在主函数前,函数在主函 数后。三、数据类型及基本输入输出1、数据类型,声明及赋初值(1)integer: 短整型kind=2, 长整型kind=4integer(kind=2) : a=3如果声明成integer: a,则默认为长整型。 !: 在声明并同时赋初值时必须要写上;类型名后面有形容词时也必须保留:;其他情况可略去 !所谓形容词,可以看一下这个。比如声明常数real,parameter : pi=3.1415926。parameter就是形容词。(2)real:单精度kind=4(默认),双精度kind=8real(kind=8) : a=3.0还有指数的形式,如1E10为单精度,1D10为双精度(3)complex 单精度和双精度complex(kind=4) b(4)charactercharacter(len=10) c!len为最大长度(5)logicallogical*2 : d=.ture.(等价于logical(2):d=.ture.)(6)自定义类型type:类似于C中的structFortran 77中给变量赋初值常用DATA命令,可同时给多个变量赋初值data a,b,string /1, 2.0, fortran/与C不同的是,Fortran 中变量不声明也能使用,即有默认类型(跟implicit命令有关)。按照默认的定,以i,j,k,l,m,n开头的变量被定义为integer,其余为real。取消该设置需在程序声明部分之前implicit none。彭国伦建议一般都使用该语句。另一点关于声明的不同是Fortran有等价声明:integer a,b equivalence(a,b)使得a,b使用同一块内存。这样可以节省内存;有时可精简代码。如:equivalence(很长名字的变量如三维数组的某个元素,a),之后使用a来编写程序就简洁多了。2、基本输入输出输入:read(*,*) a!从键盘读入输出:write(*,*) text!在屏幕上输出。Fortran 77用 text。Fortan 90中一般 和 都可print *,text!只能用于屏幕输出 (*,*)完整写为(unit=*,fmt=*)。其中unit为输入/输出位置,如屏幕,文件等;fmt为 格式。如这两项都写成*,则按默认的方式进行,即上面描述的。print后面的*表示按默认格式输 出。四、流程控制1、运算符(1)逻辑运算符= /= = = !Fortran 90用法.EQ. .NE. .GT. .GE. .LT. .LE. !Fortran 77用法(2)涉及相互关系的集合运算符.AND. .OR. .NOT. .EQV. .NEQV. ! 仅.NOT.连接一个表达式,其余左右两边都要有表达式(可以是logical类型的变量) !.EQV.:当两边逻辑运算值相同时为真, .NEQV.:当两边逻辑运算值不同时为真2、IF(1) 基本 :if(逻辑判断式) thenend if如果then后面只有一句,可写为if(逻辑判断式) !then和end if可省略(2) 多重判断:if(条件1) thenelse if(条件2)thenelse if (条件3)thenelseend if(3) 嵌套:if(逻辑判断式) thenif(逻辑判断式) thenif(逻辑判断式) thenelse if(逻辑判断式) thenelseend ifend ifend if(4) 算术判断:program exampleimplicit nonereal cwrite (*,*) input a numberread (*,*) cif(c) 10,20,30!10,20和30为行代码,根据c小于/等于/大于0,执行10/20/30行的程10 write (*,*) Agoto 40!goto可实现跳到任意前面或后面的行代码处,但用多了破坏程序结20 write (*,*) Bgoto 4030 write (*,*) Cgoto 4040 stopend3、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 case4、PAUSE, CONTINUEpause暂停程序执行,按enter可继续执行continue貌似没什么用处,可用作封装程序的标志五、循环1、DOdo counter=初值, 终值, 增/减量!counter的值从初值到终值按增/减量变,!counter每取一个值对应着一次循环。增/减量不写则认为1!循环主体也没有必要用end doFortran 77中不是用end do来终止,而是下面这样子:do 循环最后一行的行代码 counter=初值, 终值, 增/减量行代码 !这是do的最后一行2、DO WHILEdo while(逻辑运算)end do类似于C中的while(逻辑运算) 。 一开始那个计算圆柱表面积的程序中,应该也算是这一类。不过它是通过内部的if语句来 控制循。看来也是可以的,不过在这本书上没看到这样写。其实应该也可以归于下面这种。3、没看到和C里面的dowhile(逻辑运算); 相对应的循环语句,不过可以这样,保证至少做一循环:do while(.ture.)if(逻辑运算)exit!exit就好比C里面的break。C里的continue在Fortran里是cycleend do4、Fortran的一个特色:带署名的循环 可以这样,不易出错:outer: do i=1,3inner: do j=1,3end do innerend do outer还可以这样,很方便:loop 1: do i=1,3loop2: do j=1,3if(i=3)exit loop1!exit终止整个循环loop1if(j=2)cycle loop2!cycle跳出loop2的本次循环,进行loop2的下次循环write(*,*) i,jend do loop2end do loop1还有一些循环主要用于Fortran中的数组运算,为Fortran特有,很实用。六、数组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)!配置内存空间之后该数组和通过一般方法声明的数组完全相同。 与C不同,Fortran索引值默认为从1开始,而且可以在声明时改变该规则:integer a(-3:1)! 索引值为-3,-2,-1,0,1integer 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,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 idata (a(i),i=2,4)/2,3,4/!(a(i),i=2,4)表示i从2到4循环,增量为默认值1 还可以这样:integer iinteger : a(5)=(/1,(2,i=2,4),5/)!五个元素分别赋值为1,2,2,2,5integer : 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!所有元素赋值为5a=(/1,2,3/)!这里假设a为一维,a(1)=1,a(2)=2,a(3)=3a=b!对应元素赋值,要求a,b,c维数和大小相同,下同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)=5a(1:5:2)=3!a(1)=3,a(3)=3,a(5)=3a(3:)=5!a(3)以及之后的所有元素赋值为5a(1:3)=b(4:6)!类似于这种的要求左右数组元素个数相同a(:)=b(:,2)!a(1)=b(1,2),a(2)=b(2,2),以此类推6、WHEREwhere形式上类似于if,但只用于设置数组。设有两个同样类型、维数和大小的数组a,bwhere(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:5,a(i,j)/=0) a(i,j)=1/a(i,j)forall也可以嵌套使用,好比C中for循环的嵌套。七、函数Fortran中函数分两类:子程序(subroutine)和自定义函数(function)。自定义函数本 质上就是学上的函数,一般要传递自变量给自定义函数,返回函数值。子程序不一定是这样,可 以没有返值。传递参数要注意类型的对应,这跟C是一样的。1、子程序目的:把某一段经常使用的有特定功能的程序独立出来,可以方便调用。 习惯上一般都把子程序放在主程序结束之后。形式:subroutine name (parameter1, parameter2)!给子程序起一个有意义的名字。可以传递参数,这样可以有返回值。括号内也可以 空着,代不传递参数。implicit noneinteger: parameter1, parameter2!需要定义一下接收参数的类型。!接下来的程序编写跟主程序没有任何别。return!跟C不同,这里表示子程序执行后回到调用它的地方继续执行下面的程序。不一定放在最后。可以放在子程序的其他位置,作用相同;子程序中return之后的部分不执行。end subroutine name调用:使用call命令直接使用,不需要声明。在调用处写:call subroutine name(parameter1,parameter2)注意点:a.子程序之间也可相互调用。直接调用就是了,像在主程序中调用子程序一样。b.传递参数的原理和C中不同。Fortran 里是传址调用(call by address/reference),就是传递时用参数和子程序中接收时用的参数使用同一个地址,尽管命名可以不同。这样如果子程序的执行改子程序中接收参数的值,所传递的参数也相应发生变化。c.子程序各自内部定义的变量具有独立性,类似于C。各自的行代码也具有独立性。因此各个子程序主程序中有相同的变量名、行代码号,并不会相互影响。2、自定义函数和子程序的明显不同在于:需要在主程序中声明之后才能使用。调用方式也有差别。另外按照惯例用函数不去改变自变量的值。如果要改变传递参数的值,习惯上用子程序来做。声明方式:real, external : function_name一般自定义函数也是放在主程序之后。形式:function function_name(parameter1, parameter2)implicit none real: parameter1, parameter2!声明函数参数类型,这是必需的real:function_name!声明函数返回值类型,这是必需的function_name=.!返回值的表达式returnend也可以这样直接声明返回值类型,简洁些:real function function_name(parameter1, parameter2)implicit nonereal: parameter1, parameter2!这个还是必需的function_name=.!返回值表达式returnend调用:function_name(parameter1,parameter2)不需要call命令。 自定义函数可以相互调用。调用时也需要事先声明。 总之,调用自定义函数前需要做声明,调用子程序则不需要。3、关于函数中的变量(1)注意类型的对应。Fortran 中甚至可以传递数值常量,但只有跟函数定义的参数类型 对应才会到想要的结果。如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)在函数中,如果数组是接收用的参数,则在声明时可以用变量赋值它的大小,甚至可 以不指定小。例如:subroutine Array(num,size)implicit noneinteger: size integer num(size)!可以定义一个数组,其大小是通过传递过来的参数决定的。这很实用returnend(5)save命令:将函数中的变量值在调用之后保留下来,下次调用此函数时该变量的值就 是上次保的值。只要在定义时加上save就行:integer, save : a=1(6)传递函数(包括自定义函数、库函数、子程序都是可以的)。类似于C中的函数指针需要在 主程序和调用函数的函数中都声明作为参数传递的函数。如real, external : function!自定义函数real, intrinsic : sin!库函数external sub!子程序(7)函数使用接口(interface):一段程序模块。以下情况必需: a.函数返回值为数组 b.指定参数位置来传递参数时 c.所调用的函数参数个数不固定 d.输入指标参数时 e.函数返回值为指针时。 具体用法结合例子容易看懂。例子都很长。看书吧。4、全局变量功能就不用说了。原理:根据声明时的相对位置关系而取用,不同与C中根据变量名使用。如果在主程序中定义:integer : a,bcommon a,b!就是这样定义全局变量的在子程序或自定义函数中定义: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,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论