爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 20941|回复: 32

[经验总结] Fortran的优先级问题探讨--深深Fortran学习笔记第1讲

[复制链接]

新浪微博达人勋

 成长值: 0
发表于 2012-8-18 15:52:44 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 言深深 于 2012-8-18 17:17 编辑

Fortran的优先级问题探讨--深深Fortran学习笔记第1讲
注意节选自以前的笔记
首先简单介绍一下优先级的问题,所谓优先级就是先进行什么,再进行什么,熟练掌握这些可以大大提高编程效率,优化程序。
首先要说的就是计算中的优先级
fortran语言中运算的优先级和数值运算中的优先级是一致的,大致可以分为以下几个方面:
一、算术表达式
1、括号--值得注意的是fortran语言在程序编写的过程中只有英文状态下的小括号(),没有别的括号"{}[]"都是不允许的;
2、乘方--fortran支持数据的幂运算,用符号"**"表示,如2**3表示数值为8
3、乘/--一些基本的数值运算,其中"*"表示"","/"表示""
4、加减--加减运算在fortran运算中级别是最低的
例:(2**3+3*4)/10-2=0
二、关系表达式
关系表达式一共包括五个方面,注意是用于比较两个量之间的大小多少关系,根据不同版本有两种表述方法
1、大于--A .GT. B或者A >B
2、大于等于--A .GE. B或者A >=B
3、等于--A .EQ. B或者A =B
4、小于--A .LT. B或者A <B
5、小于等于--A .LE. B或者A =<B
需要注意的是,fortran语言是不区分大小写的,因此以上的表达写为"A.gt.B"也是可以的。建议大小写统一。另外,英文标记时注意书写格式"."应该讲判断语句和数值分开。
三、逻辑表达式
逻辑表达式,也就是逻辑运算符连接的表达式,可以用来进行逻辑判断的,逻辑表达式往往是根据判断逻辑的正误,以此给出下一步行动方向,有五个方面,常有的主要有"and""or",其余的不常用,注意逻辑判断语句同样需要"."将不同部分隔开。
(A.LT.B).AND.(A.GT.C)-
(X.LT.0.0).OR.(X.GT.100.0)--or两边有一个成立,语句执行
.NOT.(X.LE.0.0)--not后面不成立,语句执行
(A.LT.B).EQV.(C.GT.D)--eqv两边只有一个不成立,语句不执行/一真则真,一假则假
L1.NEQV.L2--enqv两边不等时,语句执行
好吧,以上内容比较绕,读者只需要记住前面标记※号的两个就可以了。
更常见的可以结合if语句进行判断的用法有
四、括号
括号是个好东西,很多时候我们需要的往往受到优先级的牵制,比如下面这个表达式:
If(x.ge.1.0.and.x.lt.5.0.and.x.lt.4..or.x.le.3.5.0)
看起来比较纠结了,注意从左到右的优先级和逻辑运算符的优先级,这一判断表达的意思是x[1.0,∞)∩(-,5.0)∩(-,4)(-,3.5),但是如果我们想要的是[1.0,∞)∩(-,5.0)∩((-,4)(-,3.5))。
这时候就需要用括号逐个加以区分解决这个问题了。除此以外,我们也可以将判断语句拆分开来进行判断。
例:任意输入一个年份,判断是平年还是闰年
!integer year表示定义year为整型
!其中mod(a,b)表示ab取余数,就是a-int(a/b),其中int(a/b)表示取a/b的整数部分
integer year
        print *,'输入年份,判断是否为闰年'
        read *,year
        if (mod(year,4).eq.0) then
            if (mod(year,100).ne.0) then
              print *,year,' 年是闰年'
            else
                  if (mod(year,400).eq.0) then
                  print *,year,' 年是闰年'
              else
                      print *,year,' 年不是闰年'
              endif
            endif
        else
           print *,year,' 年不是闰年'
        endif
End
希望大家将上面的程序保存一下,以后用得着的!
五、I-N规则
这是一个比较BT的规则,但是很适用!
在说I-N规则之前,先来认识一下:implicit none
很多程序的前面都会加这一句,表示去掉I-N规则。
那么为什么要去掉呢?这到底是一个怎样的规则呢?
所谓IN规则,就是说凡是在没有特别说明的情况下,以I,J,K,L,M,N开头的字符变量所代表的(包括数组)都表示整型,其余的都是实型。
例:
a=1
b=2.0
i=3
j=4
k=5.0
print*,"a=",a
print*,"b=",b
print*,"i=",i
print*,"j=",j
print*,"k=",k
end
输出结果如下:
2.png
如果对字符进行重定义,那么这一规则对定义的字符失效。
如:
real*8,i,j
那么,ij就变成实型了。
【TIPS】
深深往往在编程时习惯使用i、j、k、l开头的表示循环变量,m、n表示常量,a、b开头的表示实型。
因为很多时候并不是一开始就能知道自己可能用到什么变量的,往往边写边定义的,如果再回到开头定义未免比较麻烦,如果能够适当的利用一下这一规则节省时间和精力。
另外,对于没有定义的变量,程序自动赋值为0.
end
以上内容可以下载哦 深深学习笔记第1讲.pdf (133 KB, 下载次数: 52)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-8-18 16:15:32 | 显示全部楼层
优先级神马的最不喜欢了....每次遇到这样的问题...我就用杀手锏 括号
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-8-18 17:16:12 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-8-18 17:39:27 | 显示全部楼层
你这是逼我来grads的么……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-8-18 17:50:08 | 显示全部楼层
mofangbao 发表于 2012-8-18 17:39
你这是逼我来grads的么……

哈哈,没事自己学习啊··来兰州有时间玩了啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2012-8-18 21:16:17 | 显示全部楼层
mofangbao 发表于 2012-8-18 17:39
你这是逼我来grads的么……

来吧,兰溪帮你批阅~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-8-19 09:10:26 | 显示全部楼层
兰溪之水 发表于 2012-8-18 21:16
来吧,兰溪帮你批阅~

兰溪也帮我盖个章呗,已阅!!!!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-8-21 09:20:21 | 显示全部楼层
“If(x.ge.1.0.and.x.lt.5.0.and.x.lt.4..or.x.le.3.5.0)”,同一级中“OR"慎用,往往难以达到你要的结果,这是我人经验,碰到优先级,括号最有用。

评分

参与人数 1金钱 +2 收起 理由
言深深 + 2

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-8-21 11:47:25 | 显示全部楼层
Forcast 发表于 2012-8-21 09:20
“If(x.ge.1.0.and.x.lt.5.0.and.x.lt.4..or.x.le.3.5.0)”,同一级中“OR"慎用,往往难以达到你要的结果, ...

哈哈,这里面用括号比较有效,但是有时候括号太多了也看不过来,眼睛都看花了。
二者都结合吧,优先级掌握了也是有好处滴
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-8-21 22:09:06 | 显示全部楼层
优先级的问题~其实都可以靠括号解决的吧~实际编译的时候会按照优先级把括号搞掉的,所以执行效率是一样的

评分

参与人数 1金钱 +2 收起 理由
言深深 + 2

查看全部评分

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表