- 第一章 Fortran 语言程序设计初步
- 第二章 改变程序流程
- 第三章 循环结构
- 第四章 数据结构
- 第五章 数组
- 第六章 过程和模块
- 第七章 输入输出和文件
5.1.1 定义数组
F90 中变量的概念与 F77 的不同,它包含了两种变量,一种是标量,一种是数组。数组是科学和工程计算问题中常见的向量和矩阵的反映和概括。数组在 FORTRAN 程序中有着重要的意义,在批量大的情况下,如果不利用数组就失去了计算机的优越性。
a) 数组的描述
数组是类型相同的一组标量数据的有序集合,即要求这些数据都必须类型相同,并按某种确定方式排列。向量是一维数组,矩阵可看成是二维数组。类型可以是整型、实型、双精度型、逻辑型等任何一种。组成数组的每一个元素称为数组元素。
数组的维数称为秩(rank),F90 中规定数组最多可以有 7 维。在某一维中元素的个数称为该维的长度(extent)。数组中所有元素的个数称为数组的大小(size),它等于各维的长度的乘积,数组的大小可以为 0。数组的形状(shape) 取决于秩和每一维的长度。
例:REAL A(10,3,2) 的秩为 3,大小为 10×3×2=60,形状为 10 乘 3 乘 2,或表示成(10,3,2)。
数组的形状可用内在函数 SHAPE 得到,如 SHAPE(A) 的结果是一维数组,其元素取值为 10,3,2。
每一维的大小都由一个下界和一个上界来指定,之间以冒号分开,即下界:上界。维界表达式是整型的数学表达式,维界值可以是正、负或零,但维上界必须大于维下界的值。维长=上界-下界+1。声明数组时下界可以省略,此时维下界为默认值 1。例如:REAL B(0:9,-1:1,4:5,9)。
数组可以用以下几种声明语句定义,F77 中为类型说明语句、DIMENSION 语句和 COMMON 语句,F90 中还可以用类型属性说明、POINTER 语句、ALLOCATABLE 语句。例如下面都是合法的数组声明:
REAL A(10,2,3) ! 类型说明
DIMENSION A(10,2,3) ! DIMENSI0N 语句
ALLOCATABLE B(:,:) ! ALLOCATABLE 语句
POINTER C(:,:,:) ! POINTER 语句
REAL,DIMENSION(2,5):: D ! 类型说明中的 DIMENSION 属性
REAL,ALLOCATABLE:: E(:,:,:) ! 类型说明中的 ALLOCATABLE 属性
REAL,POINTER:: F(:,:) ! 类型说明中的 POINTER 属性
无论何种情况,数组的秩总是要指定的。数组的大小和形状是否需要声明视数组的形式而定。当 COMMON 语句指定了数组的秩和大小后,只能定义数组的类型而不能再次重复给定维界。
b) 数组元素
在程序执行部分中,数组的三种成份可供运算或输入输出:
1、数组名 -> 代表数组中所有元素;
2、数组元素 -> 代表数组中某一个元素;
3、数组片段 -> 代表数组中若干个元素,它们可以相连或分离。
数组中单独的标量称为元素。标量的秩为 0,而数组的秩至少是 1。如果没有下标则指整个数组。对每一维指定确切的一个下标则定义了一个数组元素,还可以通过下标可以引用数组的一部分元素。例如 A 指整个数组,A(1) 指数组 A 的第 1 个元素,A(3:4) 指数组 A 的第 3 和第 4 个元素,A(1:10:2) 指的是数组 A 的第 1,3,5,7,9 个元素。
数组的下标必须用逗号隔开,下标是整型常量、变量或表达式,可正、可负、也可以为 0,但必须在引用的数组的维数之内。引用下标的个数要和声明的数组的维数一致。可以使用函数或数组元素作为下标:
例:REAL A(3,3),B(3,3),C(89),R
B(2,2)=4.5; R=7.O; C(INT(R)*2+1)=2.O !给元素 B(2,2) 和 C(15) 赋值
A(1,2)=B(INT(C(15)),INT(SQRT(R))) !元素 A(1,2) 和元素 B(2,2) 的值相同
c) 数组片段
数组片段是数组所有元素集合的一个子集。数组片段的元素可以是数组中任意的元素,它们不需连续或遵循某个规则。数组中的所有元素和片段的数据类型和种别都相同。如果指定数组的所有下标则得到的是数组元素(即标量),如果只指定部分下标则结果是部分数组元素的集合,即数组片段,数组片段本身也是数组。
例如,如果定义 REAL A(2,3,4),则 A(1,2,3) 是数组元素,而 A(1:2,2,2),A(1,1,4:2:-1),A(1,2:3,(/2,4/)) 都是数组片段。
数组片段由下标列表确定,下标列表有两种:三元下标和向量下标。
d) 三元下标
三元下标用三个值分别代表数组片段的下界,上界和步长。其一般形式为:[下界]:[上界][:步长]。如果省略下界,缺省值为数组相应维的下界;如果省略上界,缺省值为数组相应维的上界;如果省略步长,缺省值为 1。如果下标都省略了则缺省片段为这个维的全长。
例:REAL A(10)
A(1:5:2)=3.0 !把元素 A(1),A(3),A(5) 置为 3.0
A(:5:2)=3.O !把元素 A(1),A(3),A(5) 置为 3.0,因为缺省下界为 1
A(2::3)=3.O !把元素 A(2),A(5),A(8) 置为 3.0,因为上界缺省值为 10
A(7:9)=3.0 !把元素 A(7),A(8),A(9) 置为 3.0,因为缺省步长为 1
A(:)=3.0 !和 A=3.0 相同,将 A 的所有元素置为 3.0
对于—个多维数组的数组片段,它的每一维都可以用三元下标来声明。如果要在一个语句或过程中引用这个数组片段,则引用下标要和声明时的下标个数一样多。注意,三元下标只能算一个下标。
例:REAL A(5,9)
A(1:4:3,6:8:2)=3.0
此例中数组 A 是二维数组,数组片段是形状为(2,2) 的二维数组。上面括号内第一个三元组表示第一维下标变化范围,第二个三元组表示第二维下标变化范围。其元素选取法是先把第二维下标定在下界值上,而后遍历第一维下标,选中元素为 A(1,6),A(4,6);再把第二维下标增一步长,再遍历第一维下标,选中元素为 A(1,8),A(4,8),如此重复直至全部选完。这种选取关系相当于把第二维作外层 DO 循环变量,第一维作内层循环变量的变化。这四个元素按先后次序保持一定的形状,上式等价于:
数组的步长不能是 0。当步长为负值时,数组子片段从上界开始递减至下界。例如声明一个数组 B(10),则数组片段 B(9:2:-2) 是由元素 B(9),B(7),B(5) 和 B(3) 组成的数组。显然下界不能比上界大,否则产生的数组大小为 0。三元下标的值可以不在数组的边界以内,例如对于数组 B(10),数组片段 B(3:15:6) 是由 B(3) 和 B(9) 组成的数组。
e) 向量下标
三元下标以上升或下降的顺序指定数组元素,而向量下标可以以任何顺序来指定数组元素。向量下标是一个一维整数数组(即向量),它可以从整个数组中选择片段。
例:REAL A(10),B(5,5)
INTEGER I(4),J(3)
I=(/5,3,8,2/) !定义向量 I
J=(/3,1,5/) !定义向量 J
A(I)=3.O !设置元素 A(5),A(3),A(8),A(2) 的值
B(2,J)=3.O !设置元素 B(2,3),B(2,1) 和 B(2,5) 的值
例:INTEGER :: a(4)=(/0,1,2,3/),b(3)=(/1,4,3/)
则 a(b) 与 a 同类型,与 b 同形状,取值为(/0,3,2/)。a(b) 可以不是数组片段,而是更大的数组。如上面 b 为(/2,3,2,3,2,3/) 时,a(b) 为(/1,2,1,2,1,2/)。
例:CHARACTER(1) :: symbol(0:1)=(/'F','M'/)
INTEGER :: bit(100)
若 bit 的元素列为 0001101100111...,则 symbol(bit) 是用{F,M}字符构成的 100 字节的字符型数组 FFFMMFMMFFMMM...。
向量下标的值应该在定义的边界之内,向量下标可以有多个重复的值,此数组片段称为多对一数组片段。
例:REAL A(3,3),B(4)
INTEGER K(4)
K=(/3,1,1,2/) !K 矢量有重复值
A=5.0 !设置 A 的所有元素
B=A(3,K) !数组片段 B 由下列元素组成:A(3,3),A(3,1),A(3,1),A(3,2)
因为在 B(4) 或 A(3,K) 中有重复的元素 A(3,1),所以它是多对一数组片段。一个多对一数组片段不能出现在赋值语句的左端。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论