1、淘汰了所有转移语句,增加了新的控制结构,使程序结构化。
增加了结构块,模块及过程的调用灵活形式。
2、加强数组的算法功能。
提出超载概念与实现方法。
提高了文字处理功能。
3、更接近自然语言与公式演算。
允许在字符数据用选取不同种别。
特别:
语句书写对列的要求放宽:一般一行写一条语句(也可也多个语句,用“;”分隔),没有标号区、续行区、正文区的区别。一行最多为132列,可以在任何列处中断语句,中断处写一个“&”,随后在下一行任意列处继续。一个语句最长不能超过20个字符。语句结尾不可有标号、符号。
注释以“!”开始,可以位于任何位置。
***以下只讨论与FORTRAN77不相同处。
第一章 FORTRAN90的基本语句
第一节 类型说明语句
1、变量名全长不得超过31个字符。
2、变量类型定义:
INTEGER::X,Y
REAL::A
COMPLEX::B,C,D
3、建议淘汰隐式说明,在程序说明部分一开始就写:
IMPLICIT NONE
向系统声明不使用隐式说明。
4、可以在变量说明时就置初值。如:
REAL::X=1.1,Y,Z=2.2
5、种别——决定变量的精度和所占内存单元数。
a.如:REAL(KIND=2)::X 说明变量X为REAL型,种别为2。KIND是种别说明关键字。如没有种别说明,则采用系统省缺值。
b.有关函数:KIND(X) 返回X的种别参数。当X取常数0时,返回省缺种别参数。如KIND(0)、KIND(0.0)、KIND(.FALSE.)、KIND('A')分别 返回整型、实型、逻辑型、字符型的省缺种别参数。
SELECTED_REAL_KIND(N,M) 返回种别参数,使之满足十进制有效位为N, 值范围在10**(-M)和10**M之间的实数。
SELECTED_INT_KIND(N,M) 与上类似,选择整型类别。
c.常数类别表示
对数值型常数、逻辑型常数用后缀法,即在常数后加一下划线,再跟种别参数。如31_2。
对字符型常数,用前缀法,即把种别参数放在前,再加下划线,再跟字符常数。如5_'abc'。
6、属性
a.常数名属性。如:INTEGER,PARAMETER::Y=12 说明Y为常数,在
程序中不能改变其值。
b.数组属性。如:INTEGER(KIND=2),DIMENSION(-3:10)::X 说明X
是数组(-3:10)。
c.意图属性。只用于子程序中。如:
INTEGER.INTENT(IN)::X 说明X用来传入。
INTEGER.INTENT(OUT)::X 说明X用来传出。
INTEGER.INTENT(INOUT)::X 说明X先传入值,再传出。
d.没有属性的只是基本变量。
第二节 赋值语句
1、赋值时,自动进行类型、种别转换。对逻辑型、字符型要求类型
一致。字符型要求种别一致。
2、复型常数形式:(a,b)。
3、类型转换函数:
INT(X), INT(X,KIND),
REAL(X), REAL(X,KIND),
CMPLX(X,Y), CMPLX(X,Y,KIND)。
4、对数组所作的基本函数操作相当于对数组内每个元素施加该操作。
5、不同种别参数的数据运算时,结果取决精度或允许值范围较大的
那个种别参数。
第三节 读写语句
1、读语句
READ 格式说明,输入表
READ *,输入表
READ (通道号,*)输入表
带控制信息的读语句:
READ (说明符1,说明符,...,2说明符n)输入表
说明符共有10个,一般形式为:关键字=指定参数。
a. UNIT=通道号:通道号为整型常数或变量,也可以用*代替当前
设备。“UNIT=”可省。
b. FMT='(格式说明)':“FMT=”可省。
c. IOSTAT=整型变量:可选,用于指明输入输出时的状态。如输入
正常,则变量值为零;如出错,为正整数;如遇文件结束无数可
读,为负整数。
2、写语句
WRITE (部件号,格式说明)输出表
PRINT 格式说明,输出表
PRINT *,输出表
WRITE (说明符1,说明符2,...,说明符n)输出表
3、表控格式
a.输入复数时要加括号。
b.当需要输入几个连续无效值时,可输入r*,r是重复系数。若某
个数以后的所有数都无效,可用/表示。如:
2.1,2*,5.1
2.1,3.1/
c.输出时一般每个数占16列,靠右对齐,左补空格。
第二章 选择结构
第一节 IF语句
IF (条件) 语句
关系操作符: >,>=,<,<=,==,/=。
逻辑操作符:.AND. , .OR. , .NOT. , .EQV. , .NEQV.。
其中EQV是逻辑与或,NEQV是逻辑异或。
优先级:.NOT. > .AND. > .OR. > .EQV. .NEQV.。
第二节 选择结构
1、无名结构
IF (条件) THEN
...
ELSE
...
END IF
2、有名结构
结构名:IF (条件1) THEN
...
ELSE IF (条件2) THEN [结构名]
...
ELSE [结构名]
...
END IF 结构名
结构名的作用仅仅是为了阅读方便。
第三节 CASE结构
1、一般形式
SELECT CASE(情况表达式)
CASE(情况1)
...
CASE(情况2)
...
...
CASE DEFAULT
...
END SELECT
情况表达式是整型表达式,逻辑型表达式,或字符型表达式。
在一个CASE中,可以写多种情况,用“,”分隔。如果是连续值,
也可以用“始值:终值”表示。
情况也可以写成表达式,但取值不得重复。
如果情况表达式是字符型的,情况的种别参数必须一致。
2、有名CASE结构
结构名:SELECT CASE(情况表达式)
CASE(情况1) [结构名]
...
CASE(情况2) [结构名]
...
CASE DEFAULT [结构名]
...
END SELECT 结构名
第三章 循环结构
第一节 不带循环变量的DO循环
1、一般形式
[结构名:] DO
...
END DO [结构名]
2、出口语句——退出循环
EXIT [结构名]
3、继续循环语句——跳过剩余DO块,继续下一轮循环
CYCLE [结构名]
第二节 带循环变量的DO循环
1、一般形式
[结构名:]DO 循环变量=循环初值,循环终值,循环增值
...
END DO [结构名]
2、EXIT、CYCLE语句有效。
3、隐DO语句——只能作为输入输出的一部分出现
(I/O表列,循环变量=初值,终值,增值)
可以嵌套。
第四章 非数值型数据、数组
第一节 逻辑型数据
变量说明
LOGICAL[(KIND=整常数表达式)][,属性1,...,属性n]::实体表
第二节 字符型数据
1、字符常数
用''或""界定。引号内如有'或",则写成两个''或""。
字符常数的种别实际是字体选择,省缺为ASCII码。
2、变量说明
CHARACTER(LEN=整常数表达式[,KIND=整常数表达式])[,属性1,&
...,属性n]::实体表
a. “LEN=”和“KIND=”可以省略,此时顺序不可变。长度可以用
"*"表示暂不确定,与程序中实际需求一致。
b. 作为子程序哑元时,长度为*表示与实元一致。
c. 如变量长度不一致,还可以在实体表中用“变量名*长度”来说
明。
3、赋值时长度以赋值号左侧变量为准,不足尾部补空格,多余截去
尾部。用Aw格式输入时,w与变量定义长度相比,补尾截头。用Aw
格式输出时,补头截尾。表控输入时,补尾截尾。
4、字符函数
ICHAR(X) 字符转换为数值序号
CHAR(X[,KIND]) 数字序号转换为字符
LEN(X) 求字符串长
LEN_TRIM(X) 求字符串长,不计尾部空格
INDEX(X,Y) 在X中找Y的起始位置,无则返回零
TRIM(X) 去掉字符串尾部空格
LGE(X,Y) X>=Y?
LGT(X,Y) X>Y?
LLE(X,Y) X<=Y?
LLT(X,Y) X 第三节 数组 1、数组属性描述 DIMENSION(下界:上界,...) 下界与上界一般只能取整常数表达式,在子程序中作哑元时,维界 中允许出现变量,也可以省缺,也可以只写出下界。下界为1时可 以省略。 2、数组片段 数组名(整型表达式:整型表达式) 或 数组名(整型表达式:整型表达式:整型表达式) 第三个表达式描述的是所取元素下标的跨度,跨度为1时省略即为 前者。后者称为三元表达式。 三元表达式中,某一维也可以用一个一维整型向量代替,也可以用 一个整数代替。 3、一维数组赋值 a. 数组=(/元素值表/) b. 数组=(/隐DO表/) 如:A=(/SQRT(REAL(I)),I=1,4) C. 数组=(/已有数组片段/) 如:A=(/V(5:7)/) 赋初值时也可以放在说明语句中进行。 d. 数组=标量 置每个元素为同一个数 4、数组存储,输入输出时,第一维下标先变化。 5、相同形状数组可以直接赋值。 6、相同形状数组可以进行+,-,*,/,**,及内部函数运算,结果为对 应位置元素运算结果。数组与标量运算为每个元素与之运算。运算 结果将按维下界为1重新排列,而不在是原来的下标。 7、内部函数 SIZE(A) 求数组的大小,即元素数 MAXLOC(A) 求最大元素下标,数组返回一向量 MINLOC(A) 求最小元素下标 SUM(ARRAY[,DIM=N][,MASK=E]) 求各元素和。DIM=N是对第N维求和, MASK=E是对满足条件E的元素求和 PRODUCT(ARRAY[,DIM=N][,MASK=E]) 求各元素连积 LBOUND(A[,DIM=N]) 求维的下界 UBOUND(A[,DIM=N]) 求维的上界 SPREAD(A,DIM=N,NCOPIES=M) 拷贝第N维M次,组成一个二维数组 MERGE 把两个数组合并成一个数组 PACK 把数组汇集成秩为1的数组 UNPACK 把秩为1的数组拆成一个数组 MATMUL 把两个数组作矩阵运算 DOT——PRODUCT 求两个秩为1的数组点积 8、WHERE语句与结构——只能用于数组 a. WHERE (数组关系表达式) 数组赋值语句 对满足条件的元素位置,执行赋值语句 b. WHERE (数组关系表达式) 数组赋值语句块 ELSE WHERE 数组赋值语句块 END WHERE 9、动态数组 a. 定义 类型,DIMENSION(:),ALLOCATABLE::变量表 时改为(:,:,...,:) b. 分配语句 ALLOCATE(数组名(形状描述),...[,STAT=变量名]) 在形状描述中要指明上下界,可以有变量。如分配成功,STAT 赋零,出错则大于零。 c. 释放语句 DEALLOCATE(数组名,数组名,...[,STAT=变量名]) 第五章 过程 第一节 函数过程 FUNCTION 函数名(哑元表) RESULT(结果名) ... END FUNCTION 函数名 或简写成 END 1、哑元说明语句中,应加INTENT属性。结果值除外。 2、对递归函数,在FUNCTION前要加RECURSIVE关键字。 3、调用:FUNCTION(实元表) 4、接口块 INTERFACE 函数语句(或子例子程序语句) 过程中各哑元、变量、结果值的说明(IMPLICIT NONE不写) 函数结束语句 END INTERFACE 在INTERFACE和END INTERFACE之间可以说明多个被调过程。接口 块位于主程序最前面。 必须写接口块的场合: a.如被调过程是函数,且结果为一个数组,或一个长度不是常数、 不是*时;哑元有假定形状数组、指针变量、目标变量。 b.实元是关键字变元,或是省缺的可选变元。 c.操作符超栽,或赋值号超载。 d.用一个类属名调用过程。 第二节 子例子程序 [RECURSIVE] SUBROUTINE 过程名(哑元表) ... END [[SUBROUTINE] 过程名] 无哑元时,括号也可以省略。 调用:CALL 过程名(实元表) 第三节 关键字变元、可选择变元、哑元改名 1、关键字变元 调用时,实元表写成“哑元名=实元表达式”形式。这样,可以任 意调换顺序。 2、可选择变元 可选择变元具有OPTIONAL属性,在哑元说明中声明。 PRESET(M)函数返回一个逻辑值,当变量M被使用时为真,否则假。 3、通过接口块更改哑元名称 可以在主程序的接口块中,改变子程序对应的哑元名称,不必改 动子程序,使之清晰易读。 第四节 类属过程、超载操作符、自定义操作符、超载赋值号 1、类属过程 允许用不同类型的实元与同一个哑元结合。 方法是先针对不同类型编写若干个功能相同的过程,然后在主程 序中编写接口,为接口取一个统一的名字。 INTERFACE 统一名字 各个过程的说明 END INTERFACE 2、超载操作符、自定义操作符 先编写实现功能的函数过程,再在主程序中编写接口。 INTERFACE OPERATOR('超载操作符') 过程说明 END INTERFACE INTERFACE OPERATOR(.自定义操作符.) 过程说明 END INTERFACE 然后就可以象普通运算符一样引用。注意自定义操作符两侧用小 数点"."定界。 3、超载赋值号 先编写实现功能的子例子程序过程,再在主程序中编写接口。 INTERFACE ASSIGNMENT(=) 过程说明 END INTERFACE 以实现不同类型之间赋值的映射关系。例如.TURE.->1。 第五节 外部过程与内部过程 前面涉及的都是外部过程 1、内部过程位置 在主程序执行语句之后,END之前,加一条CONTAINS语句,之后写 出的子程序即为内部过程。 PROGRAM ABC 主程序说明部分 主程序执行部分 CONTAINS 内部子程序部分 END PROGRAM ABC 内部过程可以嵌套,写法相同。 2、内部过程使用 内部过程通常没有说明语句,它们用到的变量应统一在主程序中 说明。主程序可以直接给这些变量赋值,或引用它们的值。即这些 变量是全局的。一般没有哑元。 在内部子程序内定义的变量,是局部变量。主程序不能直接使用。 第六节 哑过程 哑元也可以是一个过程。该过程应在主程序INTERFACE中说明。内 部基本函数也可以作为实过程与哑过程结合,但结合时只准用基本 函数的专用名,不可用类属名,并且要用说明语句说明它们是内部 函数,如: REAL,INTRINSIC::SIN 第六章 数据结构、派生类型和模块 第一节 数据结构 一个数据结构由若干成员组成,成员表示形式: 结构名%成员名 第二节 派生类型 1、定义 TYPE [,存取方式描述::] 派生类型名 成员1类型说明 成员2类型说明 ... END TYPE [派生类型名] 存取方式描述为PRIVATE或PUBLIC。在下节说明。 声明变量:TYPE(派生类型名)::变量名 派生类型中字符型成员不可取*为长度,必须是确定长度。 2、结构构造函数 在定义一个派生类型的同时,自动生成一个结构构造函数,函数 名就是派生类型名,自变量就是派生类型内各成员。这个函数不需 进行编程加工,用来给一个具体的变量赋值。 赋值语句为: 变量=派生类型名(成员值表) 第三节 模块 模块是的一个程序单元,模块内没有可执行语句,除说明语句 外,最多包含内部过程。主要作用是供其他程序单元引用,所有与 模块中的名字相同的变量,共享存储单元。引用单元可起到共享和 复制的作用。 1、模块的编写 MODULE 模块名 类型说明部分 [CONTAINS 内部过程 ... ] END MODULE [模块名] 类型说明部分包括各种变量说明,派生类型定义及所需的接口块。 2、模块引用 USE 模块1,模块2,...,模块N a.其它灵活引用方式 i.在定义派生类型时,如有关键字PRIVATE,则该类型及起成员只 供模块内引用。省缺为PUBLIC。 ii.只引用部分实体 USE 模块名,ONLY:实体名表 iii.引用时改变实体名字 USE 模块名:新名=>旧名,... b.建立新的数据类型及规定新类型的操作、赋值 即定义新的数据类型,并编制对应操作的内部过程。 第七章 指针变量 第一节 指针 1、定义 指针变量 类型,POINTER::变量 目标变量 类型,TARGET::变量 通过指针变量可以对目标变量直接操作。 当一个指针指向新目标,则以前的目标自动释放。 2、赋值语句 a.指针指向目标变量 当指针变量与目标变量是同一类型时,指针可以指向目标: 指针变量=>目标变量 b.指针指向指针变量 指针变量=>指针变量 c.一般赋值语句,即“=”赋值。 3、利用指针作链、表等。 a.建立新结点 ALLOCATE(P) 建立一个新节点,并使P指向它。节点类型由P的类 型决定 b.释放节点 DEALLOCATE(P) c.指针置空 NULLIFY(P) 使指针P没有具体指向 c.指针状态查询 ASSOCIATE(P) 指针P指向具体目标,为真,否则为假 ASSOCIATE(P,R) 指针P指向R时,为真,否则为假 第二节 指针与数组 不存在指针数组,也不允许把多个指针定义为一个数组。因为指针 只是一种属性,而不是变量的类型。 解决办法是定义一个结构,这个结构中只有一个指针成员。许多这 种类型的变量可以组成数组。 第八章 数据文件的输入输出 第一节 文件与OPEN语句 1、文件的状态 STATUS=状态值 状态值为: 'OLD' 打开已存在文件 'NEW' 建立新文件 'REPALCE' 当文件不存在时,建立新文件;如已存在,覆盖 'SCRATCH' 临时文件,关闭后会丢失 'UNKNOWN' 不确定,由系统按实际情况打开或建立 省缺值为'UNKNOWN' 2、顺序文件和直接文件 a.顺序文件 ACCESS='SEQUENTIAL' b.直接文件 ACCESS='DIRECT' 每个记录长度应相同,并要求说明记录长度: RECL=以字节为单位的记录长度 具体读写时,只要不超过此值,允许长短不同。 读写时,必须指定所读写记录号N: READ(通道号,FMT=...,REC=N)变量表 WRITE(通道号,FMT=...,REC=N)变量表 省缺为顺序文件 3、有格式文件与无格式文件 a.有格式文件 FORM='FORMATTED' b.无格式文件 FORM='UNFORMATTED' 读写语句不需要写FMT。不能作低级转输,即读写必须以记录为 单位进行。 对顺序文件,省缺为有格式的;对直接文件,省缺为无格式的。 4、连接表其他说明符 a.ACTION= 说明读写性质 'READ' 只读 'WRITE' 只写 'READWRITE' 可读写 省缺为'READWRITE' b.POSITION= 说明定位位置 'REWIND' 在起始点 'ASIS' 在原位不动 'APPEND' 在终止点或结束记录前 省缺为'ASIS' c.DELIM= 说明字符串定界符情况 'APOSTROPHE' 是单引号 'QUOTE' 是双引号 'NONE' 无 省缺为'NONE' d.BLANK= 说明空格的处理 'NULL' 忽略 'ZERO' 作零处理 省缺为'NULL' e.PAD= 说明读入数据时,如FMT规定的大于数据实际长度的处理 'YES' 送空格填补 'NO' 不填补 f.IOSTAT=整型变量 正常为零,错为正整数,文件结束为负整数 g.ERR=标号 出错时转向某一标号语句 5、OPEN语句 OPEN(连接信息表) 连接信息表中,UNIT=N是必须的;如果不是临时文件,FILE='文 件名'也是必须的。当UNIT=N放在第一项时,可以省略"UNIT="。 第二节 内部文件 不需要OPEN语句,不需要通道号,可是在读写语句的通道号处,直 接写上内部文件名。内部文件名是一个字符变量名或字符数组名。 主要用于将字符型值转化为数值,赋给输入表内数值型变量,或反 之将输出表内数值型值转化为字符,赋给字符型变量。 注意:内部文件只能是有格式文件;不允许用表控格式*来作格式 说明;数据传输前,内部文件总定位在第一个记录之前,即初始点 处;不许使用输入输出的辅助语句;不准作低级传输;可以使用说 明符IOSTAT=、ERR=、END=等。 第三节 数据传输与传输辅助语句 1、READ、WRITE中控制信息表 a.UNIT=通道号 b.FMT=格式说明 c.REC=整型表达式 用于指定读写的记录号 d.IOSTAT=整型变量 用负值、正值、零分别表示遇文件结束信息、 出错、正常 e.ERR=标号、END=标号、EOR=标号 分别表示出错、遇文件结束信 息、遇记录结束时转向标号语句。 2、高级传输与低级传输 高级传输在控制信息表内写ADVANCE='YES',或省缺;低级传输写明 ADVANCE='NO'。 高级传输以记录为最小单位,低级传输可以传递一个记录的一部分 数据。 3、CLOSE语句 CLOSE(关闭信息表) 关闭信息表包括: a.[UNIT=]通道号 b.IOSTAT=整型变量 c.ERR=语句标号 d.STATUS='KEEP' 保存文件 STATUS='DELETE' 删除文件 省缺为'KEEP' 4、定位语句 a.回退语句 文件从当前定位后退一个记录 BACKSPACE 通道号 BACKSPACE (定位说明符表) 定位说明符表包括: i.[UNIT=]通道号 ii.IOSTAT=整型变量 iii.ERR=语句标号 当文件以定位在文件初始点时,回退语句无效。 b.反绕语句 文件定位到初始点 REWIND 通道号 REWIND (定位说明符表) c.结束语句 在文件当前位置写一个文件结束记录 END FILE 部件号 END FILE (定位说明符表) 5、查询语句 a.通道查询 INQUIRE (查询说明表) 查询说明表中必须包含UNIT=通道号。 此外还有: EXIST=逻辑变量 查询文件是否存在 NAME=字符型变量 查询所连文件名 b.文件查询 INQUIRE (查询说明表) 查询说明表中必须包含FILE='文件名' 此外还有: OPENED=逻辑变量 查询文件是否打开 ACCESS=字符型变量 查询文件存取方式,返回'SEQUENTIAL'或 'DIRECT',如文件未连接,为'UNDEFINED' NUMBER=整型变量 查询文件通道号,如文件未连接,为-1。 其它查询说明符: NAMED=逻辑变量 查询文件是否有文件名 SEQUENTIAL=字符型变量 返回'YES''NO''UNKNOWN'表示顺序存取 允许、不允许、不确定 DIRECT=字符型变量 返回'YES''NO''UNKNOWN'表示直接存取允许、 不允许、不确定 FORM=字符型变量 返回'FORMATTED''UNFORMATTED''UNDEFINED'表 示有格式、无格式、不确定 FORMATTED=字符型变量 返回'YES''NO''UNKNOWN'表示有格式存取 允许、不允许、不确定 UNFORMATTED=字符型变量 返回'YES''NO''UNKNOWN'表示无格式存 取允许、不允许、不确定 RECL=整型变量 查询文件记录最大长度 NEXTREC=整型变量 用于直接文件,返回下一个记录号 BLANK=字符型变量 返回'NULL''ZERO''UNDEFINED'表示空格无意 义、作零处理、文件未连接 POSITION=字符型变量 返回'REWIND''APPEND''ASIS''UNDEFINED' 表示文件定位于初始点、结束点、未变化、 文件未连接 ACTION=字符型变量 返回'READ''WIRTE''READWRITE''UNDEFINED' 表示文件只读、只写、可读写、文件未连接 READ=字符型变量 返回'YES''NO''UNKNOWN'表示读允许、不允许、 不确定 WRITE=字符型变量 返回'YES''NO''UNKNOWN'表示允许写、不允许 写、不确定 READWRITE=字符型变量 返回'YES''NO''UNKNOWN'表示读写允许、 不允许、不确定 DELIM=字符型变量 返回'APOSTROPHE''QUOTE''NONE''UNKNOWN'表 示字符串用单引号定界、双引号定界、没有定 界符、未连接成有格式的 c.长度查询 INQUIRE (IOLENGTH=N)输出表 以保证建立的直接文件记录有足够的长度。 第四节 格式编辑符 1、整型 Iw[.m]、Bw[.m]、Ow[.m]、Zw[.m]分别为10、2、8、16进制 占w列,显示m列(不足前面补零) 2、实型 Fw.d[Ee]、ENw.d[Ee]、ESw.d[Ee]、Dw.d、Gw.d[Ee] EN用于工程编辑,显示以10^(n*d)为指数单位,n为整数。 ES用于科学记数法编辑 D用于双精度编辑 G用于保证实数至少有d位有效位数。 3、字符型 Aw 4、逻辑型 Lw 5、控制编辑符 a.定位编辑符 Tc 表示下一数据段从本行第c列开始 TLc 表示下一数据段从当前位置左移c列后开始 TRc 表示下一数据段从当前位置右移c列后开始 b.符号编辑符 SP 正数都加‘+’号 SS 正数不加‘+’号 S 是否加‘+’号由系统决定 c.空格编辑符 BZ 输入字段内空格作零处理 BN 输入字段内空格忽略 省缺为BN d.跳格与换行 nX 留空格 n/ 换行 e.P及:编辑符 nP 比例因子编辑,n可正可负,输入值在原值基础上乘以10^n : 当输入输出未完时,不起作用;结束后,它阻止后面的其它 编辑符起作用 f.纵向控制符 空格 下走一行 零 向前跳两行 1 换到下一页 + 不换行,回好行首,重叠打印