《fortran逻辑运算和选择结构4》由会员分享,可在线阅读,更多相关《fortran逻辑运算和选择结构4(25页珍藏版)》请在金锄头文库上搜索。
1、1第八章第八章 常用算法的程序设计举例常用算法的程序设计举例第一章第一章 算法算法第二章第二章 计算机和计算机程序计算机和计算机程序第四章第四章 逻辑运算和选择结构逻辑运算和选择结构第五章第五章 循环结构的实现循环结构的实现第六章第六章 FortranFortran的数据结构的数据结构第七章第七章 数据的输入、输出数据的输入、输出第三章第三章 FortranFortran语言程序设计初步语言程序设计初步2一、引言在FORTRAN77中,用块IF结构来实现选择结构,其形式为:IF(条件)THEN then 块ELSEelse 块END IF3例:计算职工工资。正常工资rate (yuan/h),
2、一周超过 40 hours时,超过部分按1.5 rate (yuan/h) 。4cPayroll with overtime program payroll read(*,*) rate, hours if(hours.gt.40.0) thenregpay=rate*40.0ovtpay=1.5*rate*(hours-40.0) elseregpay=rate*hoursovtpay=0.0 end if pay=regpay+ovtpay write(*,*) rate=, rate, hours=, hours write(*,*) regular pay=, regpay, over
3、time pay=, ovtpay write(*,*) total pay=, pay end 5二、关系表达式关系表达式是最简单的一种逻辑表达式。其一般形式为:算术量:数值常数、数值型变量、数值函数、算术表达式。 关系运算符:关系比较符。FORTRAN中有六种关系运算符67几点注意 : 1. 关系运算符字母两侧各有一个句点,不要漏写。2. 在一个关系表达式中可能包括算术运算符和关系运算符, 先进行算术运算,然后进行关系运算。(建议加括号) i+j.ne.m+n 相当于 (i+j).ne.(m+n)3. 不同类型常变量比较时,遵循低级向高级转化规律。 X.GT.34.关系表达式的值不是一个数
4、值,而是逻辑量“真”或“假”。5.判断实数相等和不等,用.EQ.和.NE.时要特别注意。(1.0/3.0+1.0/3.0+1.0/3.0).EQ. 1.0 (10.0*0.1).NE. 1.0 A.EQ.B 可改为 ABS(A-B).LT.1E-6 C.NE.D 可改为 ABS(C-D).GT.1E-6 8三、逻辑表达式1. 逻辑常量FORTRAN只有两个逻辑常量.TRUE. 表示“真”,即满足逻辑条件 .FALSE. 表示“假”,即不满足逻辑条件2. 逻辑型变量Fortran 用LOGICAL语句说明逻辑变量。logical a, b a=.true. b=(x+y).gt.z93. 逻辑运
5、算符104. 逻辑表达式FORTRAN77逻辑量包括:逻辑常量 逻辑型变量 关系表达式(a.lt.b).and.(a.gt.c)(x.lt.0.).or.(a.gt.100.) .not.(x.le.0.)(a.gt.b).eqv.(c.gt.d )(l1.lt.0.).neqv.true.注意:.AND.和.EQV.的区别。11例如,A=3.5, B=5.0, C=2.5, D=1.012算术运算符的运算对象是数值量,运算结果为数值。 关系运算符的运算对象是数值量,运算结果为逻辑量。 逻辑运算符的运算对象是逻辑量,运算结果仍为逻辑量。逻辑运算符和算术运算符可以连续用运算符连接运算量, 但关系
6、运算符不可以。逻辑运算符可以写成:(设L1,L2,L3,L4为逻辑变量 ) L1 .AND. L2 .AND. L3 .AND. L4 算术运算符可以写成:A+B+C+D 但关系运算符不能写成:A .LT. B .LT. C .LT. D13四、用块IF实现选择结构IF(逻辑表达式)THEN 块1ELSE块2END IF几点说明 :1. 一个块IF是有若干个语句组成的,其中三条语句均 不能单独是使用。2. 一个块IF必须以块IF语句开始,以END IF语句结束 。一个块IF语句必须和一个END IF语句对应。143. 一个块IF可以不包含ELSE语句和else块,也可以不包 含then块。if
7、(grade.lt.60.) thenprint *, No., numprint *, grade, grade end if4. 块IF的嵌套一个块IF可以嵌套另一个块IF,但另一个块if必须完 整地出现在then块或else块的位置。if(grade.ge.60.) then elseprint *, No., numprint *, grade, grade end if15read(*,*) grade if(grade.ge.60.) thenif(grade.ge.70.) thenif(grade.ge.80.) thenwrite(*,*) Aelsewrite(*,*) B
8、end ifelsewrite(*,*) Cend if elsewrite(*,*) D end if end成绩分级 A : 80 B : 70且80 C : 60且70 D : 6016给a, b, c三个数排序,要求从小到大输出17read(*,*) a,b,c if(a.le.b) then elset=aa=bb=t end if if(b.le.c) then elset=bb=cc=tif(a.le.b) thenelset=aa=bb=tend if end if write(*,*) a,b,c end18五、ELSE IF 语句 read(*,*) grade if(gr
9、ade.ge.60.) thenif(grade.ge.70.) thenif(grade.ge.80.) thenwrite(*,*) Aelsewrite(*,*) Bend ifelsewrite(*,*) Cend if elsewrite(*,*) D end if end为了避免过多的块IF嵌套,FORTRAN 还提供了 ELSE IF语句来处理“否则,如果”的情况。19read(*,*) grade if(grade.ge.60.) thenif(grade.ge.70.) thenif(grade.ge.80.) thenwrite(*,*) Aelsewrite(*,*) B
10、end ifelsewrite(*,*) Cend if elsewrite(*,*) D end if endread(*,*) grade if(grade.ge.80.) thenwrite(*,*) A else if(grade.ge.70.) thenwrite(*,*) B else if(grade.ge.60.) thenwrite(*,*) C elsewrite(*,*) D end if end20几点说明 :2. ELSE IF语句不需END IF语句与之对应。3.一个块IF可以有多个ELSE IF语句,除非有块IF嵌套 否则只能有一个ELSE语句。1. ELSE I
11、F语句相当于把ELSE语句和其下一行的块IF 语句连结成一个语句。4.当处理多分支选择时,用ELSE IF语句往往比较方便 。 5. ELSE IF是在“条件为假”的分支中再继续进行分支处 理的。故在处理多分支的选择时,要把出现几率高的条 件写在前面,以提高效率。21read(*,*) grade if(grade.ge.80.) thenwrite(*,*) A else if(grade.ge.70.) thenwrite(*,*) B else if(grade.ge.60.) thenwrite(*,*) C elsewrite(*,*) D end if endread(*,*) g
12、rade if(grade.le.60.) thenwrite(*,*) D else if(grade.le.70.) thenwrite(*,*) C else if(grade.le.80.) thenwrite(*,*) B elsewrite(*,*) A end if end22read(*,*) x if(x.lt.-10.0) theny=0.0 else if(x.lt.0.0) theny=2.0*x+20.0 else if(x.lt.20.0) theny=20.0 else if(x.lt.40.0) theny=30.0-0.5*x else if(x.lt.50.
13、0) theny=50.0-x elsey=0.0 end if write(*,*) y=,y end求函数值23六、逻辑IF语句逻辑IF语句只有“条件为真”时才有操作,为“假”时不 进行任何操作,且条件为“真”时只能执行一条执行语句, 而后不论“真”或“假”,都接着执行逻辑IF语句的下一条语 句。逻辑IF语句又称行IF语句。如果在块IF结构中else块空块,而then块只有一条语句 ,则用逻辑IF语句比较方便。if(x.lt.60.0) thenwrite(*,*) grade end if endif(x.lt.60.0) write(*,*) grade因为不论“真”或“假”,都接着执
14、行逻辑IF语句的下 一条语句,故逻辑IF语句的条件要写全。24read(*,*) grade if(grade.ge.80.) write(*,*) A if(grade.ge.70.and.grade.lt.80.) write(*,*) B if(grade.ge.60.and.grade.lt.70.) write(*,*) C if(grade.lt.60.) write(*,*) D endread(*,*) grade if(grade.ge.80.) write(*,*) A if(grade.ge.70.) write(*,*) B if(grade.ge.60.) write(*,*) C write(*,*) D end25C单价850,100以上95折优惠,求货款。 price=850 read(*,*) n if(n.ge.100) price=price*0.95 amount=n*price write(*,*) n=,n, amount=,amount end