Fortran学习笔记1: Fortran基础知识
1.1 Fortran字符集
Fortran语言使用的特殊字母表被称为Fortran字符集。目前Fortran字符集由97个字符组成:
符号个数 | 类型 | 取值 |
---|---|---|
26 | 大写字母 | A~Z |
26 | 小写字母 | a~z |
10 | 数字 | 0-9 |
1 | 下划线 | _ |
5 | 算数符号 | + - * / ** |
28 | 其他各种符号 | ().+.'$: ! " % & ;<>?和空格 ~\[ ] ` #@和空格 |
Fortran对字母大小写不敏感。A和a是两个相同的字母。
1.2 Fortran语句结构
语句分类:可执行部分+不可执行部分。
&符号:进行标记并在下一行继续这一行书写,直到结束。
!符号:注释说明符号。
语句标号:第四行,以数字开始,语句标号可以是1~99999中任何一个数字,是Fortran语句中的“名字”,使用它可以在程序的其他地方引用这条语句。标号数字在程序单元中必须是唯一的。
output = input1+input2 !求和输入值
output = input1 &
+input2 !求和输入值
999 output = input1 & !求和输入值
&+input2
1.3 Fortran程序结构
PROGRAM my_first_program
! 本程序主要说明Fortran语言的基本特点
! 声明程序中用到的变量
INTEGER::i,j,k !所有变量均为整型
! 获取存入变量i和j的值
WRITE(*,*)'Enter the numbers to multiply'
READ(*,*)i,j
!求两个数的相乘
k = i * j
!输出计算结果
WRITE(*,*)'Result = ',k
END PROGRAM my_first_program
Fortran程序主要分为三个部分:
- 声明部分:一组不可执行语句组成,位于程序开头(PROGRAM),定义程序名(第一个字符必须是字母)和程序引用的数据及其变量的类型。如果存在PROGRAM语句,必须是程序的第一个语句行。
- 执行部分:多条语句构成,描述程序完成的操作。
- 终止部分:一条语句或终止程序执行的语句组成,告诉编译器程序结束。
1.3.1 声明部分
声明部分由不可执行语句组成,位于程序的开头,定义程序名和程序引用的数据以及变量的类型。
这一部分的第一条语句是PROGRAM语句。它对Fortran编译器指定程序的名字。Fortran的程序名可长达63个字符,还可以是字母、数字和下划线任意组合而成的字符串。但是, 程序名的第一个字符必须是字母 。如果存在PROGRAM语句,它必须是程序的第一个语句行。在这个例子中,程序被命名为my_first_program。
程序中的下面几行是注释,描述程序的作用。再下面跟随INTEGER类型声明语句,这条不可执行语句在本章后面有介绍。这里,它声明程序要用的整型变量I、J和K。
1.3.2 执行部分
执行部分由一或多条执行语句组成,描述程序将完成的操作。这个程序的第一条可执行语句是WRITE语句,它输出信息,提示用户键入两个待相乘的数据。下一条执行语旬READ语句,读入两个用户提供的整型数。第三条执行语句指示计 算机乘以两数1和j,结果存储在变量k。最后一条WRITE语句打印用户看到的结果。注释被嵌入在整个执行部分的任意位置。
1.3.3 终止部分
终止部分由STOP和END PROGRAM语句组成。 STOP语句告诉计算机停止运行。 END PROGRAM语句告诉编译器程序中不再有语句需要编译。
STOP语句格式有如下形式:
STOP
STOP 3
STOP 'Error stop'
如果只使用STOP语句,则执行将停止。如果STOP语句与数字一起使用,则程序停止时将打印出该数字,通常将作为错误代码返回给操作系统。如果STOP语句与字符串一起使用,则程序停止时将打印出该字符串。
当STOP语句紧挨着出现在END PROGRAM语句之前,它是可选的;当到达END PROGRAM语句时,编译器将自动地产生一条STOP语句。
有一个替代版本的STOP语句叫做 ERROR STOP 。该版本停止程序,但它也通知操作系统程序无法正常执行。
ERROR STOP 'Cannot access database'
此版本的STOP语句已在Fortran 2008中添加,如果需要通知操作系统,脚本程序异常失败,可能会很有用。
1.3.4 程序书写格式
一般Fonran编程原则:
- 保留字都大写,如PROGRAM、READ和WRITE
- 程序的变量用小写字母表示。
- 名字中的下划线出现在两个字之间。
- 大写字母作为常量名。
由于大写和小写字母在Fortran中作用相当,所以程序按任何一种方式来书写都可以。
1.4 常数与变量
1.4.1 Fortran中的常数与变量
Fortran常数是 数据对象 ,它定义在 程序执行之前 ,且在 程序执行期间取值不可改变 。当Fortran编译器遇到常数时,它将常数放置在一个位置已知的内存单元,无论何时程序使用常数,就 引用该存储位置。
变量是一个 数据对象 ,它的值在程序执行期间可以改变(Fortran变量的取值可以在程序执行前初始化,不初始化也行)。当Fortran编译器遇到变量时,它给变量 预留已知的内存单元 ,无论何时程序使用变量,就 引用该存储位置 。
程序单元中的每个Fortran变量有唯一的名字,变量名是内存中特定位置的标号,该标号方便人类记忆和使用。Fortran中的变量名可以长达 63个字符 ,由 字母 、 数字 和 下划线字符 的任意组合构成,但是名字的 第一个字符总必须是字母 。
在编写的程序的开头包含 数据字典 非常重要,数据字典列出了 程序中每个变量的定义 ,定义含有两项内容: 数据项内容 和 数据项占用几个存储单元 的描述。写程序的时候,看上去数据字典可以是不必要的,但是当后期自己或其他人不得不修改程序时,它就价值无限。
Fortran有5个自带或“内置”的常数和变量数据类型:
- 数字类: INTEGER,REAL,COMPLEX
- 逻辑类: LOGICAL
- 字符类: CHARACTER
1.4.2 定义变量类型
-
默认方式
任何以字母i,j,k,l,m,n开头的变量名假定为 INETEGER ,其他字母开头的变量名则假定为 REAL 。默认情况下没有变量的类型为字符型。 -
显式定义
格式
INTEGER:: var1[,var2, var3,... ]
REAL:: var1[,var2,var3,... ]
这里 [ ] 中的内容是可选的。在这种情况下,括号内的内容说明可以在一行中同时定义两个或多个变量,变量之间用逗号隔开。这些不可执行的语句称为类型声明语句。放在 PROGRAM语句之后,第一条可执行语句之前。
所有字符变量必须显式地用CHARACTER声明语句声明,格式:
CHARACTER(LEN=<len>):: var1[,var2,var3,... ]
<len>是变量中的字符数目,是可选的(默认为1)。假如圆括号中有数字,那么这个数字是语句声明的字符变量的长度。
15 赋值语句与算数运算
1.5.1 操作顺序
为了能明确地计算表达式,Fortran已经建立一系列规则来管理表达式中操作符的级别或计算顺序。
通常,Fortran遵循代数中的一般规则,这其中的运算操作计算顺序是:
- 首先做圆括号内的计算,且内层括号比外层括号优先。
- 再从右到左做指数运算。
- 从左到右做乘法和除法运算。
- 从左到右做加法和减法运算。
1.5.2 混合运算
含有实数和整数的表达式被称为混合模式的表达式,涉及实数和整数操作的运算称为混合模式运算。 在进行实数与 整数操作的情况下,计算机将整数转换为实数,然后进行实数运算,结果是实数类型。
- 当运算操作是在两个实型数据上完成,则结果的类型为REAL。
- 操作是在两个整型数上执行,则结果是INTEGER。
- 在进行实数与整数操作的情况下,结果是实数类型。
表达式 | 结果 |
---|---|
1+1/4 | 1 |
1.+1/4 | 1 |
1+1./4 | 1.25 |
尽量避免混合模式表达。
1.5.3 Fortran五种转换函数
函数名和参数 | 参数类型 | 结果类型 | 返回值说明 |
---|---|---|---|
INT(X) | REAL | INTEGER | X的整型部分(X被截尾) |
NINT(X) | REAL | INTEGER | 接近X的整数(X被四舍五入) |
CEILING(X) | REAL | INTEGER | 大于或等于X最小的整数值 |
FLOOR(X) | REAL | INTEGER | 小于或等于X最大的整数值 |
REAL(I) | INTEGER | REAL | 整数转换为实数 |
1.6 内置函数
Fortran的部分常用内置函数:
函数名和参数 | 参数类型 | 结果类型 | 说明 |
---|---|---|---|
SQRT(X) | REAL | REAL | 大于0的平方根 |
ABS(X) | REAL/INTEGER | * | 求X绝对值 |
ACHAR(I) | INTEGER | CHAR(I) | 返回在ASCII表上I位置上的字符 |
SIN(X) | REAL | REAL | X的正弦(X必须是弧度值) |
SIND(X) | REAL | REAL | X的正弦(X必x须是角度值) |
COS(X) | REAL | REAL | X的余弦(X必须是弧度值) |
COSD(X) | REAL | REAL | X的余弦(X必x须是角度值) |
TAN(X) | REAL | REAL | X的正切(X必须是弧度值) |
TAND(X) | REAL | REAL | X的正切(X必须是角度值) |
EXP(X) | REAL | REAL | e的X次幂 |
LOG(X) | REAL | REAL | X的自然对数,其中X>0 |
LOGIO(X) | REAL | REAL | 基数10的对数,其中X>O |
IACHAR(C) | CHAR(I) | INTEGER | 返回字符C在ASCll表上对照顺序的位置值 |
MOD(A,B) | REAL/INTEGER | * | 模函数的余数 |
MAX(A,B) | REAL/INTEGER | * | A和B中的更大值 |
MIN(A,B) | REAL/INTEGER | * | A和B中的更小值 |
ASIN(X) | REAL | REAL | X的反正弦,-1<=x<=1 (结果是弧度值) |
ASIND(X) | REAL | REAL | X的反正弦,-1<=x<=1 (结果是角度值) |
ACOS(X) | REAL | REAL | X的反余弦,-1x\le1 (结果是弧度值) |
ACOSD(X) | REAL | REAL | x的反正切,-\pi/2<=x<=\pi/2(结果是弧度值) |
ATAN(X) | REAL | REAL | x的反正切,-90<=x<=90(结果是角度值) |
ATAND(X) | REAL | REAL | x的反正切,-\pi/2<= x<=\pi/2(结果是弧度值) |
ATAN2(Y/X) | REAL | REAL | x四象限的反切函数-\pi<= x<=\pi(结果是弧度值) |
ATAN2D(Y,X) | REAL | REAL | x四象限的反切函数-180<= x<=180(结果是弧度值) |
1.7 表控输入和输出语句
1.7.1 输入语句(READ)
READ(*.*)input_list
input_list :读入的值放置在里面的变量列表。如果列表中有多个变量,它们用逗号分隔。
(*,*) :含有读入操作的控制信息。
圆括号的第一数据域:指明从哪个 输入/输出单元 (或io单元)读入数据(输入/输出单元)。这个域中的 星号 意味着数据是从 计算机的标准输入设备上读入 ,通常在交互模式下是键盘。
圆括号的第二个数据域:指明读入 数据的格式 。这个域的星号意味着使用 表控输入 (有时被称为 自由格式 输入)。
list-directed input (表控输入):意味着变量列表中的变量类型决定输入数据需要的格式。对于表控输入,输入数据值的类型和顺序必须与提供的输入数据的类型和顺序匹配。
1.7.2 输出语句(WRITE)
WRITE(*.*)output_list
output_list :输出的数据项列表(变量、常数或表达式)。如果在列表中有多个数据项,那么数据项应该用逗号隔开。
(*,*) :含有输出的控制信息。与输入语句类似。
1.8 变量初始化
在Fortran程序中有三种有效技术初始化变量: 赋值语句 、 READ语句 和 类型声明语句 中的 初始化 。
1.8.1 赋值语句初始化
格式:
PROGRAM init_1
INTEGER:: i
i = 1
WRITE(*,*)i
END PROGRAM init_1
1.8.2 READ语句初始化
格式:
PROGRAM init_2
INTEGER:: i
READ(*,*)i
WRITE(*,*)i
END PROGRAM init_2
1.8.3 类型声明语句初始化
格式:
PROGRAM init_3
INTEGER::i=1
WRITE(*,*)i
END PROGRAM init_3
1.9 IMPLICIT NONE 语句
1.4中介绍到,Fortran的默认变量声明格式为:
任何以字母i,j,k,l,m,n开头的变量名假定为 INETEGER ,其他字母开头的变量名则假定为 REAL 。默认情况下没有变量的类型为字符型。
IMPLICIT NONE 语句使Fortran中默认提供输入值的功能丧失。当程序含有IMPLICIT NONE语句,没有出现在显式类型声明语句中的变量被认为是错的。IMPLICIT NONE语句出现在 PROGRAM语句之后和类型声明语句之前 。
当程序含有IMPLICIT NONE语句,程序员必须显式声明程序中每个变量的类型。
在程序中始终显式地定义每个变量,用IMPLICIT NONE语句帮助在执行程序前查找和改正印刷错。
1.10 调试Fortran程序
为减少调试错,保证设计程序时:
- 使用IMPLICIT NONE语句。
- 返回所有输入值。
- 初始化所有变量。
- 用圆括号使赋值语句的功能更清晰。
1.11 小结
1.11.1 遵循原则
- 尽可能给变量取 有意义的名字 。以便一瞥就可以理解变量的作用。
- 在程序中始终用 IMPLICIT NONE 语句,以便编译时,编译器捕获打字错。
- 在编写的程序中 创建数据字典 。数据字典应该明确地声明和定义程序的每个变量。如果是应用题,还要记得保证每个物理量要有相应的计量单位。
- 常数的取值要始终一致。
- 保证给所有常数指定所用机器支持的相应精度。
- 真实世界连续变化的量不该用整型数据来计算,如距离、时间等。仅对固定值使用整型数,如计数器。
- 除指数运算外, 尽量不要使用混合模式运算 。
- 必要的时候用更多的 圆括号 来改进表达式的可读性。
- 总是返回用键盘为程序提供的输入数据,以保证它们被正确地键入和处理。
- 在使用之前, 初始化程序中的所有变量 。可以用赋值语句、READ语句和声明语句中的直接赋值来初始化变量。
- 总是打印输出数据值相应的计量单位,计量单位对于理解程序的结果很有用。
1.11.2 语法小结
- PROGRAM语句
!格式
PROGRAM program_name
PROGRAM my_ program
PROGRAM语句指定Fortran程序的名字,它必须是程序的第一条语句,名字必须是唯一的,不能与程序中的变量名相同。程序名由1~31个字母、数字和下划线字符组成,但是程序名的第一个字符必须是字母。
- END PROGRAM语句
END PROGRAM [name]
END PROGRAM语句必须是Fortran程序段的最后一条语句。它告诉编译器不再有语句需要处理。当遇到END PROGRAM语句,程序执行停止。END PROGRAM中的程序名是可选项。
- 赋值语句
!格式
variable=expression
pi = 3.141593
distance = 0.5 * acceleration * time ** 2
side = hypot * cos(theta)
赋值语句的左边必须是变量名。右边可以是常数、变量、函数或表达式。等号右边的数量值存储到等号左边的变量名中。
- STOP语句
STOP
STOP n
STOP 'message'
STOP语句停止Fortran程序的执行。一个Fortran程序可以有多条STOP语句,每条STOP语句紧接在END PROGRAM语句之前就可以省略,因为当执行到END PROGRAM语句时程序也停止。
- ERROR STOP语句
ERROR STOP
ERROR STOP n
ERROR STOP 'message'
ERROR STOP语句停止Fortran程序的执行,告知操作系统发生了一个执行错。
- IMPLICIT NONE语句
IMPLICIT NONE
IMPLICIT NONE语句关闭Fortran的默认类型定义。当在程序中使用这条语句,程序中的每个变量都必须在类型声明语句中显式声明。
- INTEGER语句
!格式
INTEGER::variable—name1 [, variable_name2,...]
INTEGER::i,j,count
INTEGER: : day=4
INTEGER语句是类型声明语句,它声明整型数据类型的变量。这条语句重载Fortran中指定的默认类型。
- REAL语句
!格式
REAL: :variable_name1[ ,variable_name2,...]
REAL::variable name=value
REAL::distance,time
REAL::distance,time
REAL语句是类型声明语句,它声明实型数据类型的变量。这条语句重载Fortran中指定的默认类型。
- CHARACTER语句
!格式
CHARACTER(len=<len>):: variable_name1 [,variable_name2,... ]
CHARACTER(<len>) : : variable_name1 [,variable_name2,... ]
CHARACTER:: variable—name1 [,variable_name2,... ]
CHARACTER(len=10)::first,last,middle
CHARACTER(10)::first = 'My Name'
CHARACTER::middle_initial
CHARACTER语句是类型声明语句,它声明字符数据类型的变量。每个变量的字符长度用(len=<len>)或<len>指定。如果缺省长度声明,那么变量的默认长度是1。CHA肚CTER变量的取值可以在声明的时候用字符串初始化。
- READ语句(表控READ)
!格式
READ(*.*) variable_name1 [, variable_name2,... ]
READ(*.*)stress