|
# `* R# ^' R$ j/ } 要开始编程之前,首要要了解书写的规则以及能处理的数据类型。了解咱们手上的工具,才能更好得将其利用。
+ B0 f+ \- I% d1 A | 书面格式
( z+ E3 D# ~! i5 D 代码的编写格式有两种,自由格式(Free Format)和固定格式(Fixed Format)。程序代码扩展名为.F / .FOR为固定格式,.F90为自由格式。推荐使用自由格式进行编码。
5 m, @& a) C: e$ s8 O3 {5 H+ e 但是自由格式就是完全自由,可以随意编码吗?答案当然是否定的。与固定格式相比,它不会规定每一行的第几个字符有什么作用,但是它也有需要遵守的规则 每行可以编写132个字符叹号“!”后面的文本都是注释,没有(编程)意义代码不为区分大小写两行代码可以用符号“&”进行连接变量取名需要以字母开头,可以表现为字母和数字混合,且长度不超过32自由格式的简单例子,引自高PPT数据格式
, h1 H, J7 h9 d+ y8 k% b, d8 g9 |4 T 与python不同,fortran程序中出现的每一个数据必须声明类型,且每一数只有一种类型。数据类型是指使用Fortran在计算机内存中记录文本、数值等数据的最小单位及方法。
: O5 R9 O& m. O. B5 ~1 S 数据类型:整数(integer)、浮点数(real)、复数(complex)、字符(character)、逻辑判断(logical) 整数需要提前声明 integer :: x,y,z数目大小不能太大,长整型占用32bits(4bytes)的空间,保存的范围为 −231+1∼231-2^{31}+1\sim2^{31} 之间,有的编译器还会提供短整型、更短整型整数和实数之间的转化,可以直接使用编译器提供的函数 real(9) = 9.0 实数/浮点数1.精度问题。利用kind进行精度说明,值取4为单精度,值取8为双精度。实数的精度设置十分重要,将会影响最后的计算结果是否正确。 ' p; _" O: X) ]4 t) ]) y& ~3 @5 {1 w
real(kind=4) :: distance / v7 o8 ?8 ^4 N& w% ?
2.两个实数相等问题。输出后,由于ab精度不同,他们的值也不同。 # q) X3 o) a0 y
program test
1 V" v/ c2 G5 j# b implicit none, _- l* w. N ]- G) O3 s6 b
real(KIND=4) :: a# }4 b& q a0 V' \1 Q. e
real(KIND=8) :: b, y) n9 S1 y0 { u/ ]
a=0.123456789123456
' X) r( Z# o5 x, _ b=0.123456789123456
. ]& ^. O/ s6 x# c; x4 @ write(*,*) a,b=,a,b* V/ O# R8 E- e. G6 j8 A" c
end* p5 R" q' L3 T0 t
!!!输出结果: a,b = 0.123456791 0.12345679104328156$ C1 [' R0 o, q2 n
" S% T! ~1 J7 g j+ c! x! ]
3.实数与整数之间的转换 : |; H. |8 ^4 n. m: e' \5 V
int(7.8) = 7 !忽略小数部分
8 @+ u; U5 l2 L) w0 Z) y nint(7.8) = 8 !四舍五入后的结果
" W: m8 R }0 h- a2 V% F# L1 O8 d ceiling(7.8) = 8 !大于等于的整数
}! q# h: i4 |% C% g9 B floor(7.8) = 7 !小于等于的整数 字符型charcter(len=16) :: atmosphere# X+ R8 b4 U* D/ S3 f; z9 r
charcter(len=20) :: ocean6 R# Y ^( G. l Q* N. h
$ F- F/ r! B' J2 I- S atmosphere = ‘1234567890’0 ?9 L' C/ D! [, I
ocean = ‘123456789123456’ !字符赋值注意使用引号
/ i1 C) G: K8 y0 G" d
& `" f' b- C, B: c: i0 F 逻辑型对于较长的代码,灵活使用逻辑型变量,可以提高代码的多样性。 u, H) Z* [4 c
logical :: a,b) D1 Z4 d6 Q" S* i
a = .true.
+ q H8 W3 D r g% A/ b3 l b = .false.0 Q! S2 B7 j! }1 Q( V& z
if(a)then
- x0 b2 ~" s( Z0 A9 c; ~ …
( i$ G8 c3 y/ d2 |4 t7 G endif' i& Z. b0 ~' }2 x
复数型(不常用)complex :: a$ R4 M" M2 Z2 b0 W$ n& n R
a = (a1,a2)- `9 i4 Z* \& V0 j) {) e4 F4 v
! N. @- T- q9 R Fortran的数学表达6 D# e1 x v; C, g P% v0 h
数学运算符的运算优先级,由高到低排列如下 ( ) 括号里优先计算* * 乘幂* 乘法 / 除法+ 加法 - 减法需要注意:乘号容易忘记写
% E& p; ?) X3 o# _3 W Fortran的输入输出1 k |$ t' c" m: S+ p$ N v
输入4 P! E( s/ t9 z' ]0 _% m
建议使用格式化进行输入输出,这样不仅可以使得显示更加美观,在某些情况下,设置恰当的输入格式才能得到正确的数据。 方式1integer :: a
$ r4 `( ~9 \2 z( V: i* V wirte(*,100) a
2 ]- ^# D3 b/ f% r 100 format(I4)7 U! D6 z1 J" w" `) E# {
0 i0 \1 ]' V! Q
其中代号为100的这一行,作为上一行设置的输出格式 + M s/ A3 E; J0 ]5 `+ ^6 C
当不设置输出格式时,我们发现数字前面会出现一段额外的空格,当设置的输出格式为(I4)时,也是表示用4列来显示整数a的数值。 方式2,推荐write(*,"(1X,I5)")
! x" p2 y! A; w
1 a+ _, @6 N( t& @4 w write(*,"((,i2,,,i2,))") i,j q" H1 G% `3 ?! N
!输出:( 1, 2)- i/ v1 A# C* R3 s V; t
" A& _/ o9 N" i8 a$ J' l write(*,(5f7.2) list( + H7 j3 `' ~. K8 B l# M
!每行5个的形式输出list数组
. w$ t( i* ]! b 5 Z4 I/ w2 R t' J
write(*,(mf7.2) list(
1 ~! b/ D, n$ Y8 {$ } m>=size(list( )
/ l' i* h1 m5 E !在一行内全部输出
) @; _' @, [) r! n+ z4 P 方式3character(len=10) :: fmtstring6 D" h! k9 D) k) C5 `; a
fmtstring = (I3)
* h7 H/ d6 l: L) @ write(*,fmtstring) 3
4 W6 p* U5 \3 D' {; W- N& Y7 C
4 ?+ d6 {* T( {7 s9 k0 {1 w 声明长度为10的字符串,内容设置为输出一个整数的格式。 : f2 b: F, w& t+ H5 S4 W% j
常用的格式化
+ m: Q0 c7 O7 z7 x 一般来说,最常用的几种格式为“I, F, E, A, X”,不同格式之间可用用,隔开,或者不用 Iw[.m], egI4,I0是特殊描述符,此时w=整数的长度以w个字符宽度输出整数,至少输出m个数字,当数值宽度大于w时输出*。Fw.d, egF9.3以w个字符宽度输出浮点数,小数字符占d个宽,数值大雨输出宽度时出现*Ew.d[Ee], egE15.7,E9.2E3w个宽度输出浮点数,小数部分占d个,指数部分占e个Aw以w个字符宽来输出字符串,不足w个字符的部分会自动补上空格nX输出位置向右移动n位/换行输出Tc把输出的位置移动到本行的第c个字节输出
% F9 K4 D4 u7 U) o o write(*,*) "nice to meet you!" write,作用是显示后面双引号中的字符串。其中括号里第一个*表示输出位置使用默认值,即屏幕,如果写成unit=6表示的也是屏幕;第二个*表示不特别设置输出格式。write每执行一次命令后,会在佛那个换到下一行准备下一次的输出其中“”是为了输出字符,若想要输出“”需要使用两层双引号双引号和单引号都可以用来输出字符,但是若想要输出双引号时,就需要连续使用两个双引号print *, "nice to meet you too!"
. N( V! v/ @ a; \% z+ S2 b+ E6 v* b 这里的*表示不限定输出个格式,且该命令只能正对屏幕来使用。因此建议使用write来作为输出工具
0 h2 p. t8 ^7 j6 f% g
# V! h$ j1 C$ {( G$ {0 J! z7 z `8 ?
3 o% L1 w- ]( x2 J9 \3 A
( ^5 O/ o) @6 W/ ] |