收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

海洋数据分析 -海洋数据分析岛

[复制链接]
# `* 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 = 12345678900 ?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

建议使用格式化进行输入输出,这样不仅可以使得显示更加美观,在某些情况下,设置恰当的输入格式才能得到正确的数据。

方式1
integer :: 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
方式3
character(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/ ]
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
太美
活跃在3 天前
快速回复 返回顶部 返回列表