Brief Notes On Fortran Language
程序结构
我们先从一个最简单的Fortran程序看起
1 | program HelloWorld |
当我们使用Fortran语言的时候,主程序要写在program
和end program
之间,且program
之后需要跟程序的名称,这个名称不必和文件名相同。
Fortran使用!
标志注释行。implicit none
的作用是要求程序不使用隐式变量声明(不然的话i,j,k,l
这些会默认为整数类型)。
输入输出
在上述程序中,我们使用了write
函数,这个函数接受两个参数。一个是输出的开始位置,默认为6(非默认情形我们稍后讨论),另外一个是格式化参数。Fortran中的输出函数还有print
,它只接受一个参数,即格式化参数,换而言之,他只能输出到屏幕上。
read
函数有两种写法read(*,*)
和read *,
,分别类似于write
和print
。
输出的格式化按照如下的方式进行,输入同理。
Iw[.m]
以w个字符的宽度来输出整数,至少输出m个数字。Fw.d
以w个字符文本框来输出浮点数,小数部分占d个字符宽,输出文本框的设置不足显示*号。输出不足补空格,小数不足补0。Ew.d[Ee]
用科学计数法,以w个字符宽来输出浮点数,小数部分占d个字符宽,指数部分最少输出e个数字。 !输出不足部分补空格,小数部分不足补0。Aw
以w个字符宽来输出字符串。nX
输出位置向右移动n位。
数据类型
Fortran中的数据类型有整型(integer)、实型(real)、复数型(complex)、逻辑型(logical)、字符型(character)等。
整数和实数类型的使用方式类似C语言,但是可以通过(kind=n)
的形式来指定精度,当然括号中的是可选部分。
1 | integer(kind=4) :: int_num |
Fortran是少有的原生支持复数类型的语言,复数以类似向量的方式来表示,
1 | complex :: a,b |
此外还有字符串类型和逻辑类型,如果字符串类型没有初值,则必须指定长度,
1 | character str_1='abcd' |
如果接下来赋给str_2
的值的长度大于10,则会自动截断到10。
逻辑判断类型无需多说,其使用方式为
1 | logical a,b |
Fortran中的数组定义有两种方式
1 | integer :: student(5) !一维数组 |
值得注意的是,Fortran中的数组索引从1开始,而且按列索引。
以下是一些数组的操作的例子
1 | integer :: a(3,3),b(3,3),c(3,3),d(5),e(5),f |
Fortran中可以声明可变大小的数组,只要在声明的时候加上allocatable的形容词,并注明是数组的维度,在后续需要确定大小的时候为数组配置内存空间即可。
1 | program allocatable_array |
条件判断
if语句
Fortran中的if
语句和C语言是类似的(其实多数程序设计语言在这里都是类似的,而且说Fortran类似C本身并不合适,因为Fortran是最古老的程序设计语言,如果某个语言与之相似,则应该该语言借鉴了Fortran,不过按照现在的现在普遍规律,多数人都应该先学C语言再学的Fortran,为了便于大家理解Fortran所以说Fortran类似C)。
1 | if (logical expression) then |
当然还有if... (else if..). else ...
的结构
1 | if (logical expression 1) then |
我们可以给if
语句一个名字
1 | name if (logical expression 1) then |
当然不止if
语句有这样的功能,Fortran中的所有块都可以给一个名字。
select case语句
select case
类似于C语言中的switch case
,但是功能上更加灵活,支持简单的比较判断,支持整数,字符类型。
1 | program selectCaseProg |
循环
do循环
Fortran中的do
循环类似于C语言中的for
循环,其基本格式为
1 | do var = start, stop [,step] |
var
需要是一个整数,step
的默认值是1。
do while循环
do while
循环类似于C语言中的while
循环。
1 | do while (logical expr) |
循环的控制语句
exit语句
exit
语句终止循环或select case
语句,并将执行立即循环或select
下面的语句。这个时候,给循环赋一个名字就很有用,当循环是嵌套的时候,可以直接指定退出某一层循环
1 | program nestedLoop |
circle语句
这个类似于C语言中的continue
,将会跳过循环的剩余部分,开始下一段循环。
stop语句
stop
语句的作用是停止程序的执行,后面可以跟着字符串和数字,表示返回值。
函数
Fortran中自定义代码片段两种:子程序subroutine
和自定义函数function
,他们的不同之处在于返回值和传参方式
子程序
子程序的一般结构为
1 | subroutine name(arg1, arg2, ....) |
它没有返回值,但是子程序可以修改传入的参数的值。
自定义函数
自定义函数的一般格式为
1 | function add(a,b) |
自定义函数有返回值,且传入的只是变量值,自定义函数外的变量不会受到影响。
文件操作
Fortran的文件操作比C语言要简单很多,主要依赖于open
,close
,read
,write
四个函数。
在对某一个文件进行处理之前,需要打开该文件,最简单的方法是
1 | open (unit = number, file = "name") |
接下来对该文件进行读写只要使用write
和read
函数就可以
1 | write(number,*) "string" , num |
当这个文件不再被使用的时候,应该使用close
关闭
1 | close(unit=number) |