Fortran/基础
Fortran 程序由主程序和模块组成,每个程序都可以包含子程序和函数.
程序运行时应执行的代码应放置在 program
块中,如下所示
program name_of_program
! <variable declarations> ...
! <program statements> ...
end program
缩进不是必需的,但建议使用。程序名称必须以字母开头,其他部分可以包含字母、数字和下划线 (下划线) 字符。每个语句以行尾结束。
Fortran 77 语法要求在任何命令之前留出 6 个空格。这 6 个空格源自 Fortran 的穿孔卡片版本。在最初的 6 个空格之后,您可以根据需要放置额外的空格进行缩进。
但是,总的来说,行宽限制为 72 个字符(包括最初的 6 个空格)。如果您需要额外的空格,可以在第 6 列放置任何字符(某些编译器除外,0 除外);这称为“续行符”。对于穿孔卡片,这意味着您可以将该行继续到第二张卡片上。
C2345678...
PRINT *,"This is a really....
*...long line.
在某些编译器中,您可以通过指定“自由格式”而不是“固定格式”模式来关闭 6 个空格规则,并关闭固定长度行。如果您使用 GNU Fortran 编译器 (gfortran),则在编译时可以使用 -ffree-form 命令行选项来实现相同目的。
在行中包含感叹号 ! 将使该行剩下的部分成为注释,如下所示
a = b ! this is a comment
c = d ! this!! is also a comment
在固定格式模式下,您还可以通过在第一列放置 * 或 c 来将整行标记为注释。
请参阅变量
变量有许多不同的类型和选项,但现在我们将坚持基本内容。
real :: a ! Decimal number.
integer :: b ! Whole number.
character :: c ! Single character.
建议在变量声明之前使用 implicit none
语句,以通过强制显式声明每个程序变量来避免类型错误。
请参阅数学
- 加、减、乘、除
+
-
*
/
- 赋值
=
- 乘方(2**4 等于 2 的 4 次方 = 16)
**
数学运算符具有特定的优先级顺序
** [乘方] 总是优先级最高,它是从右到左结合。即 2**3**2 = 512,而不是 64
接下来是 * [乘法] 和 / [除法],它们是从左到右结合,即 1.0/1.0/2.0*6.0 = ((1.0/1.0)/2.0)*6.0 = 3.0,而不是 12.0。
接下来是 + [加法] 和 - [减法],它们也是从左到右结合,所以 x-y+z = (x-y)+z = x+(-y)+z。
最后是 = [赋值]。
Fortran 具有广泛的函数,这些函数在数值工作中很有用,例如 sin
、exp
和 log
。函数的参数必须具有正确的类型,并且应括在括号中
x = sin(3.14159) ! Sets x equal to sin(pi), which is zero.
Fortran 的内在数学函数是 elemental
,这意味着它们可以将数组和标量作为参数,并返回与形状相同的标量或数组
real :: x(2), pi=3.14159
x = sin([pi, pi/2])
上面的程序片段将数组 x
的两个元素 x(1)
和 x(2)
分别设置为 sin(pi)
和 sin(pi/2)
。
在 if
语句和其他一些地方,您可以将关系运算符 =、<、>、≤、≥ 和 ≠ 分别编码为 .eq.
、.lt.
、.gt.
、.le.
、.de.
和 .ne.
。另一种写这些运算符的方法是:==、<、>、<=、>= 和 /=。
您还可以使用逻辑运算符 .and.
、.or.
和 .not.
,以及逻辑常量 .true.
和 .false.
。在组合这些项目时,不要重复使用点。例如,a .and. .not. b
与 a.and.not.b
相同,但不同于 a.and..not.b
。
请参阅输入和输出
write (*,*) "Hello World", variablename, "More text", anothervariable
(*,*)
表示使用默认输出,并使用默认选项,通常打印到屏幕。引号内的内容将按代码中的原样打印,变量的值将被打印。对象必须用逗号隔开,默认情况下,write 语句会自动结束该行。
完整的正式语法是
write (unit=unit_num, FMT=fmt_label, err=label) "Hello World", variablename, "More text", anothervariable
请注意,某些版本的 Fortran 不允许使用双引号,而是需要使用单引号。封闭的单引号可以用两个单引号表示。例如,'don''t'
。
WRITE
或 READ
的第一个括号内的参数是单元号。单元号以操作系统确定的方式与输入或输出流相关联。在非常旧的系统中,单元号是设备地址。在 IBM JCL 系统中,单元号与文件之间的关联是通过 JCL DD
语句完成的。在其他版本中,存在一些将文件和单元号关联起来的语句。UNIT=
标签可以省略。如果使用星号作为单元号,则所涉及的 I/O 是标准输入通道或标准输出通道。
WRITE
或 READ
的第二个括号内的参数是记录号。请注意,如果存在,此参数与单元号之间用单引号隔开。如果存在,此变量定义要从中读取或写入的记录号。例如,
record_number = 5
write (2, record_number) x, y, z
将 x、y 和 z 以压缩的机器特定格式写入记录号 5。当然,请注意,此用法要求您的 OS 或 Fortran 编译器知道构成记录的因素。在字节组织的文件中,上面的代码将从文件字节号 5 开始写入 x、y 和 z。
WRITE
或 READ
的第三个括号参数是格式编号。如果这个第三个参数像上面一样用星号表示,那么格式就是默认的。如果您想使用 FORMAT
语句来格式化输入或输出,则包括 FORMAT
语句的语句编号。例如
write (7,1) 'Hello, world!', i, 'More text', x
1 format (A,I,A,F)
请注意,format
语句不能作为内联语句执行。它仅在 read
或 write
引用时使用。fmt=
标签可以省略。整个参数也可以省略。但是,如果您省略格式参数,则 I/O 将以非格式化的方式执行,使用特定于机器的打包数据。
write
或 read
的最后一个括号参数是错误处理语句标签。例如,如果
write (5,err=2) x, y, z
被编码,这意味着输出将被非格式化到单元 5。如果发生错误,执行将继续在语句 2(在它前面带有语句标签 2 的语句)处继续。如果发生错误,并且没有 ERR=
参数,那么程序会异常终止。因此,ERR=
是其他语言中 catch
的最接近的等效项。虽然最后一个参数可以完全省略,但一旦使用,ERR=
就不能从参数中省略。
program nearlyuseless
implicit none
real :: temperature
integer :: cows
temperature = 98.6
cows = 9
print *, "There are ", cows, " cows outside."
print *, "You are probably ", temperature, " right now"
end program
Fortran 的某些版本,或在某些设置中,使用格式字符。当使用格式字符时,行的第一个字符决定如何打印该行。1
表示新页面。0
表示在行之前进行 2 次换行(双倍行距)。-
表示在行之前进行 3 次换行(三倍行距)。+
表示在行之前不进行换行(覆盖打印)。而空格表示在行之前进行一次换行(正常打印)。
以下是相同程序的古老形式,带有此形式控制字符
temperature = 98.6
i_cows = 6
write (*,*) ' There are ', i_cows, ' cows outside.'
write (*,*) ' You are probably ', temperature, ' right now.'
end