Chapter 3 Fortran程序设计基础
Fortran 代码分为固定格式fixed format和自由格式free format,前者基本已经被淘汰。后者在使用的时候需要注意:
- 感叹号表示注释
- 每行可以编写132个字符
- 行号放在每行程序最前面
- 一行程序的最后如果是 & 或者第一个字符是 & 则表示接着上一行
- Fortran不区分大小写!!!
Fortran的数据类型
- 整型 INTEGER:又分为长整型 1 0 9 10^9 109 量级和短整型 1 0 5 10^5 105量级
- 浮点数 REAL:
- 单精度(最大数值为 3.4 ∗ 1 0 38 3.4*10^{38} 3.4∗1038 最小为 1.18 ∗ 1 0 − 38 1.18*10^{-38} 1.18∗10−38)
- 双精度(最大数值为 1.79 ∗ 1 0 308 1.79*10^{308} 1.79∗10308 最小为 2.23 ∗ 1 0 − 308 2.23*10^{-308} 2.23∗10−308)
- 复数 COMPLEX:表示为 a + b i a+b\mathrm{i} a+bi的形式 其中两个数都是浮点数REAL
Chapter 4 输入输出及声明
输入输出
程序的开始需要用 program main
其中main
作为程序名称,完全可以自定义;程序的结束需要用 end
作为结尾。
关于输出
write(*,*) "Hello World!", “R U OK?””
其中write后接括号表示输出的参数,这里用两个星号表示采取默认的参数,其中第一个*
表示输出位置用默认值,即为屏幕,修改该参数的话可以将结果输出到指定的文本里;第二个*
表示不特别设置输出格式。之后跟着的双引号内的文本表示需要输出的内容。
还有更加严谨的写法:write(UNIT=6, FMT=*) "Hello World!"
输出还有一种很常用的表示方式print *, "Hello World!"
这里的*
表示输出格式为默认值,值得注意的是print只能输出到屏幕上。
end
作为程序的结尾,由于封装代码,有若干种方法:
end
end program
end program main
其中main为程序名
声明
声明整数型变量的时候可以指定变量的长度 integer(kind=4) a
即表示长度为4bytes的整数类型变量,Fortran支持2bytes和1bytes的整数型变量,默认的是4bytes,在使用过程中别越界就好。同样的方法可以申明双精度的浮点数 real(kind=8) a
或者是 real :: a
默认的浮点数是单精度
浮点数运算的过程中,必须将每一位写成浮点数,比如
a = 2.5 + 3.0/2.0
这样给出的结果是浮点数的,但是如果输入 a = 2.5 + 3/2
则这样给出的结果为 a = 3.5
所以特别记得在需要做浮点运算的过程中所有数值都必须为浮点数!
如果有这么一段代码
integer :: a=1
integer :: b=2
real :: c
c=a/b
write(*, "(F5.2)") c
这样给出的结果会是0.00
这是因为a,b都是整型,计算除法的结果如果保留整型就是0,再把它赋值给c,继而转化为浮点数
ps:实验表明对于 3.0/2.0
写为 3.0/2
或者是 3/2.0
也是可以得到浮点数运算的,只要不是 3/2
就行
科学计数法:在Fortran里面,单精度的浮点数表示科学计数法为1E10, 1E-10
分别表示
1
0
10
,
1
0
−
10
10^{10}, 10^{-10}
1010,10−10;但是对于双精度而言则需要换为 1D10, 1D-10
Fortran很少见的可以直接定义复数,复数的声明 complex a
但是复数的赋值需要同时赋予实部和虚部 a=(1.0,2.0)
字符及字符串 CHARACTER:可以指定字符串的长度,如果赋值的长度超过指定的长度,那么只会截取前面部分的字符串。有几种修改字符串的方式:
character(len=20) string
string = "Good morning."
string(6:) = "evening." ! 重新设定从第6个字符后的字符串
string(1:2) = "GO" ! 字符串最前面两个字符变为大写
string(13:13) = "!" ! 最后结尾字符为!
字符串的拼接可以用 string1//string2
表示
声明并设置逻辑变量,注意赋值的时候在true和false的前后都有一个点,但是用WRITE输出的时候只会输出 T 和 F
logical a
a = .true.
a = .false.
格式化输入输出
输入数据可以用命令 read(*,*) a
进行,用法和之前的 write
基本一样,如果是输入多个数据的话则可以用逗号,空格以及回车键区分开
program ex0421
integer a
real b
complex c
logical d
character(len=20) e
a=10
b=12.34
c=(1,2)
d=.true.
e="FORTRAN"
write(*,"(1X,I5)") a ! 用I来格式化整数
write(*,"(1X,F5.2)" ) b ! 用F来格式化浮点数
write(*,"(1X,F4.1,F4.1)" ) c ! complex也是浮点数
write(*,"(1X,L3)") d ! 用L来输出logical
write(*,"(1X,A10)") e ! 用A来输出字符串
stop
end
输出结果为:
使用时可以参考以下表格:
其实常用的格式比较少,这里详细描述几个常用的格式:
- 【Iw[.m]】以w个字符的宽度输出整数,至少输出m个数字
如果w比输出的数字长,则在数字的前面补空格,否则是输出w个*
号作为警告
write(*,"(I5.3)") 10
' 010' ! 这里为输出示例 单引号并不会出现 前面补位两个空格 后面由于强制输出3个数字所以补位一个0
- 【Fw.d】以w个字符为文本框宽度输出浮点数,小数部分占d个字符宽
write(*,"(F9.3)") 123.45
' 123.450' ! 这里为输出示例 前面补位两个空格 小数部分强制输出3个数字
- 【Ew.d[Ee]】以w个字符为文本框宽度输出浮点数,小数部分占d个字符宽,指数部分最少输出e个字符
write(*,"(E15.7)") 123.45
' 0.1234500E+03' ! 小数部位补0
write(*,"(E9.2E3)") 12.34
' 0.12E002' ! 小数部分占2位指数部分占3位
- 【Dw.d[De]】用法跟 【Ew.d[Ee]】一样就是输入输出时候用D替换E
- 【Aw】以w个字符输出字符串,不够的在前面补上空格。
- 【nX】输出位置向右移动n位
write(*, "(3X, I5)") 100
' 100' 前面5个空格表示右移3位 多出2个字符宽 共计5个空格
- 【Lw】以w个字符宽输出T或F的真假值
- 【Gw.d[Ew]】G可以输出所有类型,固定用w个字符宽度,d不一定用到但是不能省略!!!
- 【/】换行输出
- 【Tc】输出位置移动到本行的第c个字节
其他需要注意的知识点
implicit none
增加这条命令可以有效防止未申明的变量在程序中运行,即这条命令后所有变量都必须要先申明才能用- 设置变量初值时候需要两个冒号
- 常数声明
parameter
把一个变量声明为常数有两个好处,一个是什么为常数之后不可以再改变他的值,再一个就是被声明为常数的变量可能进入缓存从而提高运行效率
real, parameter :: pi=3.14159
- 所有的声明应该放在可执行的描述之前,程序代码出现数值运算和输入输出命令时不能再做变量声明
自定义数据类型
这里相当于C语言里面的结构体函数,自己定义一个结构体然后给他逐一赋值,比如下面这段代码定义结构体person
下的变量a
要访问其中的某一个参数需要用到符号%
在之前的C语言中是用小数点表示该含义
program ex0434
implicit none
! 开始建立person这个类型
type :: person
character(len=30) :: name ! 人名
integer :: age ! 年龄
integer :: height ! 身高
integer :: weight ! 体重
character(len=80) :: address ! 地址
end type person
type(person) :: a ! 声明一个person类型的变量
write(*,*) "NAME:"
read(*,*) a%name
write(*,*) "AGE:"
read(*,*) a%age
write(*,*) "HEIGHT:"
read(*,*) a%height
write(*,*) "WEIGHT:"
read(*,*) a%weight
write(*,*) "ADDRESS:"
read(*,"(A80)") a%address
write(*,100) a%name,a%age,a%height,a%weight,a%address
100 format("Name:",A10/,"Age:",I3/,"Height:",I3/,"Weight:",I3/,&
&"Addres:",A50)
stop
end