说明:
本笔记是读书笔记, 记录了本人认为书本的精华, 和简单代码的自行敲击只用于学习交流, 其它违法行为, 与本人无关若有版权冲突, 本人立即删除.
第一编
略
本笔记从第5章开始
第二编
第5章
字符集
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 中的数据类型
数据类型有四个性质: 数据类型有四个性质:
下方性质很重要(我认为)
常量
简介图
整型(要求和不同进制的表示)
! 进制位数 # 数字(你想要输入的数字)
! 例如:
print *,2 #1111000011100011100011 ! 2进制
print*,8 # 177171717 ! 8进制
print*, 39939393 ! 10进制(这里不用用# 号)
print*, #3CF3CF ! 16进制
实型
小数形式
数字的右下角一定要有 点 . 小数点 '. ' , 前后可以不出现数字, 但是不允许小数点前后都不出现数字, 且 小数点不可以少
正确的例子
.4
2.
2.4
注意: 单独的一个 . 是不可以的.
指数类型
例子:
解读:
指数形式表示的实数由两部分组成,即数字部分和指数部分.E将数字部分和指数部分分隔,E的右边是指数部分,E的左边是数字部分,表示方式是用E表
注意点:(很重要)
额外: 书中介绍了计算机存储形式和存储位数(感觉受益匪浅)
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
变量
定义要求:
- FORTRAN中规定须以字母开头,后可接多达30个字母,数字或下划线。, 注意一定是 字母数字下划线!!!
- 变量命令可以 是保留字 或者关键字, 但是为了避免冲突, 所以一般不这样做
变量类型
和常量一样, 变量有整型, 实型, 复型, 字符型, 逻辑型
整型变量
只能取整数 进行整数的四则运算
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
实型变量
有小数点的数
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
! 再次强调, 没有 :: 不能够定义初值.
复型变量
和上面一样 ,
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个字符进行替换.
逻辑变量
用于逻辑判断
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
- 前面的变量 和 赋值的数一定是一一对应的.
- 如果程序中出现了 多个 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.
一般运算都是 从左现右 , 如果运算式子中某个部分有乘方, 那就按照从右向左进行
最底下的括号的数字就是顺序.
运算规则 和 类型转换
允许 不同类型 包括 整型, 实型 , 复型 进行混合运算,
这也叫做 混合算数表达式
运算的时候,
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
也就是说 , 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要求放在其他类型语句之前。
赋值时候的注意点
- 赋值的时候右边不能是 算数运算 和 逻辑运算
! 错误的实例 , 错误的实例, 看清楚欧, 这里是错误的实例
a = 123 + 3*4 ! 这是不合法的
a = b< 100.AND.p ! 这也是不合法的
- 字符赋值语句在执行过程如果发现:
- .当右边字符串的表达式长度小于左边变量长度,将表达式运算后的结果长度强制转换为左边变量长度,不足补空格,并将转换后的字符串赋予左边变量;
- 当右边表达式长度大于左边变量长度,将表达式运算后的结果左侧部分赋予变量的多余截去。
3.逻辑复制语句赋值的时候必须进行变量的显式说明.
a = .TRUE. ! 必须声明 logical a
未完, 持续更新中