Fortran学习笔记:01 基本格式与变量声明

时间:2023-03-09 09:39:25
Fortran学习笔记:01 基本格式与变量声明

Fortran学习笔记目录

01 基本格式与变量声明

格式

固定格式(Fixed Format):Fortran77 程序需要满足一种特定的格式要求,具体形式参考教材

*格式(Free Format):Fortran90之后程序书写形式更为*

数据类型

Fortran 95包含的数据类型

数据类型 关键词 C中对应
整型 integer int/long ...
浮点型 real float/double ...
复数 complex <complex.h>
字符/字符串 character char ...
逻辑判断 logical bool ...
自定义结构体 type() struct

表达式与逻辑运算

!Fortran 95支持逻辑符号

+、-,*、/:加减乘除

** :乘方

==:等于

/=:不等于

>:大于

>=:大于等于

<:小与

<=:小于等于

逻辑判断式 含义
.AND. 且,两边都成立时,表达式成立
.OR.
.NOT.
.EQV. 两边相等时为true
.NEQV. 两边不等时为true

注意:浮点型的逻辑判断,需要考虑有效位数截断的问题,例如,2.0000001不等于2,需要使用\(abs(a-2)<2e-5\),这种方式来作判定

代码结构

Fortran语言不区分大小写

program main                    !自定义程序名称 main
write(*,*) "Hello World" !输出字符
stop !程序停止
end !main程序结束

输出与输入

输出

    write(*,*) "Hello World"    !输出字符

write(*,*)中,第一个*表示默认输出位置,第二个*表示默认输出格式,完整表述为以下格式

    write(unit=6,fmt=*) "Hello World"

unit=6 表述输出至屏幕,等效于unit=*。

输入

program main
integer a,b,c
write(*,*) "please input 3 number"
read(*,*) a,b,c
write(*,*) a+b+c
end

read(*,*)与write(*,*)表示意义基本一致,read(*,*)等效于

    read(unit=5,fmt=*) a,b,c

unit=5 表示由键盘输入,等效于unit=*。

格式化输入与输出

《Fortran95教程》4-4节

program main
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
write(*,"(1X,F6.3)") b
write(*,"(1X,F4.1,F4.1)") c
write(*,"(1X,L3)") d
write(*,"(1X,A10)") e
end

声明常规数据类型

声明整型数据进行运算

program main
integer a,b
a=3
b=4
write(*,*) "a=",a
write(*,*) "b=",b
write(*,*) "a+b=",a+b
write(*,*) "a-b=",a-b
write(*,*) "a*b=",a*b
write(*,*) "a/b=",a/b
write(*,*) "a**b=",a**b
stop
end

注意整型除法的截断问题

integer默认使用长整型进行声明,可以自定义数据类型存储长度,例如:

integer(kind=4) a

定义整型变量存储空间大小为4。

声明浮点型数据进行运算

program main
real :: a ,b
a=2.5
b=3.5
write(*,*) "a=",a
write(*,*) "b=",b
write(*,*) "a+b=",a+b
write(*,*) "a-b=",a-b
write(*,*) "a*b=",a*b
write(*,*) "a/b=",a/b
write(*,*) "a**b=",a**b
stop
end

real自定义数据长度同上

real(kind=8) a

声明复数型数据进行运算

program main
complex :: a ,b
a=(1,1)
b=(1,-1)
write(*,*) "a=",a
write(*,*) "b=",b
write(*,*) "a+b=",a+b
write(*,*) "a-b=",a-b
write(*,*) "a*b=",a*b
write(*,*) "a/b=",a/b
stop
end

复数运算符合相应复数运算规则

声明字符与字符串

声明字符与字符串

program main
character :: a
character(20) :: b
a="H"
b="Hello World"
write(*,*) a
write(*,*) b
stop
end

字符串操作:数组索引、切片操作

program main
character(len=30) :: first,second
first="Good morning"
second=first(1:4)
write(*,*) first
write(*,*) second
first(6:)="evening"
write(*,*) first
write(*,*) first//second
stop
end

字符串相关函数

函数 功能
CHAR(num) 返回num对应的字符
ICHAR(char) 返回char字符对应的字符编号
LEN(string) 返回字符串string声明空间长度
LEN_TRIM(string) 返回字符串除去尾端空格后的字符长度
INDEX(string,key) 返回key在string中第一次出现的位置
Trim(string) 返回清楚尾端空格后的字符串
program main
character(len=20) :: string
character(len=5) :: substring
string="Have a nice day!"
substring="nice"
write(*,*) ichar("A")
write(*,*) char(65)
write(*,*) len(string)
write(*,*) len_trim(string)
write(*,*) index(string,substring)
stop
end

逻辑变量

true与false分别为.true..false.

program main
logical a,b
a=.true.
b=.false.
write(*,*) "a=",a,"b=",b
stop
end

声明变量注意事项

变量名前缀必须是英文字母

IMPLICIT命令

implicit integer(A,B,C)  !A,B,C开头变量视为整型
implicit integer(A-F) !A-F开头变量视为整型
implicit real(M-P) !M-P开头变量视为浮点型
implicit none !关闭默认类型,所有变量都需要声明

其他变量声明

常数声明方法(PARAMETER)

program main
implicit none
real pi
parameter(pi=3.1415926535)
write(*,"(F6.4)") sin(pi/6)
end

还可以等效成以下声明语句

real,parameter :: pi=3.14159

::表示类型申明的形容词已经添加完毕,后面紧随变量名称

设置变量初始值

Fortran95 可以直接在变量声明后进行赋值,而Fortran77需要使用DATA命令进行赋值

program main
implicit none
integer :: a=1
real :: b=2.0
complex :: c=(1,2.0)
character(len=20) :: str="Fortran95"
write(*,*) a,b,c,str
end

等价申明(EQUIVALENCE)

两个以上的变量使用同一块内存,类似于多个指针指向同一块内存,可以用来精简代码,节省内存。

    integer :: a,b
equivalence(a,b) !a,b两个变量名共享同一块内存

声明语句在程序中的位置

声明语句必须放置在可执行操作语句之前,也就意味着,程序中所有使用的变量必须首先声明。

变量类型转换

program main
implicit none
integer :: a=1,b=2
write(*,*) a/b
write(*,*) real(a)/b
end

real()函数可以将变量转化为浮点型变量

自定义数据类型

结构体,type定义结构体,%获得结构体数据成员

program main
implicit none
type:: person
character(len=30) :: name
integer :: age
real :: weight
end type type(person) :: a
write(*,*) "name:"
read(*,*) a%name
write(*,*) "age:"
read(*,*) a%age
write(*,*) "weight:"
read(*,*) a%weight write(*,100) a%name,a%age,a%weight
100 format(/,"name:",A10/,&
&/,"age:",I10/,&
&/,"weight:",F5.2)
end