第8章 程序流程控制_第1页
第8章 程序流程控制_第2页
第8章 程序流程控制_第3页
第8章 程序流程控制_第4页
第8章 程序流程控制_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 程序流程控制 本章将介绍算法与流程的基本知识和两种基本的控制结构。 8.1 算法与流程8.1.1 算法 算法(Algorithm)。只要学会了制定正确且有效的算法,用何种高级计算机语言来编写具体的计算机程序就仅仅只是一个工具选择的问题了。因此,算法的设计也是计算机程序设计的核心内容。8.1.2 传统流程图8.1.3 基本程序结构 。传统流程图中使用流程线来指出各个框之间的执行顺序,流程线在使用上没有严格限制。BS 分支结构和循环结构又是在描述算法时不可避免的。针对这些问题,人们设计了三种最基本的流程结构,使用这三种基本结构就可以表示一个良好的算法。可以将这些基本结构称为预制件,一个算法

2、就是通过这些预制件像搭积木一样按顺序排列起来的。 8.1.4 用伪代码表示算法 用流程图只适宜于表示算法,用在设计算法的过程中并不是很理想(特别是算法比较复杂,需要经常进行修改时就显得更不方便)。 为了方便的进行算法设计,经常会使用一种称为伪代码的工具。最重要的是它很易于向计算机程序语言过渡。 8.2 选择结构8.2.1 判断语句IF和分支选择语句SELECT CASEIF语句和SELECT CASE语句在Fortran语言中都能够用于构造选择结构在Fortran 77时代,选择结构是通过IF语句和IF构造来实现的。8.2.2 判断语句IF的基本用法 使用IF语句来实现选择结构通常有两种用法:

3、语句形式和构造形式。 1语句形式 实现单一选择:IF(逻辑表达式) 执行语句 2构造形式 可以使用块IF语句来组成IF构造用于多重选择。8.2.3 判断语句IF实现多重判断ELSE IF语句后,IF构造中可以同时存在多个判断条件和多个执行模块,但是只有其中一个条件能够成立,并且只有一个执行模块能够执行:IF(逻辑表达式1) THEN THEN 块ELSE IF(逻辑表达式2) THEN ELSE IF块ELSE ELSE块END IF8.2.4 IF语句的嵌套 IF语句嵌套的形式可以表示如下: 构造名1:IF(逻辑表达式1) THEN 构造名2:IF(逻辑表达式2) THEN 构造名3:IF(

4、逻辑表达式3) THEN ENDIF构造名3 ENDIF构造名2 ENDIF构造名18.2.5 IF语句的特殊用法在Fortran 77中,IF语句还能够实现一种特殊的选择方法,也就是算术IF语句。算术IF语句根据算术表达式值得结果,有条件的将程序的计算流程转到三条执行语句中的一句。形式如下:IF (表达式) 标号1, 标号2, 标号3其中,表达式为标量整型或实型表达式,两端用括弧括起来;标号1至3必须是本程序单元中的有效可执行语句的标号。语句中所有的三个语句标号都必须书写,但并不一定要指向三个不同的语句,在同一个算术IF语句中允许同一个语句标号出现多次。如果表达式的值小于零,标号1如果表达式

5、的值等于零,标号2如果表达式的值大于零,标号38.2.6 SELECT CASE语句的用法SELECT CASE语句是Fortran 90/95标准中新增加的语句。该语句用于容纳CASE块,尽管多重判断的IF构造也可以实现这一功能,但是在某些多条件选择的应用场合使用IF构造会使代码显得比较繁琐、层次关系比较复杂。使用CASE构造就可以避免这一问题,编写出来的代码也显得更加直观、简洁。CASE构造的作用和IF构造不同之处在于:CASE构造只能把某个判断条件的可能结果区分成若干个孤立的离散值或片断(这意味着CASE构造中的判断条件不允许出现重叠),按不同的值或片断进行不同的操作。如果遇到判断条件比

6、较复杂或者存在多种判断条件互相交叉的情况时,在这种情况下只能考虑使用IF构造来进行处理。8.2.7 SELECT CASE语句的应用 首先演示的程序使用了整型表达式的CASE构造,例子的原型就是程序TEST0802的个人所得税计算程序。在进行改动前需要注意,CASE构造中的选择表达式是不允许为实型表达式的。因此,需要一个将实型数据转换为整型数据的函数,可以考虑使用基本数学函数中的INT函数。8.3 循环结构8.3.1 基本的DO构造DO构造在Fortran 77和Fortran 90/95中都提供用以执行循环操作,但是两个标准在DO构造的具体实现形式上是不同的。两个标准下的各种DO循环都可以归

