Fortran/Fortran 变量
外观
< Fortran
在编程中,变量是程序可以更改的数据容器。 您通常会在使用变量之前声明它们,以提供有关它们应该存储何种数据的的信息。 但是,Fortran 允许隐式创建变量。 在没有implicit
语句的情况下,未声明的变量和以i
/I
到n
/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
要设置多维数组,需要使用reshape
和shape
命令。
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