跳转到内容

Fortran/基础

75% developed
来自维基教科书,开放的书籍,为开放的世界
(从 Fortran/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 有许多在数值工作中很有用的函数,例如 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. b 等价于 a.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。当然,请注意,这种用法要求您的操作系统或 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= 在使用后不能从参数中省略。

示例代码

[edit | edit source]

参见 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


华夏公益教科书