7、纳为DO构造一般形式:构造名: DO 标号循环控制块终止语句其中,构造名选项只允许在Fortran 90/95标准中使用,用于标识构造的起止范围;DO语句后的标号选项在Fortran 77和Fortran 90/95标准中同样适用,尽管带标号的DO构造是较老的语法形式;循环控制用于控制循环的执行,提供循环停止或跳出循环的手段等;中止语句用于标定循环构造的结束位置,通过该条语句将流程返回到DO语句。8.3.2 无条件循环与DO语句现实中的循环可以分为不带循环变量与带循环变量当需要执行的循环次数为已知时,使用DO语句来实现循环比较方便。它由一个DO语句和循环体组成,在Fortran 90/95标准

8、中的一般形式如下:构造名:DO 循环变量 = 循环初值,循环终值,循环增量 循环体ENDDO 构造名8.3.3 条件循环与DO构造在编程实践中,还有一种情况是执行次数未知的循环。这一类循环不能通过使循环变量“增加”到循环终值的形式来终止,只能通过循环体中的判断条件来控制程序的流程是否跳出循环构造。因此,这种循环又被称为条件循环除了将判断条件写在循环体内的方式(也称为直到型循环)之外,还可以通过WHILE语句来实现当型循环。在Fortran 90/95标准中,DO WHILE语句被增加到循环构造方式中以支持当型循环。8.3.4 循环的署名同其他的一些构造一样,循环也是可以命名的,命名的原则同变量

9、的命名原则完全一致。循环一旦命名,则在循环终止语句后必须跟上循环的名字,以使编译程序明白那一个循环结构被封闭。TEST0818.F90 ! 署名循环范例PROGRAM TEST0818 IMPLICIT NONE INTEGER : I PRINT: DO I = 1, 2 PRINT *, 第, I, 次循环 ENDDO PRINTEND PROGRAM TEST0818 8.3.5 循环的嵌套同IF构造和SELECT CASE构造类似,DO构造也允许在自身中再嵌入其他的DO构造。循环嵌套中的各层循环变量不允许重名。循环嵌套的层数可以不限,但是循环嵌套的层次太多会使得各层循环不容易分辨。可以

10、通过对循环进行命名以使循环嵌套的层次更清晰。内循环是外循环中循环体的一部分,内外循环不允许交叉。合法的:OUT: DO I = 1, 4 IN: DO J = 1, 5 ENDDO INENDDO OUT 8.3.6 DO循环规则在使用DO循环时,需要注意循环的一些其它规则。比如,循环变量可以在循环体中被引用,但不应当再被赋值,即使循环变量的值保持不变。例如下面的写法都是不正确的,循环变量N和M不能在循环体内被重新赋值:DO N = 1, 10 N = N*2 ENDDODO M = 1, 10 M = M ENDDO8.3.7 隐式DO循环 隐式DO循环实际上是一种带控制循环变量的DO循环,

11、但简化成只有DO循环的第一句,并且把关键字DO隐去。一般形式如下: I = m1, m2, m3 其中,m1表示循环的初值;m2表示循环的终值;m3表示循环的增量。如果省略本项目,则默认为1。 隐式DO循环不是一种可以独立存在的语句。它只能作为输入输出列表的一个组成部分,用来控制重复读写的次数。 (I/O列表, 循环变量名 = 循环初值, 循环终值, 循环增值)8.4 循环的控制 在Fortran 90/95标准中,引入了两个控制循环执行流程的语句EXIT和CYCLE。这两条语句实际上在某些Fortran 77编译器中早已被当成了不成文的标准之一了。8.4.1 EXIT语句 在实际变成种,有许

12、多实际问题是无法预先知道循环次数的,比如一些数学和工程领域中的迭代算法。对于这类问题,最常见的做法是给出一个判别条件。如果满足这个判别条件就重复执行循环体,否则就退出循环。因此有条件循环时循环的执行次数不是固定的。传统的做法是使用GOTO语句来使流程跳出循环,但这种方法不符合结构化程序设计的要求。针对这种情况,Fortran 90/95通过引入EXIT语句来满足结构化程序设计的要求。 EXIT语句的作用是停止循环并使流程控制退出循环结构,因此又被称为出口语句。一般形式: EXIT DO构造名8.4.2 EXIT语句与条件循环通过DO WHILE语句来实现循环猜测,在这条DO WHILE语句中的

13、逻辑判断表达式就是简单的逻辑真(TRUE)。这种用法是允许的,它表示当型循环的执行条件一直满足,无须进行判断。但是在使用时应该注意,在循环体内一定要提供跳出循环的手段,否则循环会一直执行下去形成死循环。下面的代码通过在判断语句中加入EXIT语句,跳出循环。IF(Rchar = Gchar) EXIT如果用户输入的字符等于系统随机得到的字符,则执行EXIT语句退出循环。如果用户猜测的字符不正确,则会向用户提示应该向哪个字符方向进行猜测。8.4.3 EXIT语句与无条件循环 除了应用于条件循环中用作循环退出的手段外,EXIT语句还可以应用于无条件循环中。当EXIT语句应用于无条件循环中时,如果循环

