跳转到内容

Fortran/Fortran 变量

75% developed
来自维基教科书,开放的书籍,开放的世界

在编程中,变量是程序可以更改的数据容器。 您通常会在使用变量之前声明它们,以提供有关它们应该存储何种数据的的信息。 但是,Fortran 允许隐式创建变量。 在没有implicit语句的情况下,未声明的变量和以i/In/N(“in”组)开头的参数将是integer,所有其他未声明的变量和参数将是real

许多人认为在没有声明的情况下使用变量是一种不好的做法。 如果你想被迫声明变量,请首先编写implicit none

一般示例

[编辑 | 编辑源代码]

以下列出了常用变量的示例

! Declare a constant, whose value cannot be changed.
integer, parameter :: num_days_week = 7
! Declare i as an integer, j as an array of 2 integers from j(1) to j(2), k as
! an array of 2 integers from '''k(0)''' to k(1), and m as a 2-dimensional
! array of 12 elements.
integer :: i, j(2), k(0:1), m(3,4)
! Declare c as an array of 4 floating point numbers from c(0) to c(3).
real :: c(0:3)
! Declare word as a string of length 5
character (len=5) :: word
! Declare a boolean variable with values .TRUE. or .FALSE.
logical :: tf

以下代码执行完全相同的功能,但采用更短、更古老的形式

INTEGER, PARAMETER :: num_days_week = 7
DIMENSION j(2), k(0:1), m(3,4), c(0:3)
CHARACTER*5 word
LOGICAL tf

如果您考虑内存布局,请注意 m(1,1) 在内存中紧随其后的是 m(2,1),而不是 m(1,2)。

可以通过将变量放在等号之前来设置变量,等号后面是设置的值。 鉴于上述声明,以下赋值是可能的

i    = 3*4                  ! Set i to 3*4 = 12         
j    = [1, 4]               ! Set j(1) to 1, j(2) to 4
c    = [1.0, 4.0, 5.0, 9.0] ! Set c(0) to 1.0, c(1) to 4.0, c(2) to 5.0, c(3) to 9.0
word = 'dog'                ! Set word = "dog  " . The variable word is padded with spaces on the right
tf   = .true.               ! Set tf to True

变量可以出现在赋值的等号两侧。 右侧首先被评估,然后变量被赋值给该值

i = 3     ! i has value 3
i = i**i  ! i has value 3**3 = 27

变量可以从一种类型转换为另一种类型,但与 C++ 或 Java 不同,您不会在其中对变量进行类型转换,在 Fortran 中,您使用内在过程

real          :: r = 1.5
real (kind=8) :: d = 1.5
integer       :: i = 1

print *, dble(r), dble(d), dble(i)   ! Convert number to a double precision
print *, real(r), real(d), real(i)   ! Convert number to a single precision (REAL)
print *, int(r), int(d), int(i)      ! Convert number to an integer

同样,使用更简单、更古老的形式,可以实现相同的功能

 DOUBLE PRECISION d = 1.5
 r = 1.5
 i = 1
 PRINT *, DBLE(r), DBLE(d), DBLE(i)
 PRINT *, REAL(r), REAL(d), REAL(i)
 PRINT *, INT(r), INT(d), INT(i)

可以使用两种不同的表示法来声明数组。 以下示例说明了长度为 5 的integer类型数组的表示法。

integer, dimension (5) :: arr1
integer                :: arr2(5)

对于多维数组,需要指定每个维度的长度。 以下示例重点介绍了 5x6 整数矩阵(也称为长度为 (5,6) 的二维数组)的情况。(同样,显示两种表示法。)

integer, dimension (5,6) :: arr1
integer                  :: arr2(5,6)

初始化

[编辑 | 编辑源代码]

要使用实际值初始化数组,有多种选择:设置特定元素、特定范围或整个数组。

integer :: arr(3)

arr(1)   = 4            ! set specific element
arr(1:2) = [4, 5]       ! set a range aka slicing notation
arr      = [4, 5, 6]    ! set whole array

要设置多维数组,需要使用reshapeshape命令。

integer :: arr(2,3)

arr = reshape([1,2,3,4,5,6], shape(arr))
! arr = reshape([1,2,3,4,5,6], shape=[2,1])  ! same effect as above command - hardcode the shape of arr

! arr represents matrix:
! 1 3 5
! 2 4 6

Fortran 使用列优先排序,因此上面的示例生成一个经常令人困惑的矩阵。 对于行优先排序,可以使用以下示例,其中重点介绍了使用 order 参数来指定首先排序的维度。

integer :: arr(2,3)

arr = reshape([1,2,3,4,5,6], shape(arr), order=[2,1])

! arr represents matrix:
! 1 2 3
! 4 5 6


华夏公益教科书