FortranFortran入门


备注

Fortran是一种在科学界广泛使用的语言,因为它适用于数值计算。特别有吸引力的是其直观的数组符号,这使得快速矢量化计算的编写变得容易。

尽管它已经成熟,但Fortran仍在积极开发中,有许多实现,包括GNU,Intel,PGI和Cray。

版本

注意发布
FORTRAN 66 ASA首次标准化(现为AN​​SI) 1966年3月7日
FORTRAN 77 固定形式,历史性 1978年4月15日
Fortran 90 自由形式,ISO标准,阵列操作 1991年6月15日
Fortran 95 纯粹的元素程序 1997年6月15日
Fortran 2003 面向对象编程 2004年4月4日
Fortran 2008 联合数组 2010-09-10

不区分大小写

Fortran字符集中的大写和小写字母相同。换句话说,Fortran 不区分大小写 。这种行为与区分大小写的语言形成对比,例如C ++和许多其他语言。

因此,变量aA 是相同的变量。原则上,人们可以编写如下程序

pROgrAm MYproGRaM
..
enD mYPrOgrAM
 

对于优秀的程序员来说,避免这种丑陋的选择。

你好,世界

任何Fortran程序都必须包括end 作为最后一个语句。因此,最简单的Fortran程序如下所示:

end
 

以下是“hello,world”程序的一些示例:

print *, "Hello, world" 
end
 

write 语句:

write(*,*) "Hello, world"
end
 

为清楚起见,现在通常使用program 语句来启动程序并为其命名。然后, end 语句可以引用此名称以明确它所引用的内容,并让编译器检查代码的正确性。此外,所有Fortran程序都应包含一个implicit none 语句。因此,最小的Fortran程序实际应该如下所示:

program hello
  implicit none
  write(*,*) 'Hello world!'
end program hello
 

从这一点开始,下一个合乎逻辑的步骤是如何查看hello world程序的结果。本节介绍如何在类似Linux的环境中实现这一点。我们假设您有一些shell命令的基本概念,主要是您知道如何到达shell终端。我们还假设您已经设置了fortran 环境 。使用首选的文本编辑器(记事本,记事本++,vi,vim,emacs,gedit,kate等),将上面的hello程序(复制和粘贴) hello.f90 在主目录中名为hello.f90 的文件中。 hello.f90 是你的源文件。然后转到命令行并导航到保存源文件的目录(主目录?),然后键入以下命令:

>gfortran -o hello hello.f90
 

您刚刚创建了hello world可执行程序。在技​​术方面,您刚编译了您的程序。要运行它,请键入以下命令:

>./hello
 

您应该在shell终端上看到以下行。

> Hello world!
 

恭喜,您刚刚编写,编译并运行了“Hello World”程序。

安装或设置

Fortran是一种可以使用许多供应商提供的编译器编译的语言。不同的编译器可用于不同的硬件平台和操作系统。有些编译器是免费软件,有些可以免费使用,有些需要购买许可证。

最常见的免费Fortran编译器是GNU Fortran或gfortran。源代码可以从GNU获得,作为GCC(GNU编译器集合)的一部分。许多操作系统的二进制文件可在https://gcc.gnu.org/wiki/GFortranBinaries上找到 。 Linux发行版通常在其包管理器中包含gfortran。

可以使用其他编译器:

在HPC-Systems上,系统提供商通常提供专门的编译器,例如IBMCray编译器。

所有这些编译器都支持Fortran 95标准。 ACM Fortran论坛提供了各种编译器对Fortran 2003状态Fortran 2008状态的概述,并在Fortran Wiki中提供。

二次方程

今天Fortran主要用于数值计算。这个非常简单的例子说明了求解二次方程的基本程序结构:

program quadratic
  !a comment

  !should be present in every separate program unit
  implicit none

  real :: a, b, c
  real :: discriminant
  real :: x1, x2

  print *, "Enter the quadratic equation coefficients a, b and c:"
  read *, a, b, c

  discriminant = b**2 - 4*a*c

  if ( discriminant>0 ) then

    x1 = ( -b + sqrt(discriminant)) / (2 * a)
    x2 = ( -b - sqrt(discriminant)) / (2 * a)
    print *, "Real roots:"
    print *, x1, x2

    ! Comparison of floating point numbers for equality is often not recommended. 
    ! Here, it serves the purpose of illustrating the "else if" construct. 
  else if ( discriminant==0 ) then

    x1 = - b / (2 * a)
    print *, "Real root:"
    print *, x1
  else

    print *, "No real roots."
  end if
end program quadratic