《Fortran程序设计基础课件.ppt》由会员分享,可在线阅读,更多相关《Fortran程序设计基础课件.ppt(43页珍藏版)》请在三一办公上搜索。
1、第3章 流程控制和逻辑运算,流程控制,顺序结构:执行流程成直线,很难实现一些复杂功能的程序。选择结构、循环结构,IF(条件P)THENA块ELSEB块END IF,关系表达式,关系表达式是构成选择结构判断条件的基本式子。它也是一种最简单的逻辑表达式关系表达式的一般形式 算术量关系运算符算术量 涵义:关系表达式是由关系运算符将两个算术量连接起来的式子。,关系运算符,关系表达式,关系运算符的两个字母(GT,LE)的两侧各有一个句点,不要漏写。例如“A.GT.B”是一个关系表达式,如果漏写句点,就变成”AGTB”,系统会把它当成一个变量名来处理。在关系表达式中,同时包含算术运算符和关系运算符,For
2、tran 规定,先进行算术运算,后进行关系运算。例如X+Y.GT.A-B,2023/3/25,6,关系表达式,关系表达式的例子:x+y15.4 或 x+y.gt.15.4 a+ba-b 只能写成 a+b.ne.a-b 或(a+b)/=(a-b)ex2.17 只能写成 exp(x).ge.2.17 或 exp(x)=2.17,关系表达式,关系运算用于两个不同类型的运算时,将自动进行数据类型转换,规则同算术运算。关系表达式的运算元素是算术量,结果是逻辑量:真(.True.)或假(.False.)。运算符如.LE.中,点与LE字符是一个整体符号,之间不能有空格。在使用.EQ.(=)或.NE.(/=)
3、时,应注意实数类型数据的存储误差。例如:logical A real:x=1.2 A=x*x.EQ.1.44 print*,A,关系表达式,实数运算误差对关系表达式的影响如:1.0/3.0*3.0.EQ.1.0 值为.false.1.0/3.0*3.0=0.9999999 所以采用如下的形式:a.eq.b abs(a-b).lt.1E-6 c.ne.d abs(c-d).gt.1E-6,字符关系表达式,两个字符型数据也可以经比较,与数值型格式一致两个单个字符比较,以其ASCII码比较,ASCII码大者为大 如:AB两个字符常量(字符串)比较,将两个字符串中的字符自左向右进行比较,如有差别,则A
4、SCII码大者为大,否则两者相等。如:SHANGHAISHANGKONG如果两个字符串长度不等,则系统会自动将短的字符补以空格,使两者等长再比较。如:thethen thethen,ASCII 规则,数字0小9大数字比字母小大写字母比小写字母小字母A小Z大,a小z大 其他专用字符有的比数字小有的比数字大CHAR(I)得到ASCII码为I的字符 CHAR(97)a CHAR(65)AICHAR(a)得到字符串a中第一个字符的ASCII码 ICHAR(apple)97,逻辑运算,关系表达式只能表达简单的关系,但如:(1)5x10(2)|X|5(3)M能被3或5同时乘除 以上关系应如何表示呢?他们不
5、能简单地用关系表达式表。解决的方法是:逻辑表达式。,逻辑表达式,逻辑表达式的一般形式 逻辑量逻辑运算符逻辑量 逻辑表达式是由逻辑运算符将两个逻辑量连接起来的式子。逻辑表达式的运算元素是逻辑量,结果也是逻辑量:真(.True.)或假(.False.)。逻辑量包括逻辑常量、逻辑变量和关系表达式。,逻辑运算回顾,逻辑常量 两个:.true.(真).false.(假)逻辑变量 用于存放逻辑常量的变量。逻辑变量可以通过赋值语句来接受逻辑常量的值,但在使用前,要进行类型说明。例:logical a,b a=.true.b=.false.,逻辑运算,逻辑运算符.and.(逻辑与).or.(逻辑或).not.
6、(逻辑非).eqv.(逻辑等(同或).neqv.(逻辑不等(异或),逻辑运算,逻辑运算符的运算规则 若a,b为两个逻辑量,则:a.and.b(当a、b同时为真时,为真。)a.or.b(当a、b中任意一个为真或同时为真时,为真。).not.a(当a为真,其值为假;当a为假,其值真。)a.eqv.b(当a、b为同一逻辑常量时,为真。)a.neqv.b(当a、b不为同一逻辑常量时,为真。),逻辑运算举例,例如:(1)5x10 表示为:x=5.and.x5 表示为:x5 或者为:abs(x)5(3)M能被3或5同时乘除表示为:Mod(m,3)=0.or.Mod(m,5)=0,逻辑运算次序,逻辑表达式的
7、运算次序 运算次序为:括号算术运算关系运算逻辑运算 而逻辑运算:.not.and.or.eqv.,.neqv.,逻辑运算举例,例1:写出下列条件的逻辑表达式。5k10 k.ge.5.and.k.le.10 f3g或f5t abs(f).le.3*g.or.abs(f).eq.5*t 1a8并且1b8(a.ge.1.and.a.le.8).and.(b.ge.1.and.b.le.8),逻辑运算举例,若a=2.5,b=7.5,c=5.0,d=6.0,求下列逻辑表达式的值。(a.lt.b).and.(b.lt.c)t f f,逻辑运算举例,若a=2.5,b=7.5,c=5.0,d=6.0,求下列逻
8、辑表达式的值。c/2.0+d.lt.a.and.not.true.or.c.le.d 8.5 F T F.F.T,块 if 选择结构,有以下三种典型的块if选择结构:单分支结构:if(条件)then(块if语句)块(then块)endif(endif语句),块 if 选择结构,双分支结构 if(条件)then 块1(then块)else 块2(else块)endif,块 if 选择结构,例:2X3(X2)Y X5(X2)编程如下:read(*,*)xif(x.le.2)then y=2*x+3else y=x+5endifwrite(*,*)x=,x,y=,yend,块 if 选择结构,多分支
9、块if结构 if(条件1)then 块1 else if(条件2)then 块2(else if块)else if(条件n)then 块n else 块(n+1)endif,块 if 选择结构,说明:每个块if中可以完整地包含一个(或多个)块if结构,即构成块if 的嵌套结构。如:if(条件1)then if(条件1)then 块1 if(条件2)then else 块2 if(条件2)then endif 块2 else endif 块1 endif endif,块 if 选择结构,一个块if 语句必须和一个endif语句相对应。块if 中的“then块”、“else块”和“else if块
10、”可为空块。,块 if 选择结构举例,求一元二次方程ax2+bx+c=0的根。(当b2-4ac0时有两个实根,b2-4ac0时有两个复根。),块 if 选择结构举例程序,print*,input a,b,c:read*,a,b,c f=-b/(2.0*a)d=b*2-4.0*a*c g=sqrt(-d)/(2.0*a)if(d.ge.0.0)then print*,x1=,f,+i,g e=sqrt(d)print*,x2=,f,-i,g x1=(-b+e)/(2.0*a)endif x2=(-b-e)/(2.0*a)end print*,x1=,x1 print*,x2=,x2 else,块
11、 if 选择结构举例,求下列函数值。0(x-10)2x+20(-10 x0)y=20(0 x20)30-0.5x(20 x40)50-x(40 x50)0(x50),块 if 选择结构,输入x,true x-10 false,true x0 false,true x20 false,true x40 false,true x50 false,y=50-x y=0,打印y,y0,y=20,y=30-0.5x,y=2x+20,块 if 选择结构举例程序,read*,x print*,y=,y if(x.lt.-10.0)then end y=0.0 else if(x.lt.0.0)then y=
12、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 endif,块 if 选择结构程序举例,read*,x if(x.lt.50.0)then if(x.lt.-10.0)then y=50.0-x y=0.0 else else y=0.0 if(x.lt.0.0)then endif y=2.0*x+20.0 endif else endif if(x.lt.20.0)then endif y=20.0
13、endif else print*,y=,y if(x.lt.40.0)then end y=30.0-0.5*x else,逻辑 if 语句,逻辑if语句也是一种选择结构,但与块if 不同,主要表现在:只用一行表示一个选择结构;仅当条件成立时执行,并且只执行一条语句。逻辑if语句的一般形式:If条件语句 例:if(n.le.100)n=n+1,逻辑 if 语句,例:2X3(X2)Y X5(X2)编程如下:read(*,*)x read(*,*)x if(x.le.2)then if(x.le.2)y=2*x+3 y=2*x+3 if(x.gt.2)y=x+5 else write(*,*)y
14、=,y y=x+5 end endif write(*,*)y=,y end,多重判断:块CASE选择结构,SELECT CASE(变量)CASE(数值1)语句块1 CASE(数值2)语句块2 CASE(数值n)语句块n CASE DEFAULT 类似于 ELSE 语句块n+1END SELECT,块CASE选择结构的一般格式,Fortran 90 引入,SELECT CASE 语句,Case default 程序模块没有规定一定要出现。Case 语句里的冒号前后可以放入两个数值,表示在这两个数字范围内的所有数值。Case 语句可以用逗号放入多个变量每个Case 所用的数值都必须是固定的常量,
15、不能使用变量只能使用整数,字符和逻辑型变量不能使用浮点数和复数。,块CASE选择结构,问题:已知年月,判断该月所对应的天数。,Integer y,m,dRead*,y,mIf(m=1.or.m=3.or.m=5.or.m=7.or.m=8.or.m=10.or.m=12)then d=31Else if(m=4.or.m=6.or.m=9.or.m=11)then d=30Else if(mod(y,4)=0.and.mod(y,100)/=0).or.mod(y,400)=0)then d=29 else d=28 end ifend if print*,y,年,m,月所对应的天数为:,d,
16、天end,块if结构求解问题,integer y,Month,Dayprint*,请输入y和Monthread*,y,Monthselect case(Month)case(1,3,5,7,8,10,12)Day=31 case(4,6,9,11)Day=30 case(2)if(mod(y,4)=0.and.mod(y,100)/=0).or.mod(y,400)=0)then Day=29 else Day=28 End ifEnd select print*,y,年,Month,月所对应的天数,Day,天end,块Case选择结构求解问题,GOTO 语句,其他语句,Pause 语句的功能就是,当程序执行到pause时,会暂停,直到用户按下Enter键后才会继续执行。可以用来调试,输出间断(需要分页),或者数据显示(确定是否运行)Continue 功能为继续向下执行语句。Stop 功能为结束程序运行。,作业,题目3.1,题目3.2,作业,题目3.3 请采用Fortran90 自由格式编写程序,求解实系数方程ax2+bx+c=0的实数解。要求:系数a,b,c 为程序执行时键盘输入,a,b,c为任意实数;所有的解均输出到屏幕。题目3.4 请采用IF GOTO 语句编写Fortran90 自由格式程序,求1+2+3+100=?,