目录
Fortran相关基础
1. 语言字符
英文字母大小写不敏感。program 与 PROGRAM、变量 a 与变量 A 的效用是一样的。
2. 语句结构
- 每一行可以输入132个字符,可以用
&
,置于行末或行首,用于连接下一行或上一行; - 注释符号
!
,属于不编译语句,用于说明,可以放在任何位置; - 语句标号,用于行首,代表是该行的“名字”,具有唯一性,如下所示。一般不建议使用,影响程序可读性。
100 write(*,*) "Hello, World !" ! 100 即是本行语句的名字
999 write(*,*) "Hello, Fortran !" ! 999 即是本行语句的名字
3. 程序结构
1) 组成
- Fortran程序单元由三个部分构成:声明部分、执行部分、终止部分,如下方所示;
- 声明部分:声明程序名称、描述程序用途、声明变量类型;
- 执行部分:程序运算过程;
- 终止部分:通知程序编译结束。
! 声明部分
PROGRAM my_test ! 程序名,最多可长达63个字符
! test
INTEGER::i,j ! 声明两个整形变量
! 执行部分,将输入屏幕的两个数相加并打印出来
WRITE(*,*)"Please enter the figures to add together"
READ(*,*)i,j
res = i + j
WRITE(*,*)"Result = ",res
! 终止部分
STOP
END PROGRAM my_test
2) 书写格式
不是硬性要求,因为程序对字母大小写不敏感,目的为了保持程序书写格式的前后一致,提高可阅读性。
- 保留字、常量均大写,如
PROGRAM
、WRITE
、PI
等; - 变量名、过程名、程序名均小写,如
i
、j
、my_test
等。
4. 常量与变量
1) 基本特性
- 常量(常数)需事先定义(初始化),在执行过程中不可变,需要保持前后一致,用属性
PARAMETER
声明; - 在声明部分中,变量可以初始化,也可不初始化(在执行部分中再定义),在执行过程中可变;
- 变量命名最长可达63个字符;
- 首字符为字母,由字母、数字、下划线
_
构成 ; - 命名尽量要有意义,提高可读性;
- 数据类型较为常用的主要有5种,
INTEGER
、REAL
、COMPLEX
、LOGICAL
和CHARACTER
;
2) INTEGER
整数
- 整数部分,如果是正数,
+
可加可不加; - 不能含有小数点,如
100.
是不合理的; - 逗号不能嵌入整数中,如
100,100
是不合理的。
3) REAL
实数
- 用小数部分来表示,如果是正数,
+
可加可不加,用十进制来表示;如100.
,111.23
,+200.
等; - 可用或不用指数
E
(对应的幂是10)来表示,如2.5E10
(表示2.5×1010),3.2E-3
(表示3.2×10-3)等; - 逗号同样不能嵌入实数中,如
100,100.
是不合理的。
4) COMPLEX
复数
- 由实部和虚部两个部分组成,两部分的数字必须是实数;
- 采用
(a , b)
的形式进行计算,表示为a+bi
。
5) LOGICAL
逻辑
-
仅包括两个数值
.TRUE.
和.FALSE.
,注意数值两边有两个点。有两种运算类型:- 关系运算
用于两个数字或字符的逻辑运算,有:
==
等于
/=
不等于
>
大于
<
小于
>=
大于或等于
<=
小于或等于
最终返回一个逻辑结果(T
/F
)。 - 组合运算
用于一个或多个逻辑对象(.TRUE.
或.FALSE.
)的逻辑运算(注意符号左右同样有两点),有:
.AND.
逻辑与
.OR.
逻辑或
.EQV.
逻辑等
.NEQV.
逻辑不等
.NOT.
逻辑非
最终返回一个逻辑结果(T
/F
)。
- 关系运算
-
由于逻辑运算也有一定的计算顺序,在不明确计算先后顺序时,最好使用
()
。 -
逻辑值通过
READ
来输入时,真值可输入.TRUE.
或T开头的字符串
,假值可输入.FALSE.
或F开头的字符串
,输入其它对象则会报错。
6) CHARACTER
字符
- 由字母字符串组成,用单引号
'
或双引号"
括住; - 字符串中有着重符号,可使用如
'Xiaomao''s friend'
或者"Xiaomao's friend"
- 用单引号括住含有双引号的字符串,可使用如
'"What?"'
- 字符的操作运算可参考:链接。
7) 变量声明显式和默认式
- 如没有显式声明,则通过变量的“样子”的推测其具体的数据类型;
- 如没有显式声明,可通过默认方式确定(只与整型和实型相关):
任何以字母
i
、j
、k
、l
、m
和n
开头的变量名假定为整型INTEGER
,其余字母开头的变量假定为实型REAL
- 变量声明语句:
INTEGER::var1[,var2,var3,...] ! 整型 []为可选参数,不声明可默认
REAL::var1[,var2,var3,...] ! 实型 []为可选参数,不声明可默认
LOGICAL::var1[,var2,var3,...] ! 逻辑型 []为可选参数,必须显式声明
CHARACTER(len=<len>)::var1[,var2,var3,...] ! 字符型,必须显式声明。[]为可选参数,len用于声明字符变量的长度,也是可选参数,缺省时代表字符变量长度为1
type,PARAMETER::name1=var1[,name2=var2,name3=var3,...] ! 常量声明,type是具体的类型,如整型、实型等。如果是字符型,不需声明字符长度len,因为编译器自动计算
5. 赋值与运算
1)赋值 =
name = value
,将value
存储至变量name
中。
2) 运算符号
+
加
-
减
*
乘
/
除
**
指数
- 两个操作符不能连续出现。如
6*-5
是不合理的,要用括号,即6*(-5)
; - 乘法不能隐式运算。如
6(5*10)
是不合理的,要显式,即6*(5*10)
; - 表达式中含多个括号,先计算最里面的括号,从内往外计算(与常规使用相一致)。
3) 运算规则
- 整数运算。输出结果也是整型,如
5/3
计算结果为1.000000
,后面的0
是精度。一般用于计算和索引。 - 实数运算。需要注意的是,计算由于有精度的限制,结果可能与理论值有些许差别。
- 符号运算顺序如下。尽可能使用括号
()
,使计算式清晰明了。
①括号先运算,内括号优于外括号;
②再从右往左做**
运算;
③从左往右做*
和/
运算;
④从左往右做+
和-
运算。
4) 混合运算
在一个表达式中含有一个或多个整数和实数之间的运算操作。由于计算过程难以理解,在实际使用时尽量避免。
- 可以对表达式中的整数和实数变量进行类型转换操作。
- 对指数进行操作时,最好是采用整型指数,而不是实数型指数。如ab ,即
b
最好是整型,因为是有b
个a
进行相乘,b
用整型来描述是符合真实意义的。如果用实数b
,运算是通过ab=eblna来间接运算,计算时间长、精度降低。
因此,当计算(-5.2)2.1时,会计算出错,因为负数不存在对数。
6. 输入输出与初始化变量
1) 输入
主要有两种输入方式:
- 键盘交互输入
- 文件输入
主要通过语句READ
来输入,具体可参考:READ
链接
2) 输出
主要通过语句WRITE
来输出,具体可参考:WRITE
链接
3) 变量初始化
在使用变量之前,必须要先对其初始化,否则编译器会将变量初始化为0或任意值,甚至会运行报错。
常用初始化的方法有三种:
- 赋值语句
=
。在程序执行时初始化。 - 输入语句
READ
。在程序执行时初始化。 - 类型声明语句,
type::var1[,var2,var3,...]
。在程序开始之前初始化。
在定义变量之前,最好使用
IMPLICIT NONE
语句
-
用处:
PROGRAM
语句之后,type::var1[,var2,var3,...]
语句之前。 -
作用:每个变量必须显式声明(参考上述4.7小节),优点:
- 避免变量名打字错误,即前后变量名字及数值一致,不会由于打字错误从而产生新的变量;
- 如果变量名打字错误,程序会报错并标识错误所在的位置。
-
每个变量都必须要声明其类型,能够帮助检查错误,包括程序在执行部分新增短暂使用的“间接过程变量”,如下所示则会报错:
PROGRAM my_test2 IMPLICIT NONE ! 所有变量须显式声明 REAL::i = 5.0 , j =2.0 res = i ** j WRITE(*,*)"Result = ",res STOP END PROGRAM my_test2
报错内容为:
error #6404: This name does not have a type, and must have an explicit type. [RES]
提示
res
变量没有声明类型。因此需要在声明部分对其进行类型声明REAL::res
,此时程序就能顺利运行。
7. 减少debug的编程习惯
- 尽量在所有程序中使用
IMPLICIT NONE
语句; - 如果使用
READ
语句来对变量进行初始化,则可以通过WRITE
语句及时返回相应变量输入值,减少错误; - 对所有变量都进行初始化处理,避免程序预设定或报错;
- 运算公式尽量使用
()
,使其结构清晰明了。
8. 程序设计思路(常规)
-
清楚地陈述需要解决的问题;
-
定义程序所需的输入和程序产生的输出;
-
设计要在程序中实现的算法,可通过两种方式:
- 伪代码(Fortran语句和符号掺杂在一起的混合体)
- 流程图
-
将算法转换成Fortran语句;
-
测试Fortran程序。