声明数组

含有16个元素的实数数组voltage可以被如下声明:

  1. REAL,DIMENSION(16)::voltage
  2. REAL::voltage(16)

数组元素用voltage(1)voltage(2),…voltage(16)访问。
含有50个元素,每个元素为20个字符长变量的数组可以被如下声明:

CHARACTER(LEN=20),DIMENSION(50)::last_name

以上两个数组,维数均为1,多维数组见第8章。
第一个数组宽度16,第二个宽度50。
常量数组两种写法:

  1. (/ 1, 2, 3, 4, 5 /)
  2. [ 1, 2, 3, 4, 5 ]

在Fortran语句中使用数组元素

数组元素也是普通变量

数组的每个元素是和其他任何变量一样的变量,可以用在任何其他同类型普通变量可出现的地方。

数组元素初始化

和普通变量一样,数组在使用前必须初始化数组中的值。
3种方法:

  1. 用赋值语句;
  2. 在类型声明语句中初始化数组;
  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编译器的边界检测选项,以帮助捕获产生越界引用的错误。 但是这样会使程序运行变慢,所以在最终程序中可以关闭边界检测,来提高执行速度。

在数组声明中使用命名常数

例如:

  1. INTEGER,PARAMETER::MAX_SIZE = 1000
  2. REAL::array1(MAX_SIZE)
  3. REAL:array2(MAX_SIZE)
  4. REAL::array3(2*MAX_SIZE)

在Fortran程序中,始终使用参数声明数组大小,可以保证程序容易修改。

在Fortran语句中使用整个数组和部分数组

操作整个数组

如果两个数组结构相同,可以对他们使用普通的算术操作。如

  1. REAL,DIMENSION(4)::a = [ 1., 2., 3., 4. ]
  2. REAL,DIMENSION(4)::b = [ 5., 6., 7., 8. ]
  3. REAL,DIMENSION(4)::c,d
  4. DO i = 1,4
  5. c(i) = a(i) + b(i)
  6. END DO
  7. d = a + b

数组c和d的值是相同的。
注:仅需要结构相同,不需要下标相同,如下例,虽下标不同,仍可相加:

  1. REAL,DIMENSION(14)::a = [ 1., 2., 3., 4. ]
  2. REAL,DIMENSION(58)::b = [ 5., 6., 7., 8. ]
  3. REAL,DIMENSION(101104)::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)的数组。
向量下标是一维的整数数组,指定了参与计算的数组元素。可以任意指定数组元素的顺序,而且数组元素可以被多次指定。例如:

  1. INTEGER,DIMENSION(5)::vec = [1,6,4,1,9]
  2. REAL,DIMENSION(10)::a=[1.,-2.,3.,-4.,5.,-6.,7.,-8.,9.,-10.]

a(vec)=[1.,-6.,-4.,1.,9.]

输入和输出

数组元素的输入和输出

要打印数组的特定元素,在WRITE语句的参数列表上列出他们的名字即可,如,下列代码打印实数数组a的前5个元素:

  1. WRITE(*,100) a(1),a(2),a(3),a(4),a(5)
  2. 100 FORMAT('a = ', 5F10.2)

隐式DO循环

上述语句采用隐式DO循环改写为:

  1. WRITE(*,100) (a(i),i=1,5)
  2. 100 FORMAT('a=',5F10.2)