14、变量大于循环终值或是与EXIT语句配合的逻辑表达式为真都会跳出循环的执行。这种应用通常用在无法预知循环执行的次数并且不知道循环退出条件是否能够满足的场合。8.4.4 CYCLE语句CYCLE语句的作用不是流程跳出循环,而是使流程重新回到循环的开头CYCLE DO构造名当循环执行到CYCLE语句时,它会使循环的流程跳过位于它之后的那部分DO块,重新返回到循环的第一个可执行语句开始执行。运用CYCLE语句,可以使循环在某一次的迭代过程中不执行该语句后面的代码,使循环的应用更为灵活多变。CYCLE语句与EXIT语句一样属于特定的DO构造。如果语句引用了DO构造名,则它属于该构造,否则它属于所出现的最

15、内层DO构造。8.5 再论GOTO语句 GOTO语句是相当古老的流程控制语句,在Fortran 77时代是主要的流程控制语句。当然,某些GOTO语句的形式,如计算GOTO语句和赋值GOTO语句,在Fortran 90/95标准中是被废除、不建议使用的语句。8.5.1 无条件GOTO语句 GOTO label label是本程序单元中可用的语句标号,必须出现在可执行语句之前。 X = Y + 3. GOTO 4 3 Y = Y+5. 4 Z = X+Y 8.5.2 计算GOTO语句 计算GOTO语句在Fortran 95标准中是一项被废除的语法 计算GOTO语句的用途是根据表达式的值来确定程序的

16、控制流程转向一系列设定的分支目标中的一项。一般形式: GOTO (标号列表), 表达式 其中,标号列表由本程序单元中一系列可用的分支目标语句的标号组成,标号之间通过逗号“,”来分隔。同样的标号允许在标号列表中出现多次。 8.5.3 赋值GOTO语句赋值GOTO语句在Fortran 90标准中是一种过时的语法,在Fortran 95标准中则被废除。同无条件GOTO语句相比,赋值GOTO语句后所跟的不是语句标号,而是表示语句标号的整型变量。需要注意的是,这里的整型变量不允许通过赋值符进行赋值,比如下面的赋值GOTO语句是错误的:I = 10GOTO I赋值GOTO语句中的标号变量必须使用ASSIG

17、N语句来赋值,比如下面的形式就是正确的:ASSIGN 10 TO IGOTO I 8.5.4 用?还是不用? 正如前面一节提到的,GOTO语句的滥用在一定程度上决定了这一语句目前的处境。但是GOTO语句自身并没有错误,错误在于程序员过分依赖于GOTO语句的强大功能而没有注意到程序自身应该具有的逻辑性。 因此,在新的Fortran标准中除了计算GOTO语句和赋值GOTO语句这两种过时的语法被废除以外,无条件GOTO语句仍然在新标准中保留了自己的一席之地。在实际编程过程中,用不着因为害怕破坏程序的结构而不敢去使用GOTO语句。只要在使用中时刻牢记GOTO语句只在一个基本程序结构中使用,程序流程的跳

18、转仅限于基本结构之内。8.6 程序结束、终止和暂停 在Fortran中,程序的结束、终止和暂停都由相应的语句来完成。正确的了解和使用这些语句不仅能使程序的结构更为清晰,还能提供额外的功能以加强程序的交互性。8.6.1 程序结束(END) END的作用 结束本程序单位的运行; 作为一个程序单位结束的标志。 END语句只能出现在一个程序单元中的最后一行,并且一个程序单元只能有一个END语句。在主程序中,END语句的作用是使整个程序结束运行。在子程序中,END语句一方面作为子程序结束的标志,另一方面则使流程返回到调用程序中。 8.6.2 程序终止(STOP) STOP语句的唯一作用就是终止程序的运行。同END语句不同,STOP语句可以出现在程序可执行语句中的任意位置,并且可以有多个。程序在运行到STOP语句时,就会停止执行。子程序中的STOP语句并不会使流程返回到调用程序,而是直接停止整个程序的执行。 当一个程序中有多个STOP语句时,为了使用户能够辨别是哪一条STOP语句停止了程序的运行,可以在执行STOP语句的同时输出必要的信息。形式: STOP 停止代码8.6.3 程序暂停(PAUSE)PAUSE语句又叫暂停语句,这是一个Fortran 77的遗留产物。在Fortran 90中不推荐使用该语句,在Fortran 95

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论