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

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

[复制链接]
) 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

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

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

举报 使用道具

相关帖子

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