跳转到内容

Fortran/基础

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


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 具有广泛的函数,这些函数在数值工作中很有用,例如 sinexplog。函数的参数必须具有正确的类型,并且应括在括号中

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. ba.and.not.b 相同,但不同于 a.and..not.b

WRITE 语句

[编辑 | 编辑源代码]

请参阅输入和输出

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'

WRITEREAD 的第一个括号内的参数是单元号。单元号以操作系统确定的方式与输入或输出流相关联。在非常旧的系统中,单元号是设备地址。在 IBM JCL 系统中,单元号与文件之间的关联是通过 JCL DD 语句完成的。在其他版本中,存在一些将文件和单元号关联起来的语句。UNIT= 标签可以省略。如果使用星号作为单元号,则所涉及的 I/O 是标准输入通道或标准输出通道。

WRITEREAD 的第二个括号内的参数是记录号。请注意,如果存在,此参数与单元号之间用单引号隔开。如果存在,此变量定义要从中读取或写入的记录号。例如,

record_number = 5
write (2, record_number) x, y, z

将 x、y 和 z 以压缩的机器特定格式写入记录号 5。当然,请注意,此用法要求您的 OS 或 Fortran 编译器知道构成记录的因素。在字节组织的文件中,上面的代码将从文件字节号 5 开始写入 x、y 和 z。

WRITEREAD 的第三个括号参数是格式编号。如果这个第三个参数像上面一样用星号表示,那么格式就是默认的。如果您想使用 FORMAT 语句来格式化输入或输出,则包括 FORMAT 语句的语句编号。例如

write (7,1) 'Hello, world!', i, 'More text', x
1 format (A,I,A,F)

请注意,format 语句不能作为内联语句执行。它仅在 readwrite 引用时使用。fmt= 标签可以省略。整个参数也可以省略。但是,如果您省略格式参数,则 I/O 将以非格式化的方式执行,使用特定于机器的打包数据。

writeread 的最后一个括号参数是错误处理语句标签。例如,如果

write (5,err=2) x, y, z

被编码,这意味着输出将被非格式化到单元 5。如果发生错误,执行将继续在语句 2(在它前面带有语句标签 2 的语句)处继续。如果发生错误,并且没有 ERR= 参数,那么程序会异常终止。因此,ERR= 是其他语言中 catch 的最接近的等效项。虽然最后一个参数可以完全省略,但一旦使用,ERR= 就不能从参数中省略。

示例代码

[编辑 | 编辑源代码]

参见 Fortran 中更多示例

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


华夏公益教科书