逻辑运算
2.2.1关系表达式
a) 关系运算符
关系运算符就是关系比较符。Fortran中有六个关系运算符:
关系运算符 | 英语含义 | 所代表的数学符号 | |
.GT. .GE. .LT. .LE. .EQ. .NE. | > >= < <= == /= | Greater Than Greater than or Equal to Less Than Less than or Equal to EQual to Not Equal to | > (大于) ≥ (大于或等于) < (小于) ≤ (小于或等于) = (等于) ≠ (不等于) |
注意:关系运算符的两个字母(如GT,LE…)的二侧各有一个点,不要漏写。
b) 关系表达式
关系表达式是最简单的一种逻辑表达式。其一般形式为:
<算术表达式> <关系运算符> <算术表达式>
<字符表达式> <关系运算符> <字符表达式>
算术表达式也可以是一个算术量,即为一个数值常数、数值型变量、数值函数。
例:A+B <= 0. A+B .LE. 0. A*B /= C/D A*B .NE. C/D
应当注意,关系表达式中关系操作符只准出现一次。数学中不等式写法与FORTRAN中关系表达式的写法有同有异,在编写关系表一定要严格服从它的一般形式。不可随意使用数学中的习惯用法,例如语句写法 3<X<7 就是不正确的关系表达式,因为它不符合关系表达式中只允许有一个关系操作符的规定。
关系运算的特点是:
关系表达式中包括算术运算符和关系运算符,其运算的次序是先进行算术运算,然后进行关系运算。
不同类型的数值量进行比较时,系统会先将这两个量转换成同一个类型,然后再比较。转换的规律是将低级类型向高级类型转换。因此,执行关系表达式的过程为:算出算术表达式的值;将两个算术表达式值转换成同一类型;将两个表达式的值进行比较。
关系表达式的值不是一个数值,而是一个逻辑量。它的值是“真”和“假”二者之一。
由于实数的精度限制,因此用.EQ.(等于)和.NE.(不等于)运算符时要特别注意。要考虑到可能出现的误差,并设法弥补。如对数学式A=B的关系运算可用:ABS(A-B).LT.1.E-30;对A≠B可用:ABS(A-B).GT.1.E-30。
除了算术量可进行比较外,字符关系表达式可对两个字符量进行比较。
2.2.2逻辑表达式
a) 逻辑量
Fortran的逻辑常量只有两个:.TRUE. (表示“真”,即满足逻辑条件); .FALSE. (表示“假”,即不满足逻辑条件)。
例:当X=3时,“X<5”的值为.TRUE.(真),而“X<=0.”的值为.FALSE.(假)。
逻辑型变量用来存放逻辑常量。它的值也只能是.TRUE.或.FALSE.之一。可以将一逻辑常量赋予一个逻辑变量。如将A定义为逻辑型变量,用赋值语句对其赋值:
LOGICAL A
A=.TRUE.
逻辑赋值语句的一般形式为:逻辑变量=逻辑表达式。
b) 逻辑运算符
Fortran有5个逻辑运算符,每个操作符两边都有一点,不可省略:
逻辑运算符 | 含义 | 逻辑运算例 | 例子含义 |
.AND. .OR. .NOT. .EQV. .NEQV. | 逻辑与 逻辑或 逻辑非 逻辑等价 逻辑不等价 | A.AND.B A.OR.B .NOT.A A.EQV.B A.NEQV.B | A,B为真时,则A.AND.B为真 A,B之一为真,则A.OR.B为真 A为真,则.NOT.A为假 A和B值为同一逻辑常量时,A.EQV.B为真 A和B的值为不同的逻辑常量,则A.NEQV.B为真 |
注意不要将.AND.与.EQV.混淆:A.AND.B是当A和B均为真时才为真;A.EQV.B是当A和B均为真或均为假时为真。
c) 逻辑表达式的运算
下面是逻辑表达式的例子:
逻辑表达式 | 说明 |
(A.LT.B).AND.(A.GT.C) (X.LT.0.).OR.(X.GT.100.) .NOT.(X.LE.O.) (A.GT.B).EQV.(C.GT.D) L1.NEQV.L2 | 当A<B和A>C时表达式值为真 当X<0或X>100时,表达式值为真 当X≤0时,表达式值为假 当两个括弧内的值都为真或都为假时,表达式的值为真 当L1与L2的逻辑值不相同时,表达式的值为真 |
一个逻辑表达式中可以包括多个逻辑运算符,如逻辑表达式:A.GE.0.0.AND.A+C.GT.B+D.OR..NOT..TRUE.中不仅有逻辑运算符,还有关系运算符和算术运算符。Fortran规定了以下的运算顺序:
(1)先计算算术表达式的值(例如上式中的A+C和B+D)。
(2)再求关系表达式的值(例如上式中的A.LE.0.0和A+C.GT.B+D)。
(3)最后进行逻辑运算,其顺序是:.NOT. > .AND. > .OR. > .EQV. 和 .NEQV.。如果有括弧,则先进行括弧内的运算。
可用下表表示各种运算符的优先级别:
运算类别 | 运算符 | 优先级 |
括号 | ( ) | 1 |
算术运算 | ** | 2 |
* / | 3 | |
+ - | 4 | |
关系运算 | .GT. .GE. .LT. .LE. .EQ. .NE. | 5 |
逻辑运算 | .NOT. | 6 |
.AND. | 7 | |
.OR. | 8 | |
.EQV. .NEQV. | 9 |
2.2.3逻辑IF语句
IF语句不是一种选择结构,只是一条语句,它在算法较简单的场合下,可以灵活地完成二分叉选择算法。逻辑IF语句判别逻辑表达式的值是否为“真”,并执行一操作。其一般形式为:IF(逻辑表达式) 执行语句。如果条件成立(即逻辑表达式值是‘真’),则执行其后紧跟的执行语句,而后执行下一条语句;如果条件不成立,则整个IF语句不作任何操作,只是起下滑作用,使控制转移到IF语句的下一个语句。
IF语句最大的用处是退出迭代。计算机程序中经常作连加、连乘或反复执行某段程序,并规定只有当某个参数大于或小于某值时才停止循环,这时就可以使用IF语句。IF语句用于两分叉选择的例子如:求数学中的阶梯函数( ),可写成:
Y=0
IF(X>1) Y=1
注意本例中不可写成:
IF(X<=0) Y=0
Y=1
例:IF(X>0. .AND. K\=N) Y=K+X
例:打印学生考试成绩,大于等于80分的为“A”,大于等于60分而小于80分的为“B”,小于60分的为“C”:
READ *,GRADE
IF(GRADE.GE.8O) PRlNT *,”A”
IF(GRADE.GE.6O .AND. GRADE.LT.80) PRlNT *,”B”
IF(GRADE.LT.6O) PRlNT *,”C”
逻辑IF语句当条件为“真”时只能执行一个执行语句而不能执行若干个语句。与块IF相比,逻辑IF语句是在一行中完成的一个选择操作,因此它又称“行IF语句”以与块IF区别。之所以用逻辑IF语句名称,是沿用了Fortrn66的定义,因为在F66中有两种IF语句:算术IF语句(F90/95中已废除)和逻辑IF语句。
逻辑IF语句也常与GOTO语句合用,但如果过多使用,程序结构将显得混乱,难于理解。应尽可能采用结构化的程序设计方法。[e_223_01.f]