1.Fortran基础知识
1.1 Fortran字符集
Fortran使用的字母表(不局限与字母可以是数字和符号)称为字符集。Fortran2008字符集中有97个符号。它们分别是:
大写英文字母(A-Z)——26个符号;小写英文字母(a-z)——26个符号;数字(0-9)——10个符号;
下划线(_)——1个符号;算术符号(+ - * / **)——5个符号;其他符号( ( ) . = , ' $ : ! " % & ; < > ? ~ \ [ ] ` ^ { } | # @ and blank )——29个符号
注意:Fortran对大小写不敏感。大写的A和小写的a是相同的字符。
1.2 Fortran语句结构
Fortran语句的两种基本类型:可执行语句和不可执行语句(注释语句)。
Fortran中每行最多可以包括132个字符,如果语句太长那么用&符号对语句进行连接。(在这一行的末尾和下一行的开始都需要写上&符号)Fortran中一个语句最多可以写256行。注释语句放到符号“!”号的后面,fortran不会对“!”号后面的内容进行编译。注释语句帮助说明程序的相应操作。
1.3 Fortran程序结构
Fortran程序分为三个部分:
a. 声明部分:定义程序名(程序名的第一个字符必须是字母),程序引用的数据和变量的类型。
b. 执行部分:描述程序的操作。
c. 终止部分:终止程序的操作。
常用Fortran程序书写格式:保留字都大写如,PROGRAM, READ,WRITE,END,常量用大写,对于变量使用小写字母,而且下划线出现在两个名字中间,如first_varabile。过程名(SUBROUTINE gauss,FUNCTION gauss)也小写。
采纳程序书写格式,在写程序时保持这一书写格式
1.4 Fortran程序编译和链接
在运行Fortran程序之前必须利用Fortran编译器把程序编译为目标码(编译),然后利用计算机系统产生可执行程序(链接)。
1.5 常数与变量
Fortran常数是数据对象,定义在程序执行之前而且程序执行的过程中其值保值不变。当Fortran编译器遇到常数时,它将常数放置到一个位置已知的内存单元,无论何时使用该常数,就引用该内存单元。
Fortran变量是数据对象,定义在程序执行之前而且程序执行的过程中可以通过赋值语句改变其值。当Fortran编译器遇到变量时,它经变量放到一个位置已知的内存单元,无论何时使用该变量就引用该内存单元。
注意:程序中尽可能使用有意义的变量名
Fortran有五种自带的数据类型(整型,实型,复型,逻辑型,字符串),下面将介绍这五种数据类型的声明,赋值和基本的运算。更高级的数据类型将在后面的学习笔记中进行总结。
Fortran中的变量运算有+,-,*,/和**。操作的优先级是(按从高到低的顺序进行排列):**,* /,+ -。
Fortran中的算术运算遵循下面的规则:
1.两个操作符不能连续出现。a*-b是非法的,a*(-b)是合法的;a**-2是非法的,a**(-2)是合法的。
2.进行乘法运算时需要写出乘法符号不能对乘法运算进行暗示。
3. 当算术运算出现在括号里时,先对括号里面的内容进行计算。如果表达式中有多个括号的时候,先对最里面的括号进行运算。
1.5.1 整型常数和变量
整型数据由整型常数和整型变量组成。这一类数据不能表示小数部分。逗号不能嵌入整型数据中而且数据中不能包括小数点。整型数据的正确定义如下:-100 +100
不正确的定义如下:1,00,00 10.
整型数据的声明如下:INTEGER(KIND=4) ::
整型常数的声明如下:INTEGER(KIND=4), PARAMETER :: N=3.141592653, TWO=2*N
整型变量的声明如下:INTEGER(KIND=4) :: a,b,c
整型数据的运算:
1/4=0 2/4=0 3/4=0 4/4=1 5/4=1 8/4=2 10/4=2
因为整型运算只涉及整数,所以得到的结果只包括整数部分不包括小数部分。
1.5.2 实型常数和变量
实型数据由实型常数和实型变量组成。实型数据可以用也可以不用指数形式书写。如果用指数形式书写,指数由字母E(单精度)或D(双精度)后随整数或负数组成。当用指数形式进行书写的时候,指数的底是10.下列举例是合法的实型常数:
1.0
1.0E3 或1.0E+3
1.0E-3
下面的举例是非法的实型常数:
11E3 (11是整数不是实数,需要在11的后面加.)
11.E(-3) (E后面去掉括号)
11.E-3.3 (指数部分不能是小数)
实数由两部分组成:尾数和指数。
实型数据的声明如下:REAL(KIND=4) ::
实型常数的声明如下:REAL(KIND=4),PARAMETER :: PI=3.141592653
实型变量的声明如下:REAL(KIND=4) :: length
实型数据的运算:
3./4.=0.75 4./4.=1. 5./4.=1.25
因为计算机的字长有限所有以有些实数的表示并不精确。如1./3.在计算机中的值是0.33333333333.而且3.*(1./3.)的结果此时并不会等于1. 所以在对两个实数进行是否相等比较的时候,需要使用下面的语句:abs(a-b)<=10E-6来判断。这里a,b是两个实数。
整型数据和实型数据的混合运算
下面对整型和实型的混合运算进行距离:
3./2=1.5 1.+1/4=1. 1+1./4=1.25
3./2 先把2转换成与3.相同精度的实数然后进行运算,1.+1/4由于除法的优先级高于加法所以先计算1/4,结果为零然后在加上实数1.所以最后的结果是1. 1+1./4除法的优先级高,所以先将1./4中的整数4转化为与1.相同精度的实数计算得到0.25然后与1进行相加,在做加法之前先把1转换成与1./4精度相同的实数,最后的结果为1.25。
对于混合运算result=x**n。
如果n是实数那么上式使用下面的公式进行计算:
x**n=e^(n*lnx)
当用这个公式时,它比普通的连乘方法需要的时间更长,精度更低所以尽量给出一个实数的整数幂而不是实数幂。即无论何时都使用整型指数而不是实型指数
如果x是正实数那么n既可以是整数也可以是实数;如果x是负实数那么n只能是整数。
在编写程序的过程中要保证实数的取值一样。例如,不要在程序的一个地方pi的取值是3.14,另一个地方是3.14159。最好给计算机能接受的精度值。
1.5.3 字符常量和变量
字符类型由字母和字符串组成。一个字符常数是由单引号(')或双引号(")括住的字符串。
字符型数据的声明:CHARACTER(len=10) :: CHARACTER(10) ::
字符型变数的声明:CHARACTER(len=5) :: message="error" (初始化字符串)
字符型变量的声明:CHARACTER(len=10) :: first,second 定义两个长度为10的字符串
上面的定义又可以写成 CHARACTER(10) :: first, second
CHARACTER :: a 定义一个长度为1的字符串
1.5.4 逻辑型常量和变量及关系运算符
逻辑数据类型包括两个可能的数据类型的一个: TRUE 或者是 FALSE。逻辑常数可以是下面两个中的一个: .TRUE. 或 .FALSE.(在两边有.来区别变量)
逻辑变量使用LOGICAL语句来声明:
LOGICAL :: a,b
关系运算符
== 等于 /= 不等于
>= 大于或等于 > 大于
<= 小于或等于 < 小于
注意不要将等值(==)运算符与赋值(=)运算符混淆。
1.5.5 复型常量和变量
一个复型常量由包含在括号内的被逗号隔开的两个数字常数组成。第一个数字常数表示复数的实部,第二个数字表示复数的虚部。
复型数据的声明: COMPLEX(KIND=4) :: a
复型变量的声明: COMPLEX(KIND=4):: PI=(3.141,,3.141) (初始化复数)
COMPLEX(KIND=4) :: PI
1.6 IMPLICIT NONE语句
如果在程序中没有指定变量的类型,那么就是默认的变量定义类型。默认的变量定义类型是:
任何以I,J,K,L,M和N开头的变量都是整型,以其他字母开头的变量则为实型。
IMPLICIT NONE语句使得Fortran默认的变量定义类型失效。IMPLICIT NONE出现在PROGRAM之后和类型声明语句之前。使用IMPLICIT NONE语句后程序员需要定义所有的变量并声明其类型。在编译时这样更能够发现由于打错变量中字母的错误。另一个优点是使代码更容易维护。
建议:在编程时使用IMPLICIT NONE语句。