版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、流程控制和逻辑运算5-0-1自顶向下设计当给定一个新问题,如上一章的作业,一个很自然的倾向就是坐在电脑前面开始编程,而不是“浪费”时间进行思考。对于很小的问题,这种飞跃式的编程方法通常都是可行的。现实世界中,问题一般都是大型的,如果尝试采用这种方法,程序员将陷入绝望的困境。在编写程序解决大型问题之前,彻底考虑一下问题以及将要采取的方法是非常值得的。2*5-0-1自顶向下设计自顶向下设计就是一个过程: 从大型任务开始,将其分解为更小的、更容易理解的块(子任务),执行所需任务的一部分。 如果需要,每个子任务还可以依次再细分为更小的子任务。对每一个块单独编码和测试,直到每一个子任务都能够独立的正确工
2、作。将子任务集成为一个完整的任务。3*5-0-1自顶向下设计清楚的陈述要解决的问题定义程序所需的输入和程序产生的输出。设计要在程序中实现的算法。将算法转换为Fortran语句。测设完成的Fortran程序。4*5-0-1自顶向下设计开始表明问题定义所需的输入输出量设计算法将算法转换为Fortran语句测试完成的Fortran程序结束子任务单元测试连续构建子任务子任务加入主程序Alpha版本Beta版本正式版本5*5-0-2 伪代码与流程图作为设计过程的一部分,有必要对欲实现的算法进行描述。为便于你和他人理解,应该以一种标准的形式对算法进行描述,并且这个描述还应该便于设计思路转换为Fortran
3、代码。描述算法的形式称为结构(construction),利用这些结构描述的算法称为结构化算法(constructed algorithm)。当算法在Fortran程序中实现时,结果程序称为结构化程序(structured program)。6*5-0-2 伪代码与流程图用来建立算法的结构可以用两种不同的方法描述:伪代码和流程图。伪代码是Fortran语句和自然语言掺杂在一起的混合体,构成类Fortran程序,对每个不同的想法或代码段都有单独的一行来表示。伪代码具有灵活性和易修改的特点。伪代码中经常使用代替=号,表示一个值存在于一个变量中,或者叫赋值。流程图是描述算法的图形化方法,修改比较麻烦
4、。7*5-0-2 伪代码与流程图8椭圆框表示算法的开始和结束矩形框表示计算,并将计算结果赋给一个变量表示输入或输出操作两种选择中的选择指向子程序的引用反复的或计数的循环回路*5-1 IF语句5-1-1 IF基本用法最基本的使用方法是由一个程序模块所构成,当IF所赋值的逻辑判断式成立时,这模块中的程序代码才会执行。IF (逻辑判断式) THEN.End IF逻辑成立时才会执行这里面的程序代码*能够在程序执行当中自动选择转向、跳过某些程序模块来执行程序代码,这是IF关键字的功能。ex0501.f90program ex0501implicit none real(kind=4) : speed w
5、rite(*,*) “speed:“ !信息提示 read(*,*) speed !读入车速 if ( speed 100.0 ) then ! speed 100 时才会执行下面这一行程序 write(*,*) Slow down. end if stopend*程序的核心部分:if ( speed 100.0 ) then ! speed 100 时才会执行下面这一行程序 write(*,*) Slow down. end if stop从IF到END IF之间的程序算是一个区块,IF中判断式成立时会执行这个区块中的程序IF中判断式不成立时,会跳跃到END IF后的地方继续执行IF括号中的
6、判断式成立时,如果所需要执行的程序模块只有一行程序代码,可以把IF跟这行程序代码写在同一行。上面程序中if到end if之间的内容可以改写成下面这一行程序代码:If (speed100.0) write (*,*) “Slow down”*125-1 IF语句IF命令还可以搭配ELSE,用来赋值当判断式不成立时,会去执行某一段程序代码。IF (逻辑判断式) THEN.ELSE.END IF逻辑成立时,执行这一段的程序代码逻辑不成立时则执行这一段的程序代码如果. 那么就.,否则就.。*ex0502program ex0502implicit none real(kind=4) : height
7、! 记录身高 real(kind=4) : weight ! 记录体重 write(*,*) height: read(*,*) height ! 读入身高 write(*,*) weight: read(*,*) weight ! 读入体重 if ( weight height-100 ) then ! 如果体重大于身高减去100, 会执行下面的程序 write(*,*) Too fat! else ! 如果体重不大于身高减去100, 会执行下面的程序 write(*,*) Under control. end ifstopend145-1-2 逻辑运算IF命令需搭配逻辑表达式才能使用。逻辑
8、运算符号:F90以上F77说明=.EQ.判断是否“相等”/=.NE.判断是否“不相等”.GT.判断是否“大于”=.GE.判断是否“大于或等于”.LT.判断是否“小于”write(*,*) Slow down.END IFSTOPENDex0501.forex0501.f90165-1-2 逻辑运算逻辑表达式除了可以单纯对两个数字比较大小之外,还可以对两个逻辑表达式间的关系来运算。如:If (a=80 .and. A=500 .or. windspeed =10 ) then write(*,*) 停止上班上课 else write(*,*) 照常上班上课 end ifstopendex0503
9、.f90AB.NOT.AA.AND.BA.OR.B.T.T.F.T.T.T.F.F.F.T.F.T.T.F.T.F.F.T.F.F.ABA.EQV.BA.NEQV.B.T.T.T.F.T.F.F.T.F.T.F.T.F.F.T.F.*集合运算符的使用方法*集合运算符的使用举例【.AND.】105 .AND. 61 .AND. 31True105 .AND. 62 .AND. 13False【.OR.】15 .OR. 21 .OR. 31True15 .OR. 25False【.NOT.】.NOT. 35 True.NOT. 13 .EQV. 23 True12 .EQV. 23True13 F
10、alse【.NEQV.】12 .NEQV. 23 True12 .NEQV. 22 .NEQV. 23 False*If(A=10) .AND. (A=10并且A(.GT.) =(.GE.)(.LT.) B当A的数值大于B时,logical_var这个逻辑变量会被设定成“真”(.TRUE.),否则会被设定为“假”(.FALSE.)*使用IF时,可以先把逻辑运算的结果存放到逻辑变量中,再利用逻辑变量来做条件判断。*program ex0504implicit none integer rain, windspeed logical r,w write(*,*) Rain: read(*,*) r
11、ain write(*,*) Wind: read(*,*) windspeed r = (rain=500) ! 如果rain=150, r=.true, 不然r=.false. w = (windspeed=10) ! 如果windspeed=10, w=.true, 不然w=.false. if ( r .or. w ) then ! 只要r或w有一个值是true就成立 write(*,*) 停止上班上课 else write(*,*) 照常上班上课 end ifstopendex0504.f90255-1-3 多重判断 IF-ELSE IF多重判断可一次列出多个条件及多个程序模块IF
12、(条件1) then.else if(条件2) then.else if(条件3) then.else if(条件4) then.else.End if条件1成立时,执行这个模块程序条件2成立时,执行这个模块程序条件3成立时,执行这个模块程序条件4成立时,执行这个模块程序Else这个模块可以省略每个条件都不成立时,才执行这个模块程序*program ex0505implicit none integer score character grade write(*,*) Score: read(*,*) score if ( score=90 .and. score=80 .and. score
13、=70 .and. score=60 .and. score=0 .and. score60 ) then grade=E else ! score100的不合理情形 grade=?end if write(*,(Grade:,A1) gradestopendex0505.f90*因为IF-ELSE IF所组合出来的多重判断式只会执行第一个符合条件的程序模块,执行完后就跳到END IF后继续执行程序,每个条件都不成立时才会执行ELSE中的模块。所以EX0505可以简化为:program ex0506implicit none integer score character grade writ
14、e(*,*) Score: read(*,*) scoreif ( score100 ) then grade=? else if ( score=90 ) then ! 会执行到此, 代表score=80 ) then ! 会执行到此, 代表score=70 ) then ! 会执行到此, 代表score=60 ) then ! 会执行到此, 代表score=0 ) then ! 会执行到此, 代表score60 grade=Eelse ! 会执行到此, 代表score=90 .and. score=80 .and. score=70 .and. score=60 .and. score=0
15、 .and. score100 .or. score=90) grade=AIf (score=80) grade=BIf (score=70) grade=CIf (score=60) grade=DIf (score=0) grade=EIf (score=100 .or. score 0. ) THEN ! there are two real roots, so. x1 = ( -b + sqrt(discriminant) ) / ( 2. * a ) x2 = ( -b - sqrt(discriminant) ) / ( 2. * a ) WRITE (*,*) This equ
16、ation has two real roots: WRITE (*,*) X1 = , x1 WRITE (*,*) X2 = , x2ELSE IF ( discriminant 0. ) THEN ! there are complex roots, so . real_part = ( -b ) / ( 2. * a ) imag_part = sqrt ( abs ( discriminant ) ) / ( 2. * a ) WRITE (*,*) This equation has complex roots: WRITE (*,*) X1 = , real_part, +i ,
17、 imag_part WRITE (*,*) X2 = , real_part, -i , imag_partELSE IF ( discriminant = 0. ) THEN ! there is one repeated root, so. x1 = ( -b ) / ( 2. * a ) WRITE (*,*) This equation has two identical real roots: WRITE (*,*) X1 = X2 = , x1END IFEND PROGRAM roots*345-1-4 嵌套IF语句IF () THEN 第1层IF开始 IF () THEN 第
18、2层IF开始IF () THEN 第3层IF开始 ELSE IF () THENELSEEND IF 第3层IF结束 END IF 第2层IF结束END IF 第1层IF结束*ex0508.f90嵌套IF举例:读入坐标点(x,y),判断其落在哪个象限。 else if ( x0 ) then ! x0 ans=2 else if ( y0 ) then ! x0, y0 ans=3 else ! x0 ) then if ( y0 ) then ! x0,y0 ans=1 else if ( y0, y0, y=0 ans=0 end if*5-1-5 命名的IF结构可以给IF结构指定一个名称
19、。对IF结构中的所有组成部分进行命名,可以快速地指明某一特定的ELSE或ELSE IF语句属于那个IF结构。可使程序员的注意力更加清晰。带有名称的IF结构的形式:名称: IF(逻辑表达式_1) THEN语句1语句2ELSE IF(逻辑表达式_2) THEN 名称语句1语句2ELSE 名称语句1语句2END IF 名称375-2 浮点数及字符的逻辑运算5-2-1 浮点数的逻辑判断使用浮点数做逻辑运算时,要避免使用“等于”的判断使用浮点数计算,有效位数是有限的,难免会出现计算上的误差,理想中的等号不一定会成立 例:EX0509.f90浮点数的计算误差经常发生,在判断式中要给误差预留一点空间 例:E
20、X0510.f90 *ex0509.f90program ex0509implicit none real : a real : b = 3.0 a=SQRT(b)*2-b ! 理论上a应该要等于0 if ( a=0.0 ) thenwrite(*,*) a等于0 else write(*,*) a不等于0 end ifstopend*program ex0509_2implicit none real : a real : b = 4.0 a=SQRT(b)*2-b ! 理论上a应该要等于0 if ( a=0.0 ) thenwrite(*,*) a等于0 else write(*,*) a
21、不等于0 end ifstopend*ex0510.f90program ex0510implicit none real : a real : b = 3.0 real, parameter : e = 0.0001 !设置误差范围 a=SQRT(b)*2-b ! 理论上a应该要等于0 if ( abs(a-0.0)=e ) thenwrite(*,*) a等于0 else write(*,*) a不等于0 end if stopend415-2-2 字符的逻辑判断字符也可比较大小,根据是比较它们的字符码,个人计算机中比较字符用字符的ASC码。*ab!因为a的ASC码为97,b的ASC码为9
22、8Aa!因为A的ASC码为97,a的ASC码为98“abc”“bcd”!根据字母顺序来比较,字符串“abc”的第1个字符小于字符!串“bcd”的第1个字符“abc”str2 ) then relation = else if ( str1=str2 ) then relation = = else relation = end if write(*,(String1,A1,String2) relation stopend435-3 SELECT CASE语句Select case (变量) case (数值1). case (数值2). case (数值n). case default.En
23、d if放入所要判断的变量变量等于数值1时,执行此程序段变量等于数值2时,执行此程序段变量等于数值n时,执行此程序段变量不等于任何数值时,执行此程序段*case里的冒号前后放入两个数字代表在这两个数字之间的所有数值。case的括号里面可以用逗号来放多个变量。case(1)!变量=1时,会执行这个case中的程序模块case(1: 5)!1=变量=5时,会执行这个case中的程序模块case(1: )!1=变量时,会执行这个case中的程序模块case( : 5)!变量 height-100 ) GOTO 200! 上面不成立, 没有跳到200才会执行这里100WRITE(*,*) Under
24、control. GOTO 300 ! 下一行不能执行所以要跳到300.200WRITE(*,*) Too fat!”300STOPEND*使用GOTO编写的“循环”ex0515.for PROGRAM ex0515 IMPLICIT NONE INTEGER I INTEGER N PARAMETER(N=10) DATA I /0/10 WRITE(*, (1X,A3,I2) ) I=,I I=I+1 IF ( I .LT. N ) GOTO 10 STOP END*GOTO还有一种用法,程序代码中可以一次提供好几个跳跃点,根据GOTO后面的算式来选择要使用哪一个跳跃点。称为计算GOTO语
25、句。形式: goto(label1, label2, label3, , lablek), int_exprlabel1到lablek是可执行语句的行代码。 int_expr表达式计算出一个1和k之间的整形数。如果int_expr的值为1,转去行代码为label1的语句执行, int_expr的值为k,转去行代码为labelk的语句执行。如果label的值小于1或者大于k,将引发错误。*PROGRAM ex0516IMPLICIT NONEINTEGER IINTEGER NDATA I,N /2,1/C I/N=1时GOTO 10, I/N=2时GOTO 20, I/N=3时GOTO 30C
26、 I/N3时不做GOTO,直接执行下一行 GOTO(10,20,30) I/N10WRITE(*,*) I/N=1GOTO 10020WRITE(*,*) I/N=2GOTO 10030WRITE(*,*) I/N=3100STOPENDex0516.for*IF判断还有一种叫做算术判断的方法,做法和GOTO类似。 形式:if(arithmetic_expression) label1, label2, label3其中arithmetic_expression可以是任何整形、实型算术表达式。 label1,label2和label3是可执行语句的行代码。当arithmetic_expression的值为负时,执行行代码为label1的语句,当arithmetic_expression的值为0时,执行行代码为label2的语句,当arithmetic_expression的值为正时,执行行代码为label的语句。5-4-2 IF与GOTO的联用0*ex0517.forPROGRAM ex0517IMPLICIT NONEREAL A, BREAL CDATA A, B /2.0, 1.0/C=A-BCC0就GOTO 30IF ( C )10, 20, 3010WRITE(*,*)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地毯纱架工安全强化竞赛考核试卷含答案
- 客车司机变革管理竞赛考核试卷含答案
- 客车司机岗前生产标准化考核试卷含答案
- 制浆废液回收工岗前技能实操考核试卷含答案
- 木地板表面造型处理工变革管理强化考核试卷含答案
- 电工岗前风险评估考核试卷含答案
- 乙氧基化装置操作工岗前进阶考核试卷含答案
- 淡水捕捞工规程强化考核试卷含答案
- 广东省深圳市2025-2026学年高一上学期10月期中多校联考生物试卷(含答案)
- 拉萨民宿行业分析报告
- 【第一次月考】2026 秋七年级上册道法第一次月考卷(统编版素养测评)
- 2026年非融资担保服务行业市场深度调查及投资规划报告及未来五至十年区域市场差异与机会
- 大型机械设备运行路线及作业位置承载能力校核方案
- 2025黄山市黄山区仙源镇社区工作者考试真题
- T-CNAS 17-2020 成年女性压力性尿失禁护理干预
- 石材外墙合同范例
- GB/T 44748.1-2024筛分试验第1部分:使用金属丝编织网和金属穿孔板试验筛的方法
- 新中国赞歌 课件 2024-2025学年浙人美版(2024)初中美术七年级上册
- 安全防护与急救处理智慧树知到课后章节答案2023年下临沂大学
- 应用PDCA提高入院宣教的知晓率
- 深静脉血栓(DVT)课件
评论
0/150
提交评论