《Fortran 95 程序设计》阅读笔记一

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.41038 最小为 1.18 ∗ 1 0 − 38 1.18*10^{-38} 1.181038
    • 双精度(最大数值为 1.79 ∗ 1 0 308 1.79*10^{308} 1.7910308 最小为 2.23 ∗ 1 0 − 308 2.23*10^{-308} 2.2310308
  • 复数 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,1010;但是对于双精度而言则需要换为 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
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值