,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,FORTRAN语言-FORTRAN 77结构化程序设计,第四章 逻辑运算和选择结构4.1 引言,在第三章介绍了最简单FORTRAN程序,在程序中各语句是顺序执行的,这种程序只包括顺序结构。这种程序只能解决逻辑关系比较简单的问题。在解决数值计算和非数值计算的问题时,常常遇到这样问题:需要对给定条件作逻辑判断,根据判断的结果断定执行哪种操作。这需要用到选择结构。,用,块IF结构,实现选择结构,其形式为:,IF(条件)THEN,then块,ELSE,else块,END IF,例4.1计算职工工资。工人每小时计时工资为RATE,如果一周工作时间超过40小时,加班局部的工资按正常时间工资的1.5倍计算。,C Payroll with overtime,PROGRAM PAYROLL,READ(*,*)RATE,HOURS,IF(HOURS.GT.40.0)THEN,REGPAY=RATE*40.0,OVTPAY=1.5*RATE*(HOURS-40.0),ELSE,REGPAY=RATE*HOURS,OVTPAY=0.0,END IF,PAY=REGPAY+OVTPAY,PRINT*,RATE=,RATE,HOURS=,HOURS,PRINT*,REGULAR PAY=,REGPAY,OVERTIME PAY=,OVTPAY,PRINT*,TOTAL PAY=,PAY,END,4.2 关系表达式,关系表达式是最简单的一种逻辑表达式。,算术量可以是数值常数、数值型变量、数值函数,也可以是算术表达式。,FORTRAN中有六个关系运算符。见下表。,关系运算符 英语含义 数学符号,.GT.Greater Than ,.GE.Greater than or Equal to,.LT.Less Than 3.5,A+B.LE.0.0 A+B0,SIN(X).GE.0.5 SIN(X)0.5,A-B.NE.C+D A-BC+D,I.LT.J/2 I0。但遇到一些比较复杂条件,如0X5,是0X和X5两个简单条件的组合,可以把它看作一个复合条件。可以写成以下逻辑表达式:,X.GE.0.0.AND.X.LT.5.0,所谓逻辑表达式是对逻辑量进行逻辑运算的表达式。逻辑表达式的形式:,FORTRAN 77的逻辑量:,逻辑常量,逻辑型变量,关系表达式,逻辑表达式的值是一个逻辑值,它不是真便是假。,4.3.1 逻辑常量,逻辑常量只有两个:,.TRUE.FALSE.,例如,当X=3时 X.LT.5 的值为.TRUE.,而 X.LE.0.0 的值为.FALSE.。,逻辑常量可以在程序中出现,可以将它们赋给逻辑型变量。逻辑常量又称逻辑常数,它的性质与其它类型的常量相类似,代表一个常值。,4.3.2 逻辑型变量,逻辑型变量存放逻辑常量。它的值也只能是.TRUE.或.FALSE.之一。,可以将一逻辑常量赋予一个逻辑变量。假定A,B已被定义为逻辑型变量,那么可以用赋值语句对它们赋值:,A=.TRUE.,B=.FALSE.,这种赋值语句称为逻辑赋值语句。它的一般形式为:,逻辑变量=逻辑表达式,程序中对每一个逻辑变量都应加以说明,可用LOGICAL语句,如:,LOGICAL A,B,4.3.3 逻辑运算符,逻辑运算符 含义 逻辑运算举例,.AND.逻辑与 A.AND.B,.OR.逻辑或 A.OR.B,.NOT.逻辑非.NOT.A,.EQV.逻辑等 A.EQV.B,.NEQV.逻辑不等 A.NEQV.B,逻辑表达式例如:,(A.LT.B).AND.(A.GT.C),(X.LT.0.0).OR.(X.GT.100.0),NOT.(X.LE.0.0),(A.GT.B).EQV.(C.GT.D),L1.NEQV.L2,4.3.4 逻辑表达式的运算次序,一个逻辑表达式中可以包括多个逻辑运算符。即多个逻辑量经过逻辑运算后可以得到一个逻辑值。例如以下逻辑表达式:,A.LE.0.0.AND.A+C.GT.B+D.OR.NOT.TRUE.,FORTRAN 77规定按以下次序进行运算:,先计算算术表达式的值,再求关系表达式的值,最后进行逻辑运算,运算类型运算符优先级,括号 ()1,算术运算 *2,*/3,+-4,关系运算,.GT.GE.LT.5,.LE.EQ.NE.,逻辑运算.NOT.6,.AND.7,.OR.8,.EQV.,.NEQV.9,4.4 用块IF实现选择结构4.4.1 块IF的组成,块IF的形式:,IF(逻辑表达式)THEN,块1,ELSE,块2,END IF,4.4.2 块IF的执行过程,假设逻辑表达式的值为真,那么执行块1,否那么执行块2。,4.4.3 块IF的嵌套,例4.2学生考试成绩,大于等于80分的为A等,大于等于60分而小于80分的为B等,小于60分的为D等。,READ(*,*)GRADE,IF(GRADE.GE.60.0)THEN,IF(GRADE.GE.80.0)THEN,PRINT*,A,ELSE,PRINT*,B,END IF,ELSE,PRINT*,D,END IF,例4.3如果在上例的根底上将80分以上定为A等,7079分定为B等,6069分定为C等,小于60分的为D等。,READ(*,*)GRADE,IF(GRADE.GE.60.0)THEN,IF(GRADE.GE.70)THEN,IF(GRADE.GE.80.0)THEN,PRINT*,A,ELSE,PRINT*,B,END IF,ELSE,PRINT*,C,END IF,ELSE,PRINT*,D,END IF,例4.4 三个数A、B、C,按升序排序。,READ(*,*)A,B,C,IF(A.LE.B)THEN,ELSE,T=A,A=B,B=T,END IF,IF(B.LE.C)THEN,ELSE,T=B,B=C,C=T,IF(A.LE.B)THEN,ELSE,T=A,A=B,B=T,END IF,END IF,4.4.4 ELSE IF语句,FORTRAN提供ELSE IF语句来处理逻辑“否那么,如果。,例4.6例4.3可以用ELSE IF语句来实现。,READ(*,*)GRADE,IF(GRADE.GE.80.0)THEN,WRITE(*,*)A,ELSE IF(GRADE.GE.70.0)THEN,WRITE(*,*)B,ELSE IF(GRADE.GE.60.0)THEN,WRITE(*,*)C,ELSE,WRITE(*,*)D,END IF,例4.7有一函数:Y=0(X=50),READ(*,*)X,IF(X.LT.-10.0)THEN,Y=0.0,ELSE IF(X.LT.0.0)THEN,Y=2.0*X+20.0,ELSE IF(X.LT.20.0)THEN,Y=20.0,ELSE IF(X.LT.40.0)THEN,Y=30.0-0.5*X,ELSE IF(X.LT.50.0)THEN,Y=50.0-X,ELSE,Y=0.0,END IF,PRINT*,Y=,Y,END,4.5 逻辑IF语句,逻辑IF语句实现选择结构,但它与块IF不同:,1它只有条件为真时才有操作,为假时不进行任何操作;,2条件为真时只能执行一个语句而不能执行假设干个语句。,例如:,IF(X.GT.0.0)PRINT*,X,例4.8计算,READ(*,*)X,IF(X.GE.0.0)Y=3.0*X+6.0,IF(X.LT.0.0)Y=-X*X+2.0*X-8.0,PRINT*,X=,X,Y=,Y,END,例4.9有三个数A,B,C,打印其中最大数。,READ(*,*)A,B,C,BIG=A,IF(B.GT.BIG)BIG=B,IF(C.GT.BIG)BIG=C,PRINT*,BIG,习题,