Fortran读书笔记(气象出版社版)

时间:2022-05-24 00:41:37

说明:

本笔记是读书笔记, 记录了本人认为书本的精华, 和简单代码的自行敲击只用于学习交流,  其它违法行为, 与本人无关若有版权冲突, 本人立即删除. 

第一编

本笔记从第5章开始

第二编

第5章

字符集

fortran 中可以使用的字符串

Fortran读书笔记(气象出版社版)

注意: fortran 的字符命名是不区分大小写的, 只有在早期的版本中才不允许小写, 现在都可以了.


保留字(也叫关键字)

保留字分为 语句保留字变元保留字

语句保留字:

program , integer, real, read , print , write, do , end
subroutine, function 等.

变元保留字:

! 例如: 下方的unpack 是fortran 中的内置保留字. 
unpack(vecter,mask, field )
其中的 这个保留字的vector , mask , field 都是变元保留字.


特别注意

1. fortran 中的保留字, 函数名等都可以用作 变量名 , 但是这是要避免的, 因为计算机对于输入内容的阅读性也是需要考虑的.​​

! 例如:
program program ! 这里第一个 program为 保留字, 第二个为主程序名字
implicit none
! [此处为代码块]
end

基本数据类型

总体简介

fortran 中的数据类型

Fortran读书笔记(气象出版社版)

​数据类型有四个性质: 数据类型有四个性质:  

下方性质很重要(我认为)

Fortran读书笔记(气象出版社版)


常量

简介图

Fortran读书笔记(气象出版社版)


整型(要求和不同进制的表示)

Fortran读书笔记(气象出版社版)

