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

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

[复制链接]
0 `5 P% \7 k5 p) E" u* O' }1 Z

要开始编程之前,首要要了解书写的规则以及能处理的数据类型。了解咱们手上的工具,才能更好得将其利用。

; g8 I8 \# {8 k5 f* Z

书面格式

. C7 _$ w! G% L2 C! `) Z

代码的编写格式有两种,自由格式(Free Format)和固定格式(Fixed Format)。程序代码扩展名为.F / .FOR为固定格式,.F90为自由格式。推荐使用自由格式进行编码。

. j4 H( ~) c' o, ]! o5 j+ X: K2 G

但是自由格式就是完全自由,可以随意编码吗?答案当然是否定的。与固定格式相比,它不会规定每一行的第几个字符有什么作用,但是它也有需要遵守的规则

每行可以编写132个字符叹号“!”后面的文本都是注释,没有(编程)意义代码不为区分大小写两行代码可以用符号“&”进行连接变量取名需要以字母开头,可以表现为字母和数字混合,且长度不超过32
自由格式的简单例子,引自高PPT

数据格式

7 B- ~. C" ~7 a9 |* H- U

与python不同,fortran程序中出现的每一个数据必须声明类型,且每一数只有一种类型。数据类型是指使用Fortran在计算机内存中记录文本、数值等数据的最小单位及方法。

/ X, J p9 z% l+ R3 Y

数据类型:整数(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为双精度。实数的精度设置十分重要,将会影响最后的计算结果是否正确。

. J/ h6 M& W* p X
real(kind=4) :: distance
" A, ^; F/ i/ _5 J- G

2.两个实数相等问题。输出后,由于ab精度不同,他们的值也不同。

3 X+ p: o) @& z
program test # k: o3 @! _) {. l1 p4 o4 ~ implicit none; u# N h, f) y) k z1 _ real(KIND=4) :: a6 G3 P- {$ q4 {1 o9 v6 _) O, w3 o real(KIND=8) :: b # A. N r- n# T- E, h6 j a=0.123456789123456 ; F( E a( v1 d% b6 Q b=0.123456789123456 ! l# x8 v3 K! i3 |8 s3 c write(*,*) a,b=,a,b " E" f' M8 [+ m9 A7 f ~3 l end " e8 T) `' R" F. h !!!输出结果: a,b = 0.123456791 0.12345679104328156 4 H, i6 }% z3 e3 Y R
+ l4 s! u. x) U8 i8 B

3.实数与整数之间的转换

6 p" b6 E7 }' y$ ~% d7 U
int(7.8) = 7 !忽略小数部分6 R: {# n2 W# h nint(7.8) = 8 !四舍五入后的结果 $ Y% U6 f8 r3 D6 [5 M ceiling(7.8) = 8 !大于等于的整数5 |& a- o; u9 W1 q* {4 X$ i; K5 p floor(7.8) = 7 !小于等于的整数
字符型
charcter(len=16) :: atmosphere" C, H( g; S+ A. h3 [- Z charcter(len=20) :: ocean% s k5 c) y6 k w7 V ) N7 E7 u9 `) v! n9 y9 f; h$ { atmosphere = 12345678905 H% f7 I7 X6 V2 \ ocean = 123456789123456 !字符赋值注意使用引号 ; m1 J) J# H3 o4 w& d8 i( S 7 y: F- b" [* d0 A" ^' l: b7 z
逻辑型

对于较长的代码,灵活使用逻辑型变量,可以提高代码的多样性。

9 v$ v! w& |. M' Z( a3 k* o% I
logical :: a,b 3 J2 p* [% d7 p M5 ` a = .true.* _4 ~+ @9 C" |+ s b = .false. ; }% q) o0 V7 b6 q0 l9 k: g if(a)then # F. E. E" Y; Y2 g - n- _; r* Y5 Z0 v endif z* S0 x+ p4 E# z
复数型(不常用)
complex :: a 6 m2 r; K& x1 V+ r a = (a1,a2) ; Z+ m, X! Y+ H5 B! u- [2 M+ B
% D/ k( |4 i' x6 C, `+ Z& a

Fortran的数学表达

8 B9 }5 p$ M7 O0 l2 P

数学运算符的运算优先级,由高到低排列如下

( ) 括号里优先计算* * 乘幂* 乘法 / 除法+ 加法 - 减法

需要注意:乘号容易忘记写

- r0 S) V' s4 r2 O

Fortran的输入输出

3 ~* O5 G) M2 J6 q" o1 g

输入

% C; V/ v9 f0 ?, Z, _- q! s( d

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

方式1
integer :: a 4 H, R, g* L+ `5 N wirte(*,100) a # `5 [: ?' y+ K$ p( a 100 format(I4)" B% r9 ?! L `
/ g3 k% v; s% k

其中代号为100的这一行,作为上一行设置的输出格式

2 s& j; T* ^% m

当不设置输出格式时,我们发现数字前面会出现一段额外的空格,当设置的输出格式为(I4)时,也是表示用4列来显示整数a的数值。

方式2,推荐
write(*,"(1X,I5)")5 v. D7 @8 O* P: e6 _ 3 r% |5 L) }' R' }/ Z1 g& B write(*,"((,i2,,,i2,))") i,j5 C Q7 Q: {, C9 W a1 l7 M& _% w !输出:( 1, 2) " k7 U6 t3 G8 |8 D ' A3 N/ ]7 |" d8 ?8 x, E6 O write(*,(5f7.2) list( 8 s3 N* @# w3 E$ ~, @" H! ?1 W, E !每行5个的形式输出list数组 8 {8 p; ^2 i: N% G" c. o2 d) P 8 ]+ q" W1 w' g0 V" y write(*,(mf7.2) list( , A9 a4 d, r" a0 { m>=size(list() ( D* k f! [8 b, d& y5 X4 k. n" b !在一行内全部输出2 f2 L' X" x0 _: P7 V
方式3
character(len=10) :: fmtstring3 Q% M$ W& r7 u fmtstring = (I3)1 i# O9 @$ V7 N) @- |1 S write(*,fmtstring) 3 7 I( }) |0 x0 L: e& l
( H1 X* I2 d2 n+ |" t, x7 i. O: X- m

声明长度为10的字符串,内容设置为输出一个整数的格式。

9 y$ n( K+ m+ L3 k) X; |

常用的格式化

6 T& G1 u' e7 l t& c$ h% B

一般来说,最常用的几种格式为“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个字节

输出

6 R a7 n! F" N, w w
write(*,*) "nice to meet you!"
write,作用是显示后面双引号中的字符串。其中括号里第一个*表示输出位置使用默认值,即屏幕,如果写成unit=6表示的也是屏幕;第二个*表示不特别设置输出格式。write每执行一次命令后,会在佛那个换到下一行准备下一次的输出其中“”是为了输出字符,若想要输出“”需要使用两层双引号双引号和单引号都可以用来输出字符,但是若想要输出双引号时,就需要连续使用两个双引号
print *, "nice to meet you too!"
( {. u6 Z( G/ `( t5 `" {) s7 U

这里的*表示不限定输出个格式,且该命令只能正对屏幕来使用。因此建议使用write来作为输出工具

8 L2 P% H+ r! A" s% ` ( M; W2 x. n: v2 ^ : U9 z/ m4 C: G( F, y. a8 a; a/ N % _# B$ H4 W' p/ t5 C3 x : {( z# y2 h3 O% Q+ ?
回复

举报 使用道具

相关帖子

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