声明数组
含有16个元素的实数数组voltage可以被如下声明:
REAL,DIMENSION(16)::voltage
REAL::voltage(16)
数组元素用voltage(1)
,voltage(2)
,…voltage(16)
访问。
含有50个元素,每个元素为20个字符长变量的数组可以被如下声明:
CHARACTER(LEN=20),DIMENSION(50)::last_name
以上两个数组,维数均为1,多维数组见第8章。
第一个数组宽度16,第二个宽度50。
常量数组两种写法:
- (/ 1, 2, 3, 4, 5 /)
- [ 1, 2, 3, 4, 5 ]
在Fortran语句中使用数组元素
数组元素也是普通变量
数组的每个元素是和其他任何变量一样的变量,可以用在任何其他同类型普通变量可出现的地方。
数组元素初始化
和普通变量一样,数组在使用前必须初始化数组中的值。
3种方法:
- 用赋值语句;
- 在类型声明语句中初始化数组;
- 用READ语句初始化。
改变数组下标的取值范围
REAL,DIMENSION(5)::arr
该数组元素可用arr(1)
,arr(2)
,…,arr(5)
来访问。
但在某些问题中,用其他下标更方便,例如,考试成绩取值范围0-100,使用下标0-100这101个元素的数组比用1-101更方便。
在Fortran中,数组可以在声明时包含起始下标和结束下标:REAL,DIMENSION(low_bound:upper_bound)::array
数组下标越界
例如:
REAL,DIMENSION(5)::a
下标1-5可访问数组元素,所有其他整数(比1小或比5大)都不能用作下标。
因为它们未分配内存位置,这样的整数下标位置对数组来说即为越界。
程序开发和调试时,可以打开Fortran编译器的边界检测选项,以帮助捕获产生越界引用的错误。 但是这样会使程序运行变慢,所以在最终程序中可以关闭边界检测,来提高执行速度。
在数组声明中使用命名常数
例如:
INTEGER,PARAMETER::MAX_SIZE = 1000
REAL::array1(MAX_SIZE)
REAL:array2(MAX_SIZE)
REAL::array3(2*MAX_SIZE)
在Fortran程序中,始终使用参数声明数组大小,可以保证程序容易修改。
在Fortran语句中使用整个数组和部分数组
操作整个数组
如果两个数组结构相同,可以对他们使用普通的算术操作。如
REAL,DIMENSION(4)::a = [ 1., 2., 3., 4. ]
REAL,DIMENSION(4)::b = [ 5., 6., 7., 8. ]
REAL,DIMENSION(4)::c,d
DO i = 1,4
c(i) = a(i) + b(i)
END DO
d = a + b
数组c和d的值是相同的。
注:仅需要结构相同,不需要下标相同,如下例,虽下标不同,仍可相加:
REAL,DIMENSION(1:4)::a = [ 1., 2., 3., 4. ]
REAL,DIMENSION(5:8)::b = [ 5., 6., 7., 8. ]
REAL,DIMENSION(101:104)::c
标量值可与数组相乘;
许多Fortran内
置函数也可以将数组作为输入参数,返回的数组为逐个元素应用到函数上后组成的数组。
部分数组
部分数组是数组的子集
部分数组用下标三元组或向量下标指定
下标三元组常见形式:subscript_1:subscript_2:stride
例,定义数组array:INTEGER,DIMENSION(10)::array = [1,2,3,4,5,6,7,8,9,10]
则部分数组array(1:10:2)为含元素array(1),array(3),array(5),array(7),array(9)的数组。
向量下标是一维的整数数组,指定了参与计算的数组元素。可以任意指定数组元素的顺序,而且数组元素可以被多次指定。例如:
INTEGER,DIMENSION(5)::vec = [1,6,4,1,9]
REAL,DIMENSION(10)::a=[1.,-2.,3.,-4.,5.,-6.,7.,-8.,9.,-10.]
输入和输出
数组元素的输入和输出
要打印数组的特定元素,在WRITE语句的参数列表上列出他们的名字即可,如,下列代码打印实数数组a的前5个元素:
WRITE(*,100) a(1),a(2),a(3),a(4),a(5)
100 FORMAT('a = ', 5F10.2)
隐式DO循环
上述语句采用隐式DO循环改写为:
WRITE(*,100) (a(i),i=1,5)
100 FORMAT('a=',5F10.2)