! 进制位数 #  数字(你想要输入的数字)
! 例如:
print *,2 #1111000011100011100011 ! 2进制
print*,8 # 177171717 ! 8进制
print*, 39939393 ! 10进制(这里不用用# 号)
print*, #3CF3CF ! 16进制


实型
小数形式

数字的右下角一定要有 点  .  小数点 '. ' , 前后可以不出现数字, 但是不允许小数点前后都不出现数字, 且 小数点不可以少

正确的例子

.4
2.
2.4

注意: 单独的一个 . 是不可以的.


指数类型

例子:

Fortran读书笔记(气象出版社版)

解读:

指数形式表示的实数由两部分组成,即数字部分指数部分.E将数字部分和指数部分分隔,E的右边是指数部分,E的左边是数字部分,表示方式是用E表 


注意点:(很重要)

Fortran读书笔记(气象出版社版)

额外: 书中介绍了计算机存储形式和存储位数(感觉受益匪浅)

​https://blog.51cto.com/u_15936127/6097551​​(这篇笔记不断更新中)


复型常量

用括号 和 逗号表示.  左边代表实部 , 右边代表虚部 , 左右两边的数字都用实数来表示.

# 例子:
(1.0,1.0) #表示复数 1.0+1.0i
(2.1,-4.5) #表示复数 2.1-4.5i
(-6.0,0) #表示复数 -6.0


字符型常量

1. 用成对的单引号, 或者双引号括起来

2. 单引号和双引号要交替使用(里面是单引号, 外面就用双引号, 反之亦然)

3. 一个空格表示一个字符

# 例子:
"I'm a student" # 表示字符串I'm a student


逻辑型

1.就是 .TRUE.   和  .FALSE.    , 注意两侧的点都是不能省略的!!!

2.Fortran 中 .TRUE. 和 .FALSE. 都能用于整数计算,其中:

.TRUE. 代表数值为 -1   ,存储字节每位为1

.FALSE.代表数值为  0   ,存储字节每位为 0

! 例子
1 +.TRUE. !结果为 0
1+ .FALSE. !结果为 1


符号常量

永远不会改变的常数, 例如: π, g(重力加速度) 等, 我们无法取到它们的精确值, 但是可以设置近似值. 设置完了以后, 在程序运行的过程中, 它的值是不会改变的.  这些设置的符号常量只能被parameter设置一次,之后不可改变 , 否则报错

符号常量通过parameter 来进行设定
! 例子:
program example
implicit none
real pi
parameter(pi=301415926) ! 定义pi 代表常量3.1415926
write(*,*)sin(pi/6)
end

最终程序运行得到的结果就是 0.500000   


变量

定义要求:
  1. FORTRAN中规定须以字母开头,后可接多达30个字母,数字或下划线。, 注意一定是 字母数字下划线!!!
  2. 变量命令可以 是保留字 或者关键字, 但是为了避免冲突, 所以一般不这样做


变量类型

和常量一样, 变量有整型, 实型, 复型, 字符型, 逻辑型


整型变量

只能取整数 进行整数的四则运算

integer i                # 声明了 i 是整型变量

integer(kind=n) i # 这是f90 和 f95的写法
# n 可以取1,2,,4, 8 , 是为了预留存储空间
integer(n) # 和上方的效果等价

integer ::g = 123 # g 是一个缺省为 4 的整型变量,并且初始值为123
# :: 用来赋初值的,
# 如果没有这两个冒号, 那就不能赋初值

注意: 当我们声明变量的时候, 变量的存储空间就已经被开辟了, 只是多少大小没有确定, 而指定变量类型和位数后, 变量的最大和最小就确定了.

如果没有指定 kind , 那就叫kind的缺省 , 如果没有编译器的影响, 32位的操作系统, 它的缺省值为 4  .  也就是说人们常用的windows 缺省一般为 4

Fortran读书笔记(气象出版社版)


实型变量

有小数点的数 

real a                   !定义了实型变量a

real(n) a !也定义了实型变量 a , 指定了 kind 值为n
! n 可取4 , 8
!如果是 4 , 代表单精度; 如果是8 代表双精度

double precision a ! 定义了一个双精度实型变量 a ,
! 这样定义就等价于 real(8) a

real(kind = n) a ! 和上方的效果一样
real ::a= 2.0 ! 定义了初值为 2.0 的实型变量a
! 再次强调, 没有 :: 不能够定义初值.

Fortran读书笔记(气象出版社版)


复型变量

和上面一样 ,

kind是为了规定变量的存储大小的, kind 可以不写, 可以写

: :  表示赋初值

n 在复型变量中取 4 或者 8

complex(kind=4)  a        ! 此处不在作过多的陈述      
complex(8) a
complex a
complex ::g=(3,4)


字符型变量

注意: 下方的 n 指定的是字符的长度, 一个字节存储一个字符.

character a                 ! 声明字符型变量 a
! 不指定字符长度, 则默认长度为1 , 即缺省值为1

character (n) a ! 声明长度为 n 的 字符型变量 a
character (len=n) a ! 和上方的效果等价
character*n a ! 和上方的效果等价

character :: a='happy' ! 为字符变量a 赋初值 'happy'
character :: a= 'happy',b ! 为字符变量a 赋初值 'happy'
!!!! 为 b 赋初值 为 空


character*2 a,b, c*3 ! 为 a ,b 的长度为2 , c的长度为3

a//b ! 将 a 和 b 这两个字符串进行拼接

在程序编写过程中, 变量的内容也是可以替换的
例如:a为字符型变量 , 用 a(2,5)="happy" 就可以将 a字符串的第 2到 5个字符进行替换.

Fortran读书笔记(气象出版社版)


逻辑变量

用于逻辑判断 

logical a             ! 没有指定n , 默认参数为4
logical(kind=n) a ! n 可以取1,2,4,8

! 注意:
.TRUE. 在其存储开销单元字节单元内每位置1, 与整数-1等价
.FALSE. 在其存储开销单元字节单元内每位置0, 与整数0等价


变量声明注意点

1.隐式声明和显示声明

变量声明分为隐式声明显示声明, 显示声明如同上方那些例子中那样生声明,  隐式声明采用I-N规则.

I-N规则:

凡是变量以字母 I,J,K,L,N ,i,j,k,l,m,n 开头的, 默认改变量为整型(integer)

如果不是上边这些字母开头的变量默认为实型(real)

2.implicit 语句 和 声明的优先级

人们通过 implicit 来重新定义变量的规则

! 例子:
implicit none ! 所有的默认规则都取消, 所有的变量都必须自己声明
implicit integer(a,b,c) ! a,b,c开头的都是整型
implicit real(m-p) ! 从m 到 p 开头的变量认为是实型


变量命名的优先级:

显示声明 > implicit > I-N规则


implicit 不是执行语句 和 其它注意事项

下面的内容很重要!!!!!!!!!!!!!!!!!!!!!!!!!!!11

1. 类型说明语句 和 implicit 语句都是非执行语句

2. 类型说明语句只在本程序单位内有效.

3.implicit 语句要置于 program 命令下面的下一行, 不能把它放在其他位置上


data 赋值语句

在 fortran77中的一种变量声明形式

! 例子:
data a,b,c,d/1,2.0,(1.0,2.0),"string"/

! 上面的复制是按照顺序意义对应的: 具体如下
! a 被赋值为了 整型1
! b 被赋值为了 实型 2.0
! c 被赋值为了 复型 (1.0,2.0)
! d 被赋值为了 字符型("")

注意点:

1.当有几个连续相同的变量时候, 可以用 n* 常量

data a,b,c/2*3.0 , 1*3/    ! 表示a,b 这两个已经声明的实型, 
! 给它们赋值为3.0
  1. 前面的变量 和 赋值的数一定是一一对应的.
  2. 如果程序中出现了 多个 data 给同一个变量赋值的情况, 那么以最后写上去的那个为准


stop语句

作用和辨别

当执行到任何一个STOP语句处时,程序立即停止运行。在子程序中如果有STOP语句,它将使整个程序停止运行,而不是使控制返回到调用程序。

fortran 中可以使用多个stop 

stop              ! 直接用stop , 程序会立即停止
stop 'abcde' ! 程序不仅会立即停止, 而且, 会输出 abcde
! 这样标记一下, 我们就知道那个stop停止了程序

FORTRAN规定, STOP语句中n可以是一个不超过5位的无符号整数或字符串,并且它是可有可无的。 STOP语句是使程序停止运行,即结束程序的运行。


pause 语句

用法和  stop 相同, 但是 作用不同

pause语句用于 程序的暂停,   暂停后, 按一下  回车键 , 程序就可以继续运行了


GOTO语句

不提倡这种语句, 了解即可

打个比方,   我们写的代码正在吃饭,  吃饭是一件事情吧? 但是使用 goto 后, 程序回去干 goto 指定的事情.   goto 会破坏程序的机构, 所以不提倡, 人们通常提上的是   专心做事.


运算符

算术运算符

+,- , * , **(幂运算) , /


字符运算符

//

 拼接字符串的

关系运算

.EQ.   等于, 

.NE.   不等于

.GT.    大于

.GE.    大于等于

.LT.    小于

.LE.    小于等于


==   , 也表示等于

/=     也表示不等于


数学中正常的大于, 小于在这里都是一样的了


逻辑运算符

.NOT.  一元算符

.AND. , .OR. ,

.EQV.  表示逻辑等价

.NEQV.  表示逻辑不等价

A.EQV.B

A和B值为同一逻辑常量时,A.EQV.B为真

​A.NEQV.B

​A和B的值为不同的逻辑常量,则A.NEQV.B为真


运算符优先级(很重要)

1. 括号, 乘方 > 乘除 > 加减

2.

一般运算都是  从左现右   , 如果运算式子中某个部分有乘方, 那就按照从右向左进行

Fortran读书笔记(气象出版社版)

最底下的括号的数字就是顺序.


运算规则 和 类型转换

允许 不同类型 包括 整型, 实型 , 复型 进行混合运算,

这也叫做 混合算数表达式

运算的时候, 

1.不同类型的变量会进行转换, 低级的变量类型会被转变成高级的

2.同类型直接仍然 保持原来的类型

我的经验是  integer 类型向下取整 ,  real 正常的数学计算, 只不过结果结果

带着小数点.  还要注意的是   integer 类型 低于 real 类型

! 例子:
4 **(-1) ! 结果为0
5/2 ! 结果为 2
5.0 / 2.0 ! 结果为 2.5
1/2 * 1.0 ! 结果为 0.0
1./ 2*1 ! 等于0.5

Fortran读书笔记(气象出版社版)


Fortran读书笔记(气象出版社版)


Fortran读书笔记(气象出版社版)

也就是说 , integer , real , character都能使用 , 但是 complex 只能用于比较等于还是不等于,  此外, 字符串的比较大小, 其实比较的是 字符串比的是第一个字节的ASCII码,第一个相同则比第二个.

# 这是书上的两个很重要的例子:
'This is a pen.' <= 'This is a pencil.'
# 前面的都一样, 但是从pen 开始就不同了, 一个是 . (点) 一个是 c
. (点) 的ASCII 码为 46 , c 的ASCII码市99 , 所以结果为FALSE


运算的时候的注意事项

1.不同运算符之间最好用括号隔开, 

2.结果为 逻辑型( .TRUE.  或者 .FALSE) 不能在参与运算

3.使用 等号和 不等号要非常小心, 因为计算机得到的是近似值而不是精确值, 所以存在误差.

a = x * x .EQ. 1.44      ! 在运行中该句结果为.FALSE.

采用 ABS(x*x - 1.44) <= 1.0E - 6 来取代上方的式子就可以了,
对于误差的消除, 建议 学习一下 数值分析,


4.逻辑运算符有优先级别规定, 由高到低次序为:

.NOT.,.AND.,.OR.,XOR.,.EQV.,NEQV.,其中:XOR.,.EQV.,.NEQV.的优先级相同。运算符的运算次序是按照优先级由高到低运算。

例如:

表达式“a.OR.b.AND.NOT.c”是按照先.NOT.运算,其次.AND.运算,最后.OR.运算。

当两个逻辑运算符处于相同优先级时,运算按照从左到右的顺序进行。



执行语句和非执行语句

执行语句:

编译时将被译成机器的操作指令,使计算机产生实际动作。

包括 赋值语句、输入语句、输出语句、控制转移语句等

非执行语句

提供给编译器编译信息。编译器获得这些信息给变量或工作单元分配合适的存储空间。

类型说明语句、输入输出格式语句、数组说明语句等。 FORTRAN中一般非执行语句除输入输出格式语句外,都出现在程序模块的开始位置,即执行语句之前,并且语句有一定的先后顺序排列。例如:设定隐含类型语句IMPLICIT要求放在其他类型语句之前。


赋值时候的注意点

  1. 赋值的时候右边不能是 算数运算 和 逻辑运算
! 错误的实例 , 错误的实例, 看清楚欧, 这里是错误的实例

a = 123 + 3*4 ! 这是不合法的
a = b< 100.AND.p ! 这也是不合法的
  1. 字符赋值语句在执行过程如果发现:
  1. .当右边字符串的表达式长度小于左边变量长度,将表达式运算后的结果长度强制转换为左边变量长度,不足补空格,并将转换后的字符串赋予左边变量;
  2. 当右边表达式长度大于左边变量长度,将表达式运算后的结果左侧部分赋予变量的多余截去。

3.逻辑复制语句赋值的时候必须进行变量的显式说明. 

a = .TRUE.     ! 必须声明  logical a    


未完, 持续更新中