- Fortran 教程
- Fortran - 主页
- Fortran - 概述
- Fortran - 环境设置
- Fortran - 基本语法
- Fortran - 数据类型
- Fortran - 变量
- Fortran - 常量
- Fortran - 运算符
- Fortran - 决策
- Fortran - 循环
- Fortran - 数字
- Fortran - 字符
- Fortran - 字符串
- Fortran - 数组
- Fortran - 动态数组
- Fortran - 派生数据类型
- Fortran - 指针
- Fortran - 基本输入输出
- Fortran - 文件输入输出
- Fortran - 过程
- Fortran - 模块
- Fortran - 内在函数
- Fortran - 数值精度
- Fortran - 程序库
- Fortran - 编程风格
- Fortran - 调试程序
- Fortran 资源
- Fortran - 快速指南
- Fortran - 有用的资源
- Fortran - 讨论
Fortran - 数组
数组可以存储相同类型元素的固定大小的顺序集合。数组用于存储数据的集合,但将数组视为相同类型的变量的集合通常更有用。
所有数组都由连续的内存位置组成。最低地址对应于第一个元素,最高地址对应于最后一个元素。
数字(1) | 数字(2) | 数字(3) | 数字(4) | …… |
数组可以是一维的(如向量)、二维的(如矩阵),Fortran 允许您创建最多 7 维的数组。
声明数组
数组是用维度属性声明的。
例如,要声明一个名为 number 的一维数组,该数组由包含 5 个元素的实数组成,您可以这样写:
real, dimension(5) :: numbers
数组的各个元素通过指定其下标来引用。数组的第一个元素的下标为 1。数组numbers包含五个实数变量——numbers(1)、numbers(2)、numbers(3)、numbers(4)和numbers(5)。
要创建名为矩阵的 5 x 5 二维整数数组,您可以编写 -
integer, dimension (5,5) :: matrix
您还可以声明一个具有显式下界的数组,例如 -
real, dimension(2:6) :: numbers integer, dimension (-3:2,0:4) :: matrix
赋值
您可以为各个成员分配值,例如,
numbers(1) = 2.0
或者,您可以使用循环,
do i =1,5 numbers(i) = i * 2.0 end do
一维数组元素可以使用简写符号直接赋值,称为数组构造函数,例如,
numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
请注意,方括号“(”和反斜杠“/”之间不允许有空格
例子
以下示例演示了上面讨论的概念。
program arrayProg real :: numbers(5) !one dimensional integer array integer :: matrix(3,3), i , j !two dimensional real array !assigning some values to the array numbers do i=1,5 numbers(i) = i * 2.0 end do !display the values do i = 1, 5 Print *, numbers(i) end do !assigning some values to the array matrix do i=1,3 do j = 1, 3 matrix(i, j) = i+j end do end do !display the values do i=1,3 do j = 1, 3 Print *, matrix(i,j) end do end do !short hand assignment numbers = (/1.5, 3.2,4.5,0.9,7.2 /) !display the values do i = 1, 5 Print *, numbers(i) end do end program arrayProg
当上面的代码被编译并执行时,它会产生以下结果 -
2.00000000 4.00000000 6.00000000 8.00000000 10.0000000 2 3 4 3 4 5 4 5 6 1.50000000 3.20000005 4.50000000 0.899999976 7.19999981
一些数组相关术语
下表给出了一些与数组相关的术语 -
学期 | 意义 |
---|---|
秩 | 它是数组的维数。例如,对于名为matrix的数组,rank为2,对于名为numbers的数组,rank为1。 |
程度 | 它是沿维度的元素数量。例如,数组 number 的范围为 5,名为 Matrix 的数组在两个维度上的范围均为 3。 |
形状 | 数组的形状是一维整数数组,包含每个维度的元素数量(范围)。例如,对于数组矩阵,形状为 (3, 3),数组编号为 (5)。 |
尺寸 | 它是数组包含的元素数量。对于数组矩阵,它是 9,对于数组编号,它是 5。 |
将数组传递给过程
您可以将数组作为参数传递给过程。下面的例子演示了这个概念 -
program arrayToProcedure implicit none integer, dimension (5) :: myArray integer :: i call fillArray (myArray) call printArray(myArray) end program arrayToProcedure subroutine fillArray (a) implicit none integer, dimension (5), intent (out) :: a ! local variables integer :: i do i = 1, 5 a(i) = i end do end subroutine fillArray subroutine printArray(a) integer, dimension (5) :: a integer::i do i = 1, 5 Print *, a(i) end do end subroutine printArray
当上面的代码被编译并执行时,它会产生以下结果 -
1 2 3 4 5
在上面的示例中,子例程 fillArray 和 printArray 只能用维度为 5 的数组调用。但是,要编写可用于任何大小的数组的子例程,您可以使用以下技术重写它 -
program arrayToProcedure implicit none integer, dimension (10) :: myArray integer :: i interface subroutine fillArray (a) integer, dimension(:), intent (out) :: a integer :: i end subroutine fillArray subroutine printArray (a) integer, dimension(:) :: a integer :: i end subroutine printArray end interface call fillArray (myArray) call printArray(myArray) end program arrayToProcedure subroutine fillArray (a) implicit none integer,dimension (:), intent (out) :: a ! local variables integer :: i, arraySize arraySize = size(a) do i = 1, arraySize a(i) = i end do end subroutine fillArray subroutine printArray(a) implicit none integer,dimension (:) :: a integer::i, arraySize arraySize = size(a) do i = 1, arraySize Print *, a(i) end do end subroutine printArray
请注意,程序使用size函数来获取数组的大小。
当上面的代码被编译并执行时,它会产生以下结果 -
1 2 3 4 5 6 7 8 9 10
数组部分
到目前为止,我们已经引用了整个数组,Fortran 提供了一种使用单个语句引用多个元素或数组的一部分的简单方法。
要访问数组部分,您需要提供该部分的下限和上限,以及所有维度的步幅(增量)。这种表示法称为下标三元组:
array ([lower]:[upper][:stride], ...)
当没有提到下限和上限时,它默认为您声明的范围,并且步幅值默认为 1。
下面的例子演示了这个概念 -
program arraySubsection real, dimension(10) :: a, b integer:: i, asize, bsize a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0 a(8:) = 0.0 ! rest are 0.0 b(2:10:2) = 3.9 b(1:9:2) = 2.5 !display asize = size(a) bsize = size(b) do i = 1, asize Print *, a(i) end do do i = 1, bsize Print *, b(i) end do end program arraySubsection
当上面的代码被编译并执行时,它会产生以下结果 -
5.00000000 5.00000000 5.00000000 5.00000000 5.00000000 5.00000000 5.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.50000000 3.90000010 2.50000000 3.90000010 2.50000000 3.90000010 2.50000000 3.90000010 2.50000000 3.90000010
数组内部函数
Fortran 90/95 提供了几个内部过程。它们可以分为7类。