📅  最后修改于: 2020-11-04 06:17:15             🧑  作者: Mango
数组可以存储相同类型元素的固定大小的顺序集合。数组用于存储数据集合,但是将数组视为相同类型的变量集合通常会更有用。
所有阵列均包含连续的内存位置。最低地址对应于第一个元素,最高地址对应于最后一个元素。
Numbers(1) | Numbers(2) | Numbers(3) | Numbers(4) | … |
数组可以是一维(如向量),也可以是二维(如矩阵),并且Fortran允许您最多创建7维数组。
数组使用维度属性声明。
例如,要声明一个名为number的一维数组,其中包含5个元素的实数,您可以这样写:
real, dimension(5) :: numbers
通过指定数组的下标来引用数组的各个元素。数组的第一个元素的下标为1。数组编号包含五个实数变量-数字(1),数字(2),数字(3),数字(4)和数字(5)。
要创建一个名为matrix的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
下表给出了一些与数组相关的术语-
Term | Meaning |
---|---|
Rank | It is the number of dimensions an array has. For example, for the array named matrix, rank is 2, and for the array named numbers, rank is 1. |
Extent | It is the number of elements along a dimension. For example, the array numbers has extent 5 and the array named matrix has extent 3 in both dimensions. |
Shape | The shape of an array is a one-dimensional integer array, containing the number of elements (the extent) in each dimension. For example, for the array matrix, shape is (3, 3) and the array numbers it is (5). |
Size | It is the number of elements an array contains. For the array matrix, it is 9, and for the array numbers, it is 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类。