📜  Fortran-数组

📅  最后修改于: 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类。