《FORTRAN95语法速查.doc》由会员分享,可在线阅读,更多相关《FORTRAN95语法速查.doc(64页珍藏版)》请在三一办公上搜索。
1、FORTRAN 95 语法速查-白云、李学哲、陈国新、贾波 编著FORTRAN95程序设计读书笔记 目录: 一、应用程序的创建与运行/FORTRAN 95所用的字符 / 变量类型及其声明,常量声明 /表达式与运算符 二、输入与输出:表控、有格式 三、选择语句与结构:IF语句、CASE结构 四、 DO循环结构 五、 数组:数组的声明,数组的引用,数组的算术运算,数组的输入、输出,给数组赋初值,动态数组,WHERE、FORALL语句 六、子程序:语句函数,内部子程序,调用子程序时的虚实结合:形参为数组、非定界数组、子程序名、星号,递归子程序,外部子程序,纯子程序,逐元子程序 七、派生数据类型与结构
2、体 八、指针与动态链表 九、文件:存取方式,基本操作语句,各类文件的读写操作十、接口、模块 十一、公用区、存储关联、数据块子程序 十二、绘图:坐标系、设置图形颜色 、创建图形程序 / 常用过程:设置线型、绘一像素点、设置当前位置、绘直线、绘弧线、绘矩形、绘多边形、绘制扇形(圆、椭圆) / 文字信息的显示附/录:标准函数与标准子例行程序一、 基础部份1-1 FORTRAN 95 应用程序的创建与运行 创建或运行FORTRAN 95程序必须在Microsoft Developer Studio平台上进行。尽管程序文本及相关文件的编辑可以在任一文本编辑器上进行,然后再拷到Studio的文档窗口中。但
3、最好还是一开始就进入Studio环境。创建FORTRAN 95 程序的步骤大致如下:1) 启动Microsoft Developer Studio 可以通过不同方式运行dfdev.exe程序以启动Microsoft Developer Studio 开始 Compaq Visual Fortran 6 Developer Studio dfdev.exe:或 CVF66 VB.comMSDEV98dfdev.exeMicrosoft Developer Studio的界面如下图所示:工作空间窗口文档窗口输出窗口2) 建立工作空间(WorkSpace) 工作空间(WorkSpace)对应着win
4、dows资源管理器的一个文件夹。 从菜单栏 “File”“New” 在弹出的“New”窗口选“WorkSpace”卡,在“Location”栏指定保存工作空间的位置(即工作空间的上一层文件夹);在“WorkSpace Name”栏指定工作空间名称。 建立完工作空间即生成工作空间文件 *.dsw3) 建立项目(Project) 项目是工作空间的下一层文件夹,一个项目只能保存一个主程序及其可执行文件(.exe文件)以及相应的若干辅助文件,如外部子程序、数据文件、说明文件等。 从菜单栏 “File”“New” 在弹出的“New”窗口选“Project”卡,在列表中选“Fortran Console
5、Application(Fortran 应用程序)”;填写Project Name(项目名称,即文件夹名) 与 “Location”(默认为工作空间);选取单选钮“Add to current WorkSpace”(将该项目添加到当前工作空间) 建立完项目即生成项目文件 *.dsp4) 编辑程序文本 无论是程序的源文件还是如数据文件或说明文件等相关的文本虽然可以在任一文本编辑器中进行编辑,但最好是在这个Studio平台上编辑。 从菜单栏 “File”“New” 在弹出的“New”窗口选“Files”卡。在列表中选“fortran Free Format Source File(Fortran
6、自由格式源文件)”。钩选“Add to project”;在“File”栏填入文件名;在“Location”栏默认是项目地址。 Fortran 95的源文件扩展名为 .f90。u 若是编辑数据文件或说明文件则可在“New”窗口的“Files”卡的列表中选“Text File”,或者在“New”窗口选“Other Documents”卡建立其他类型的文档。5) 编译、连接生成可执行文件(.exe文件) 源程序文件编辑完成后要进行编译,此时系统将对源程序进行语法检查,若有错误将在输出栏显示相关信息,此时可按功能键F4还可提供更详细的信息。编译通过后即生成后缀为.obj的目标文件。当本项目所有的程序
7、都通过编译后即可进行连接生成可执行文件(.exe)。进行编译、连接、执行的指令可通过下表所列方法发出:编译连接执行通过菜单Build-Compile BuildExecute击工具栏按钮(Compile)(Build)(Execute Program)使用功能键Ctrl+F7F7Ctrl+F51-2 FORTRAN 95所用的字符: FORTRAN 95中使用的英文字母除字符串外,均不区分大小写。所有名称均须用英文字母起头,后面可跟着总数不超过31个字符的英文字母、数字、下划线。关键字也可以作为变量、数组、函数、程序等实体的名称。一个命令行允许编写132个字符,可以书写多条语句,各语句间以分号
8、;分隔。长语句可以分行,以&为续行符。前导行的末尾必须有&号,后续行行首可以有&号也可以没有。!为注释符,可以出现在一行的任意位置。注释符后的所有字符都是注释文本,注释文本可以包括汉字在内的任何字符。u 本文中语法说明所用的符号:符号说明必须填入尖括号中指定的相应内容可以填入也可以不填入在方括号中指定的内容选项1 | 选项2 | 选项3 |可以有选择地填入某一选项可重复地按花括号中指定格式填入相应内容1-3 变量类型及其声明变量未经声明即认为遵从I-N规则,即:以变量名以字母I、J、K、L、M、N开头的均默认为4字节整型变量,其他的为4字节实型变量。下面的隐式声明语句将取消I-N规则:IMPL
9、ICIT NONE1) 隐式声明语句: IMPLICIT =(,|-),(,|-)=Integer|Real|Logical|Complex|Characteru 圆括号(、)本身为语法成分,方括号对为可选项,花括号对为可重复的可选项。 例: implicit real(a,s,i-k),integer(p,q,r),character(c) 定义了以a,s,i,j,k为首字母的变量为单精实型;以p,q,r为首字母的变量为4字节整型;以c为首字母的变量为字符型。u 隐式声明语句应放在所有声明语句及可执行语句之前。2)显式声明语句 ,变量名 例: real name1,name2; real*8
10、 res1 声明 name1、name2 为单精(4字节)实型变量, res1为双精(8字节)实型变量。u 显式声明语句的优先级高于隐式声明。3) 整型变量Integer (n)|(kind=n)| *n : nkind值 = =,=Kind取值:1,2,4,8,缺省值为4。u 有双冒号:的声明语句可同时进行赋值,否则不能进行赋值。 例: integer*4:c1, c2, b1=89, b2=75表:整型变量的存储开销及取值范围Kin值字节数取值范围11有符号 128127 ;无符号 025822有符号 3276832767; 无符号 06553544有符号 2147483648214748
11、3647 无符号0429496729588有符号 92233720368547758089223372036854775807 4) 实型变量 REAL (n)|(kind=n)| *n : nkind值 = =,=Kind取值:4,8,缺省值为4。Kind=4为单精度;kind=8为双精度。表:实型变量的存储开销及取值范围Kin值字节数取值范围精度44-3.40282347E+38 -1.17549435E-38, 0, +1.17549435E-38 +3.40282347E+387位有效数字88-1.7976931348623158D+308 -2.2250738585072013D-3
12、08, 0,+2.2250738585072013D-308 +1.7976931348623158D+30815位有效数字5) 复型变量复数虚、实部要用一对圆括号括起来。表示为:(,)。声明复型变量的语法为:COMPLEX (n)|(kind=n) : nkind值 = =,=Kind取值:4,8,缺省值为4。Kind=4为单精度,单精复数占用8字节;kind=8为双精度,双精复数占用16字节。例: complex*4:cox=(38.8745, -8563.98) , ca6) 字符型变量CHARACTER (k)|(len=k)| *k : k字符串长度,默认为1=*k= 字符串 例:
13、character*4 a,b,c*6 定义了a,b两个字符变量的长度为4, C的长度为6character*4:a,b=hd7g,c*6 对变量b进行了赋值。 7) 逻辑型变量 LOGICAL (n)|(kind=n) : nkind值,可取1,2,4,8,默认为4。 逻辑型变量的取值范围只有.TRUE. 与.FALSE. 两个值。.TRUE. 等价于-1;.FALSE.等价于0。已定义的逻辑变量其默认值为.FALSE.。1-4 常量的声明: 常量有整型、实型、复型、字符型、逻辑型。常量的类型像变量一样,可以隐式声明或显式声明。1-4-1 显式声明 ,PARAMETER:= , = 例: i
14、nteger,parameter: a=2, b=3 logical,parameter: L1=.True., L2=.false.1-4-2 隐式声明 PARAMETER =,=例: parameter pi = 3.1415926, num=861-5 表达式与运算符 返回目录1-5-1 算术表达式与运算符算术运算符及其优先级运算符功能优先级结合规则*幂1(高)右结合*,/乘、除2左结合单目 +,3无结合规则双目 +,加、减4(低)左结合u 当运算式中含有不同类型或KIND值的操作数时,低KIND值或低级类型的操作数要转换为高级的。其结果也是高级类型及相应的高KIND值的。在赋值时,若左
15、侧变量与右侧表达式的类型不同,则先将表达式值转换为左侧变量的类型,再赋值给左侧的变量。实型数截去小数转换为整型数。1-5-2 字符表达式与运算符 求子串操作符:(I:j) 截取从第I 个字符到第 j个字符的子串 。i,j为整型表达式。 连接操作符: / 1-5-3 关系表达式运算符运算符.LT. 或 .LE. 或 =.GT. 或 功能小于小于或等于等于不等大于或等于大于操作数类型实、整、字符实、整、字符实、整、复、字符实、整、复、字符实、整、字符实、整、字符1-5-4 逻辑表达式与运算符 .not.(非,单目) .and.(与).or.(或) .xor.(异或) .eqv. (相等).neqv
16、.(不等)表:逻辑运算符的功能ab.not. aa.and.ba.or.ba.xor.ba.eqv.ba.neqv.b.true.true.false.true.true.false.true.false.true.false.false.false.true.true.false.true.false.true.true.false.true.true.false.true.false.false.true.false.false.false.true.false.表:逻辑运算符的优先级与结合规则优先级逻辑运算符结合规则1 (高).not.单目,无结合规则2.and.左结合3.or.左结合4
17、.xor.左结合4.eqv.左结合4 (低).neqv.左结合 返回目录 二、 输出与输入语句 返回目录 2-1 表控输入输出语句表控输入: READ* , 输入项列表中各项以逗号分隔。输入数据可以逗号或空格分隔,或以回车换行分隔。使用*号可重复输入,如:3*27.8等同于:27.8,27.8,27.8。这种规则适用于任何类型的数据。 表控输出:PRINT* , 输出的数据之间有一个空格分隔。但字符串前不出现空格。整型数的输出域宽与KIND值的关系:KIND值域宽(N个字符宽度)14 26411821实型数的输出域宽KIND值域宽(N个字符宽度)4 (单精)14(其中指数部分占4个字符宽度)8
18、 (双精)23(其中指数部分占5个字符宽度)复型数输出的格式是用一对圆括号将实部与虚部括起来,实、虚部以逗号相隔。其域宽也与KIND值有关。2-2 有格式输入输出2-2-1 FORMAT语句: Format 格式说明表:(格式编辑符,格式编辑符)2-2-2 有格式输入: read , | read(*,格式语句标号) | read , | read (*, )2-2-3 有格式输出: print , | write(*,格式语句标号) | print , | write(*, )例: write(*,(2x, I4,2x,2f12.4) N1,R1,R2; read(*,(3i2)I,J,K表
19、: 数据输入输出用的可重复编辑符(数据编辑符)格式名称说明r Iw.m整型编辑符r重复系数,W域宽(下同),m输出数据的最少显示位数,不包括负号所占位置。rFw.d小数型实型编辑符d-小数位数(下同),域宽w中包括小数点与负号。若输入数据自带小数点,则在域宽内按实际实数读取,此时d失效rEw.dEe指数型实型编辑符域宽w中包括小数点、正负号、字母E及指数。e指数位数,默认2。单精正实数应有Wd+5;负实数应有Wd+6rDw.d双精实型编辑符rENw.dEe工程计数法编辑符rESw.dEe科学计数法编辑符rAw字符型编辑符若缺省w则域宽自动等于输入输出项的长度rLw逻辑型编辑符W默认为2。输入
20、.true. 时须w5;输入 .false. 须w6rGw.dEe通用编辑符将任意类型数据按指定域宽输入/输出u 复数有格式输入输出是通过两个实型编辑符实现。输出时首尾没有圆括号,实、虚部间以一空格分隔。u 逻辑值输出为T或F。输入多个逻辑值时用逗号分隔,不可用空格分隔。u 用A编辑符读入字符时,不要加定界符。否则把定界符也认为是要输入的字符。表:不可重复编辑符(控制编辑符)格 式名 称说 明,“”字符串编辑符将字符串输出nHH编辑符将H后的n个字符输出Tn,TLn,TRn位置编辑符分别是将读数指针移到输入数据行的第n列,指针左移n列,右移n列nX编辑符输入时将指针移过n列,输出时输出n个空格
21、/斜杠编辑符在输入或输出时终止本记录,定位到下一条记录的开头,$反斜杠,$ 编辑符输出时使用的续行符,遇到此符不回车换行,在原行继续输出。kP比例因子编辑符与F、D或E格式连用,将数据以10 - k读入,或以 10 k输出。k为+/ 整数。如read(2P3F8.2)a,b,c 对整型数无效:冒号编辑符当没有输出项时结束格式输出 三、 选择语句与结构 返回目录3-1 IF语句 3-1-1 简单IF语句: IF() 3-1-2 块IF语句: IF()THEN ELSE END IF 3-1-3 多分支IF语句: IF()THEN ELSE IF()THEN ELSE IF()THEN ELSE
22、END IF3-2 CASE 选择结构 SELECT CASE() CASE () . CASE () CASE DEFAULT END SELECT测试表达式结果与目标值i匹配时就执行该语句体,否则执行DEFAULT下的语句体。在CASE结构中: 必须是整型或逻辑型或CHARACTER*1的字符型表达式。 与类型一致的有限个常量集,元素间以逗号分隔,如(A,E,D);也以是用冒号与上下界给定的范围,如(5:10)。若省略下界则默认为匹配所有小于或等于上界的值;省略上界则匹配所有大于或等于下界的值。若值是字符,则按ASCII顺序给定上下界,如(X:d)。是逻辑型时不能指定值的范围。在CASE结
23、构中不能从一个CASE段跳转到另一个CASE段。在FORTRAN中所有结构均可嵌套使用。但不能从块外分支进入,而可以从块内分支出转到块外。 四、 DO循环结构 返回目录4-1 无条件循环结构 : DO END DO u 这类循环结构的循环体中应有判断语句,通过EXIT或GOTO语句结束循环。4-2 计数型DO循环 : DO END DO u 缺省步长默认为1。u 中可包含EXIT,CYCLE语句。EXIT强迫终止循环,转向END DO后的第一条语句。CYCLE语句结束当前的循环并开始下一次循环。4-3 条件型DO循环 : DO WHILE () END DO u 只能是关系表达式或逻辑表达式。
24、表达式为真时执行循环,为假时转向END DO后的第一条语句。 4-4 给DO语句添加标记 在DO语句前可以添加标记或在关键词DO后添加语句标号。即 DO END DO 或 DO ENDDO例: ASD: DO I=1,20 END DO ASD或: DO 100 I=1,8 100 END DO 五、 数组 返回目录5-1 数组的声明: 数组须经声明其类型与维数方可使用。5-1-1 用类型声明语句: 类型声明语句为: :=*N | (N) ; = () = ,() = = :,: = (/值1,值2,/)u N为KIND值,若省略则使用该类型的默认值。u 若要对数组赋初值,则必须使用:符。u
25、维说明表中缺省下界默认为1。若有任一维的下界大于上界则该数组大小为0。 例: real (4) :A(2,3)=(/2.2, 4.2, 9.5, 8.7, 6.2, 7.9 /) 5-1-2 用DIMENSION语句声明数组 DIMENSION = () ,() = : ,: u DIMENSION语句中不能有:符号,不能给数组赋初值。u 用DIMENSION语句声明的数组,其类型可按隐含规则(I-N规则)确定,也可用显式声明其类型,但显式声明语句应在DIMENSION语句之前。如: Real (8) NUM,SUM DIMENSION NUM(2,3),SUM(2:8) 5-1-3 联合使用
26、类型声明语句与DIMENSION属性声明数组 ,DIMENSION () : = : ,: = =,=u 数组声明表中的数组若自带维声明,则按自带声明的维数与上下界,否则按DIMENSION属性给出的维说明。 例: Integer, demension(2,3)::num=(/1,2,3,10,20,30/) ! 对数组NUM赋初值 real, dimension (3):A1,A2,A3(3,6) !A1,A2为一维数组,A3为二维数组 integer, dimension(3,4): A,B ! 声明A,B为二维数组5-2 数组的引用 1)访问整个数组,用数组名。如 A=3.5 ! 将3.
27、5赋值给数组A的所有元素。 Print*,A= , A !显示数组A的全部元素。 2)访问数组元素,须指定下标,或下标范围: (, Num = A(2,3)+A(1,3) ! 将数组元素A23与A13之和赋值给Numu 下标一般是整型数,若给了实型数则系统自动取整(截断取整)。 3) 访问一组连续的数组元素片段,可给出下标的范围: (, = |:u 缺省下界表达式则默认取本维的下界;缺省上界表达式则默认取本维的上界。也可以上、下界表达式都缺省,则默认为包含该维从下界到上界的全部元素。 如: A(1,1:3)= 6.5 !将6.5赋值给A11,A12,A13 A (2,:)= 8 !将 8赋值给
28、数组A的第二行所有元素。u 上/下界表达式可以是整型或实型,若为实型则表达式自动取整。 4)访问一组或有规则间隔的元素可给出下标的范围及步长::(, = |:u 缺省步长,默认为1。u 缺省上/下界表达式,取本维的上/下界 。如: A(1,1:3:2) = 8.2 !将8.2赋值给A11与A13。u 下标越界会产生不可预知的错误。为避免发生此类错误,可使用检测函数: UBOUND(,dim=) ! 给出数组相应维的下标上界LBOUND(,dim=) ! 给出数组相应维的下标下界u 若缺省维的序号,则给出的一维整型数组依次为各维下标的上/下界。5-3 数组的算术运算 算术运算符 、/ 、* 也适
29、用于数组。其功能是对同形数组的对应元素进行相应运算。如:对于数组A(m,n)与B(m,n),语句 A = A / B 等同于: do i = 1,m ; do j = 1,n A(i,j) = A(i,j) / B(i,j) enddo ; enddo5-4 数组的输入 / 输出 1)使用数组名输入 / 输出 read*, A ! 输入A数组 print*, A !输出A数组或 WRITE (*,() A WRITE (*,) A 数组的逻辑结构是数据表,一维数组是一行,多维数组是多层的数据表。而数组在计算机中的存储结构是连续分布的一串存储单元,是一维线性表。数据的存储顺序是以列为主,按列从上
30、到下,从左到右,从第一层到最后层。使用数组名输入 / 输出就是按数组的存储结构顺序输入/ 输出。第一个元素是第一层表的第一列第一行,第二个元素是第一层表的第一列第二行,然后是第二列第一行、第二行,再后是第二层表的第一列第一行、第二行,第二列第一行、第二行。例5-3: 矩阵对READ*,A 语句的输入顺序应是: 1,5,9,2,6,10, 3,7,11 ,4,8,12用PRINT*,A语句输出的结果也是: 1,5,9,2,6,10, 3,7,11 ,4,8,122)使用DO循环语句输入/ 输出数组: 使用循环语句输入/输出,可以实现以行为主或以列为主的顺序。下面为用DO语句输入: DO J =
31、1,4 DO I =1,3 READ*, A(I,J) END DO END DO执行时,以列为主输入,顺序为:1,5,9,2,6,10, 3,7,11 ,4,8,12 (逗号处回车换行)若要以行为主输入,则上列程序段应改为:DO I = 1,3 DO J =1,4 READ*, A(I,J) END DO END DO执行时,以行为主的输入,顺序为:1,2,3,4,5,6,7,8,9,10,11,12(逗号处回车换行)输出时,若要保持原矩阵排列的形式,其程序段为: DO I = 1,3 DO J =1,4 WRITE(*,(2x,I2,2x,) A(I,J) END DOWRITE (*,*
32、) END DO若要将A转置,则其程序段为:DO J = 1,4 DO I = 1,3 WRITE(*,(2x,I2,2X,) A(I,J) END DO WRITE (*,*) END DO3)使用隐DO循环输入 / 输出数组隐DO循环输入 / 输出的语法格式为: (,=,)u 输入项可以是数组元素或普通变量;但不能是常数、函数或表达式。但输出项则除了数组元素外还可以是普通变量、常数、函数或表达式。u 缺省步长默认为1。如:对前面的A数组,对其输入的语句为: Read*, (A(I,J), j = 1,4), i = 1, 3 )执行时,按行输入数据。与使用DO循环语句输入时不同的是,不是键
33、入一个数据就回车换行,而是可以一行输入多个数据。应输入的全部数据可以一行输入,也可以任意分成多行输入。若要按列输入数据,则上述语句应改为:Read*, (A(I,J), i = 1,3),j = 1, 4 )输出A矩阵的隐DO循环语句是:Write (*,(4(2x,I2,2x) (A(i,j),j=1,4),i=1,3)以下输出其转置矩阵Write (*,(3(2x,I2,2x) (A(i,j),i=1,3),j=1,4)5-5 给数组赋初值 返回目录 数组在未经赋值前其各元素均为0。 1)使用数组名 若对数组所有元素赋以相同的值,可用数组名。如: real A(1:8) A=5.6 ! 将
34、5.6赋给A的所有8 个元素2) 通过数组构造器 对于一维数组: = (/)=例: integer ARR1(6)ARR1 =(/ 1,2,3,4,5,6 /) !对数组arr1赋初值 对于多维数组,须使用标准函数RESHAPE将一维的数据转换为多维的。 例:ijnteger A (3,4) A=RESHAPE(/1,2,3,4,5,6,7,8,9,10,11,12/),(/3,4/) 运行时,数组A按存储结构顺序读入数据,分配给各元素,结果是: 1 4 7 10 2 5 8 11 3 5 9 12u 数组构造器也适用于给数组片段赋初值。如对前例的A数组的第二行赋值,可作: A(2,:)=(/5,6,7,8 / ) 则A数组成为: 1 4 7 10 2 2 2 2 3 5 9 12 3) 通过DATA语句对数组赋初值 DATA语句可以对变量、数组、数组片段、数组元素赋初值 其语法格式为: DATA