|
) S) j- h7 x: @4 A2 P: i2 F 要开始编程之前,首要要了解书写的规则以及能处理的数据类型。了解咱们手上的工具,才能更好得将其利用。 W, C$ S. `' \; f/ g: H
书面格式8 d3 Y; T. {( n8 V
代码的编写格式有两种,自由格式(Free Format)和固定格式(Fixed Format)。程序代码扩展名为.F / .FOR为固定格式,.F90为自由格式。推荐使用自由格式进行编码。 3 l4 w, q3 F2 ~1 s6 }* A: e% r) I
但是自由格式就是完全自由,可以随意编码吗?答案当然是否定的。与固定格式相比,它不会规定每一行的第几个字符有什么作用,但是它也有需要遵守的规则 每行可以编写132个字符叹号“!”后面的文本都是注释,没有(编程)意义代码不为区分大小写两行代码可以用符号“&”进行连接变量取名需要以字母开头,可以表现为字母和数字混合,且长度不超过32自由格式的简单例子,引自高PPT数据格式
- x2 o. W& I6 {2 L/ J; `/ i9 J! z 与python不同,fortran程序中出现的每一个数据必须声明类型,且每一数只有一种类型。数据类型是指使用Fortran在计算机内存中记录文本、数值等数据的最小单位及方法。
1 _6 e5 S2 h& e# l4 I6 f j# r$ S& N 数据类型:整数(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为双精度。实数的精度设置十分重要,将会影响最后的计算结果是否正确。 / q+ |% A, {; M; l2 |
real(kind=4) :: distance $ ?: \3 O" W, P/ E( d* K3 O
2.两个实数相等问题。输出后,由于ab精度不同,他们的值也不同。
& |2 x C# D( t0 y# G& N( m program test8 v! r/ q8 e4 L( ?& N6 o9 i q. t
implicit none3 m# M+ l: V1 C1 x. }" E0 C1 @: O
real(KIND=4) :: a
: M+ E2 W) ~+ { real(KIND=8) :: b
9 H# w8 q) B3 m E7 X% K7 C* z# W$ O" r a=0.123456789123456' I9 [% W0 h! Y8 h' C' {
b=0.1234567891234560 b' K: ]6 ~' P9 l G
write(*,*) a,b=,a,b' r# o3 N8 r, T& ?+ w3 C, T
end
# p3 i' k' i" i' l2 Q, a( d: ? !!!输出结果: a,b = 0.123456791 0.12345679104328156% L+ Y. x0 f: J$ q( I0 M" R
" \( S/ r& P+ y5 R: M
3.实数与整数之间的转换
6 f4 Y: a! i8 L m int(7.8) = 7 !忽略小数部分, l; l( E8 |& r9 h
nint(7.8) = 8 !四舍五入后的结果, o9 ]0 X; g1 X% z4 v4 |( A
ceiling(7.8) = 8 !大于等于的整数( G8 ?* V' s C# ~8 B/ [
floor(7.8) = 7 !小于等于的整数 字符型charcter(len=16) :: atmosphere/ ~* C4 W1 p3 c) D) G. O
charcter(len=20) :: ocean
4 \5 u" `# G" Z
4 F3 m. D; z5 f7 I atmosphere = ‘1234567890’
$ Y0 J; M5 |! c1 U% f7 U4 U; M# k ocean = ‘123456789123456’ !字符赋值注意使用引号2 f: ~. H' m& |7 {% p. b! N4 q
% w, V1 q% R1 h( k
逻辑型对于较长的代码,灵活使用逻辑型变量,可以提高代码的多样性。
# o6 C! f4 r* k logical :: a,b
/ Z( N5 {0 B* W: g$ H! j) J: E/ K: r a = .true./ q1 o4 {* O" G9 u7 |2 e
b = .false.5 R: p4 n4 ~; W( l
if(a)then9 j/ Q. w, N) z5 ?3 e# n
…
8 O5 t# P( u! Y; g8 n9 P endif
; m% ~; g. q) _ 复数型(不常用)complex :: a
9 r2 {! e0 F( z: d) {1 m9 c$ z a = (a1,a2)5 u* C) n4 ]: m' L7 o$ Q/ d$ q4 n
5 Z1 X! X9 N0 }, o0 E# y
Fortran的数学表达
5 q L% G& O/ Z* g' p( n 数学运算符的运算优先级,由高到低排列如下 ( ) 括号里优先计算* * 乘幂* 乘法 / 除法+ 加法 - 减法需要注意:乘号容易忘记写 1 h K5 {7 h/ p5 N+ U
Fortran的输入输出* Q0 H; Z5 a G: f2 l
输入
0 i5 g6 h' {. u! h 建议使用格式化进行输入输出,这样不仅可以使得显示更加美观,在某些情况下,设置恰当的输入格式才能得到正确的数据。 方式1integer :: a u5 ~: Y$ `3 ~# h9 |
wirte(*,100) a# i; b$ g; c3 h5 m7 q
100 format(I4). T: i& Q; B9 F+ q8 ?
' u$ h6 g/ h% E 其中代号为100的这一行,作为上一行设置的输出格式 2 r5 B7 D! o: i, E
当不设置输出格式时,我们发现数字前面会出现一段额外的空格,当设置的输出格式为(I4)时,也是表示用4列来显示整数a的数值。 方式2,推荐write(*,"(1X,I5)")* x8 o0 ^- ^# U. U
+ r2 {4 {) Z9 t: [2 i7 f* f' _ write(*,"((,i2,,,i2,))") i,j
8 f& h/ v& E# Z7 N !输出:( 1, 2)& U( D4 B, p J8 `
$ b: A2 C' }: z
write(*,(5f7.2) list(
, ?& s0 a# F9 W !每行5个的形式输出list数组
% i2 i/ e8 U) ^: m& `. Y) {" L3 ?& p1 g8 | + i1 _; A2 G8 c& ~: g
write(*,(mf7.2) list( " v; P& ?1 T. S9 [5 A
m>=size(list( )
; |, f# ?2 ~% _9 T: a !在一行内全部输出5 I& _9 ?& B2 D0 f6 ^
方式3character(len=10) :: fmtstring
, x4 g1 C4 S! ^0 d" O fmtstring = (I3)
+ `. j1 X, }% o6 n5 z" S o+ b write(*,fmtstring) 3
) ?9 B4 k+ u9 S, k 5 x2 r2 A! i/ u; P
声明长度为10的字符串,内容设置为输出一个整数的格式。
3 Q& q9 p7 ^" S5 B' p+ ? 常用的格式化% ~: |2 h. ]4 \! a! V
一般来说,最常用的几种格式为“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个字节输出
" F$ M- z* L4 h0 o [ write(*,*) "nice to meet you!" write,作用是显示后面双引号中的字符串。其中括号里第一个*表示输出位置使用默认值,即屏幕,如果写成unit=6表示的也是屏幕;第二个*表示不特别设置输出格式。write每执行一次命令后,会在佛那个换到下一行准备下一次的输出其中“”是为了输出字符,若想要输出“”需要使用两层双引号双引号和单引号都可以用来输出字符,但是若想要输出双引号时,就需要连续使用两个双引号print *, "nice to meet you too!"
! e1 A5 |9 H- D% x' ?2 ~ i 这里的*表示不限定输出个格式,且该命令只能正对屏幕来使用。因此建议使用write来作为输出工具 2 L$ y7 i- P( a3 G% X# T
! H! ?* u7 }0 o8 k8 K0 t8 i8 W0 |" Q- I) p" W) f. n. e
& k0 M& ]# k6 A7 ^; k0 v' S1 ~+ ~: S0 R: W% |% B' Y: n
|