登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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)表示a对b取余数,就是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 输出结果如下: 如果对字符进行重定义,那么这一规则对定义的字符失效。 如: real*8,i,j 那么,ij就变成实型了。 【TIPS】 深深往往在编程时习惯使用i、j、k、l开头的表示循环变量,m、n表示常量,a、b开头的表示实型。 因为很多时候并不是一开始就能知道自己可能用到什么变量的,往往边写边定义的,如果再回到开头定义未免比较麻烦,如果能够适当的利用一下这一规则节省时间和精力。 另外,对于没有定义的变量,程序自动赋值为0. end |