第8章 程序流程控制.ppt

上传人:qwe****56 文档编号:70105853 上传时间:2023-01-16 格式:PPT 页数:36 大小:173KB
返回 下载 相关 举报
第8章 程序流程控制.ppt_第1页
第1页 / 共36页
第8章 程序流程控制.ppt_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《第8章 程序流程控制.ppt》由会员分享,可在线阅读,更多相关《第8章 程序流程控制.ppt(36页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第8章 程序流程控制在前面的章节中,程序的执行都是按照语句出现的先后次序来执行的。在实际的计算任务中,能够按照固有的执行次序完成计算的问题只是少数的简单问题。大多数的问题往往在程序执行过程中,根据实现设计的计算步骤(也就是通常所说的算法)往往会出现若干分支选项或是重复计算的情况。流程控制就是提供一种选择,使得除了常规的串行计算序列之外,能够应对这个序列中可能出现的选择分支与循环的情形。本章将介绍算法与流程的基本知识和两种基本的控制结构。8.1 算法与流程要想充分利用计算机的高速计算能力来处理实际的问题,需要使用者能够将问题抽象成计算能够理解的计算机语言,也就是使用者应该编写计算机程序的能力。那

2、么学习了一种计算机语言是否就具有了编程的能力呢?答案是否定的。使用者还需要具有将实际问题分解成一连串具体可操作步骤的能力。这就涉及到算法的问题了。通常意义上的编程高手,不仅仅是指这个人对于某一门计算机语言有深入的研究,还指这个人在算法上也有一定的造诣。8.1.1 算法学习一种计算机语言仅仅学习它的语法规则还不够,更重要的是要学习如何针对各种类型的具体问题,制定行之有效的解决方法和操作步骤,也就是所谓的算法(Algorithm)。只要学会了制定正确且有效的算法,用何种高级计算机语言来编写具体的计算机程序就仅仅只是一个工具选择的问题了。因此,算法的设计也是计算机程序设计的核心内容。需要注意的是,算

3、法这个词所涉及的并不仅仅是计算的问题。算法可以包括很多领域,泛指为解决实际而采取的方法和步骤。在英语中,计算方法和算法是两个词。前者是“Computational Method”,后者是“Algorithm”。计算方法更像通常意义上所理解的算法,它指求解数值解的近似方法。实际的“算法”一词含义更为广泛。它不仅仅指数值计算中的计算方法,还可以指事务处理中的规章流程、物资供应中的调配方法、糕点师傅制作蛋糕的技法等。而程序员所关心的,自然仅仅是指能够在计算机上实现的算法。8.1.2 传统流程图流程图是一种算法描述手段,它用一些图框来表示计算过程中各种类型的操作。在图框中写出算法的各个步骤,然后用带箭

4、头的线条把这些图框连接起来,以表示执行的先后顺序。采用这种方式来表示算法,形象直观,理解起来非常容易。美国国家标准化协会ANSI规定了一些常用的流程图符号,已为世界各国的程序工作者普遍采用。下面介绍最常用的一些流程图符号。8.1.3 基本程序结构前一节介绍的流程图又称为传统流程图。传统流程图中使用流程线来指出各个框之间的执行顺序,流程线在使用上没有严格限制。因此,流程图的绘制者可以根据自身的意愿将流程线画成他想要的形式,随之而来的是程序的执行流程也随意地转来转去。这种做法使流程图显得杂乱无章,阅读者需要花费相当的精力去追踪程序流程,对算法逻辑的理解也较为困难。人们为这种情况起了一个名字BS,意

5、思是一碗面条。要提高算法的描述质量,使算法在设计和阅读方面都变得方便,就必须限制流程线的滥用。即流程线不能毫无规律的四处乱转,必须按一定的方向来绘制。但是,分支结构和循环结构又是在描述算法时不可避免的。一个算法不可能按从头到尾的顺序执行下来,总会有一些向前或向后的非顺序转移。针对这些问题,人们设计了三种最基本的流程结构,使用这三种基本结构就可以表示一个良好的算法。可以将这些基本结构称为预制件,一个算法就是通过这些预制件像搭积木一样按顺序排列起来的。8.1.4 用伪代码表示算法用前面介绍的流程图来表示算法直观易懂,但画起来却比较费事。同时在设计一个算法时往往不可能一蹴而就,经常需要对原来的想法进

6、行反复修改。这时,想要在已经画好的流程图上添加新的元素就非常困难了。因此,流程图只适宜于表示算法,用在设计算法的过程中并不是很理想(特别是算法比较复杂,需要经常进行修改时就显得更不方便)。为了方便的进行算法设计,经常会使用一种称为伪代码的工具。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。使用伪代码来描述代码就像写一篇带命题的叙事作文一样,只要按照事件发生的逻辑先后次序来书写就可以了。它不使用图形符号,因此描述算法时相当方便,格式紧凑、易于理解,最重要的是它很易于向计算机程序语言过渡。8.2 选择结构选择结构提供一种多义执行的手段,即当判断条件满足特定要求时就去执行特定的操作。

7、选择结构是三种基本程序结构之一。Fortran语言中提供了多种语句来实现选择结构。本节将主要介绍Fortran语言中选择结构的实现方式和相关的语句。8.2.1 判断语句IF和分支选择语句SELECT CASEIF语句和SELECT CASE语句在Fortran语言中都能够用于构造选择结构,两者在语言功能上并无多大差别。本节简要介绍IF语句和SELECT CASE语句的基本概念和作用,详细的用法会在后面的小节进行介绍。在Fortran 77时代,选择结构是通过IF语句和IF构造来实现的。其中,IF语句只能提供单一选择,即条件满足就执行某种操作,条件不满足则不执行任何操作。IF语句在有多个并列条件

8、需要判断时就很不方便,而且一旦某一个条件成立后,IF语句并不会跳过其余的判断。这就使得判断的效率较低。在有多个并列条件需要判断时,最好使用IF构造。IF构造能够提供多义选择,即构造中存在多个条件选项,当不满足条件一时,就去检查条件二。只要在进行检查的过程中有一个条件满足就会去执行相应的操作,执行完相应的操作后就跳出所在的IF构造,而不会再去检查其余的判断条件。8.2.2 判断语句IF的基本用法使用IF语句来实现选择结构通常有两种用法:语句形式和构造形式。前者一般用于实现单一选择,后者则可以实现二义选择。1语句形式采用IF语句来实现单一选择的一般语法形式如下:IF(逻辑表达式)执行语句2构造形式

9、:除了能够使用IF语句来实现单一判断之外,还可以使用块IF语句来组成IF构造用于多重选择。3IF语句的使用8.2.3 判断语句IF实现多重判断IF构造除了可以实现二义判断之外,还可以实现多重判断。这时候,IF构造中需要加入新的元素ELSE IF语句。有了ELSE IF语句后,IF构造中可以同时存在多个判断条件和多个执行模块,但是只有其中一个条件能够成立,并且只有一个执行模块能够执行。使用IF语句和ELSE IF语句来实现多重判断的基本形式如下:IF(逻辑表达式1)THEN THEN 块ELSE IF(逻辑表达式2)THEN ELSE IF块ELSE ELSE块END IF8.2.4 IF语句的

10、嵌套IF构造除了能够单独使用外,构造中的任意一个语句块里都可以再次嵌入另一个构造。被嵌入的构造可以是另一个IF构造,也可以是另一些形态、功能不同的构造,如CASE构造、DO构造等。前提是必须将整个构造完整地嵌入到IF构造的某一个语句块中,不允许被嵌入构造的一部分在一个语句块中,另一部分在别的语句块或是不在被嵌入的IF构造中,即被嵌入的任何构造不允许跨越两个独立的语句块。IF语句嵌套的形式可以表示如下:构造名1:IF(逻辑表达式1)THEN 构造名2:IF(逻辑表达式2)THEN 构造名3:IF(逻辑表达式3)THEN ENDIF构造名3 ENDIF构造名2 ENDIF构造名18.2.5 IF语

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

12、流程转到标号1指定的语句去执行;如果表达式的值等于零,则程序流程转到标号2指定的语句去执行;如果表达式的值大于零,则程序流程转到标号3指定的语句去执行。8.2.6 SELECT CASE语句的用法SELECT CASE语句是Fortran 90/95标准中新增加的语句。该语句用于容纳CASE块,为程序员提供了一种从多个备用可执行分支选项中选取一个来执行的手段。尽管多重判断的IF构造也可以实现这一功能,但是在某些多条件选择的应用场合使用IF构造会使代码显得比较繁琐、层次关系比较复杂。使用CASE构造就可以避免这一问题,编写出来的代码也显得更加直观、简洁。CASE构造的作用和IF构造非常类似,它也

13、用于编写分叉选择算法,即根据判断条件的成立与否来区分操作不同的可执行模块。不同之处在于:CASE构造只能把某个判断条件的可能结果区分成若干个孤立的离散值或片断(这意味着CASE构造中的判断条件不允许出现重叠),按不同的值或片断进行不同的操作。如果遇到判断条件比较复杂或者存在多种判断条件互相交叉的情况时,CASE构造在处理这些判断条件时显得不是很方便,在这种情况下只能考虑使用IF构造来进行处理。8.2.7 SELECT CASE语句的应用下面给出一些SELECT CASE语句的实际应用例子。首先演示的程序使用了整型表达式的CASE构造,例子的原型就是程序TEST0802的个人所得税计算程序。在进

14、行改动前需要注意,CASE构造中的选择表达式是不允许为实型表达式的。因此,需要一个将实型数据转换为整型数据的函数,可以考虑使用基本数学函数中的INT函数。8.3 循环结构除了顺序结构、选择结构外,实际的程序中还常常遇到需要重复执行的操作或代码段。在这种情况下,就需要用到一种新的控制结构循环结构。如果程序的世界中缺少了这种结构,那么结果将不可想象。比如上一节最后一个实例中所作的5次猜测,如果没有循环结构,同样功能的代码段,即“猜测-判断”,需要重复书写5次。这种情况至少还知道要重复书写几次,在有的应用领域,如数值领域的迭代求解,甚至连要重复的次数都不清楚。循环结构的出现使得这一类问题变得不再是任

15、何问题。本节就将介绍循环结构的相关内容。8.3.1 基本的DO构造DO构造在Fortran 77和Fortran 90/95中都提供用以执行循环操作,但是两个标准在DO构造的具体实现形式上是不同的。尽管这样,两个标准下的各种DO循环都可以归纳为如下所示的DO构造一般形式:构造名:DO 标号循环控制块终止语句其中,构造名选项只允许在Fortran 90/95标准中使用,用于标识构造的起止范围;DO语句后的标号选项在Fortran 77和Fortran 90/95标准中同样适用,尽管带标号的DO构造是较老的语法形式;循环控制用于控制循环的执行,提供循环停止或跳出循环的手段等;中止语句用于标定循环构

16、造的结束位置,并不是说循环执行到该条语句就会停止执行,而是通过该条语句将流程返回到DO语句。8.3.2 无条件循环与DO语句现实中的循环可以分为不带循环变量与带循环变量两种形式,前者只能通过循环体中的条件判断等跳出循环体;后者则能够通过循环变量来执行确定次数的重复操作。后者也可以称为无条件的循环,它可以不通过条件判断来实现循环的终止。当需要执行的循环次数为已知时,使用DO语句来实现循环比较方便。它由一个DO语句和循环体组成,在Fortran 90/95标准中的一般形式如下:构造名:DO 循环变量=循环初值,循环终值,循环增量 循环体ENDDO 构造名8.3.3 条件循环与DO构造在编程实践中,

17、除了会遇到执行次数确定的循环外,还有一种情况是执行次数未知的循环。这一类循环不能通过使循环变量“增加”到循环终值的形式来终止,只能通过循环体中的判断条件来控制程序的流程是否跳出循环构造。因此,这种循环又被称为条件循环,在相应的循环构造中不含醒房刂票淞俊1条件循环实现方式一2条件循环实现方式二除了将判断条件写在循环体内的方式(也称为直到型循环)之外,还可以通过WHILE语句来实现当型循环。在Fortran 90/95标准中,DO WHILE语句被增加到循环构造方式中以支持当型循环。8.3.4 循环的署名同其他的一些构造一样,循环也是可以命名的,命名的原则同变量的命名原则完全一致。循环一旦命名,则

18、在循环终止语句后必须跟上循环的名字,以使编译程序明白那一个循环结构被封闭。命名的循环在有多层嵌套或是DO构造较多的情况下会使各个循环显得更加清晰。下面来看一段实际的例子。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构造。在一个DO循环中又完整地包含另一个DO循环的方法,称为DO循环的嵌套。循环

19、嵌套中的各层循环变量不允许重名。循环嵌套的层数可以不限,但是循环嵌套的层次太多会使得各层循环不容易分辨。对此,可以通过对循环进行命名以使循环嵌套的层次更清晰。要注意,循环嵌套中的内循环应当完整地嵌套在外循环之内,也就是说内循环是外循环中循环体的一部分,内外循环不允许交叉。例如,如下形式的循环嵌套是合法的:OUT:DO I=1,4 IN:DO J=1,5 ENDDO INENDDO OUT 8.3.6 DO循环规则在使用DO循环时,需要注意循环的一些其它规则。比如,循环变量可以在循环体中被引用,但不应当再被赋值,即使循环变量的值保持不变。例如下面的写法都是不正确的,循环变量N和M不能在循环体内被

20、重新赋值:DO N=1,10 N=N*2 ENDDODO M=1,10 M=M ENDDO8.3.7 隐式DO循环隐式DO循环实际上是一种带控制循环变量的DO循环,但简化成只有DO循环的第一句,并且把关键字DO隐去。隐式DO循环的一般形式如下:I=m1,m2,m3其中,m1表示循环的初值;m2表示循环的终值;m3表示循环的增量。如果省略本项目,则默认为1。隐式DO循环不是一种可以独立存在的语句。它只能作为输入输出列表的一个组成部分,用来控制重复读写的次数。它的应用形式如下:(I/O列表,循环变量名=循环初值,循环终值,循环增值)8.4 循环的控制在Fortran 90/95标准中,引入了两个控

21、制循环执行流程的语句EXIT和CYCLE。这两条语句实际上在某些Fortran 77编译器中早已被当成了不成文的标准之一了。8.4.1 EXIT语句在实际变成种,有许多实际问题是无法预先知道循环次数的,比如一些数学和工程领域中的迭代算法。对于这类问题,最常见的做法是给出一个判别条件。如果满足这个判别条件就重复执行循环体,否则就退出循环。因此有条件循环时循环的执行次数不是固定的。传统的做法是使用GOTO语句来使流程跳出循环,但这种方法不符合结构化程序设计的要求。针对这种情况,Fortran 90/95通过引入EXIT语句来满足结构化程序设计的要求。EXIT语句的作用是停止循环并使流程控制退出循环

22、结构,因此又被称为出口语句。该语句的一般形式如下:EXIT DO构造名8.4.2 EXIT语句与条件循环通过DO WHILE语句来实现循环猜测,在这条DO WHILE语句中的逻辑判断表达式就是简单的逻辑真(TRUE)。这种用法是允许的,它表示当型循环的执行条件一直满足,无须进行判断。但是在使用时应该注意,在循环体内一定要提供跳出循环的手段,否则循环会一直执行下去形成死循环。下面的代码通过在判断语句中加入EXIT语句,跳出循环。IF(Rchar=Gchar)EXIT如果用户输入的字符等于系统随机得到的字符,则执行EXIT语句退出循环。如果用户猜测的字符不正确,则会向用户提示应该向哪个字符方向进行

23、猜测。8.4.3 EXIT语句与无条件循环除了应用于条件循环中用作循环退出的手段外,EXIT语句还可以应用于无条件循环中。当EXIT语句应用于无条件循环中时,如果循环变量大于循环终值或是与EXIT语句配合的逻辑表达式为真都会跳出循环的执行。这种应用通常用在无法预知循环执行的次数并且不知道循环退出条件是否能够满足的场合。比如,计算流体力学中求解流动问题时,通常采用这种方法来提供双重的循环退出机制。由于这类问题的复杂性会涉及到计算方法、流动对象的网格好坏等因素,通常不知道该问题是否能够收敛,也不知道需要计算多少步才能收敛。8.4.4 CYCLE语句CYCLE语句是另一种常用于循环的流程控制语句。同

24、EXIT语句不一样,CYCLE语句的作用不是流程跳出循环,而是使流程重新回到循环的开头。该语句的一般形式为:CYCLE DO构造名当循环执行到CYCLE语句时,它会使循环的流程跳过位于它之后的那部分DO块,重新返回到循环的第一个可执行语句开始执行。运用CYCLE语句,可以使循环在某一次的迭代过程中不执行该语句后面的代码,使循环的应用更为灵活多变。CYCLE语句与EXIT语句一样属于特定的DO构造。如果语句引用了DO构造名,则它属于该构造,否则它属于所出现的最内层DO构造。8.5 再论GOTO语句GOTO语句是相当古老的流程控制语句,在Fortran 77时代是主要的流程控制语句。尽管该语句功能

25、强大,但是滥用该语句会造成整个程序的流程杂乱无章,不符合结构化程序设计的要求。这种说法并不意味着GOTO语句就不能使用,而是建议在程序中慎用该语句。当然,某些GOTO语句的形式,如计算GOTO语句和赋值GOTO语句,在Fortran 90/95标准中是被废除、不建议使用的语句。8.5.1 无条件GOTO语句该语句的一般形式如下:GOTO label其中,label是本程序单元中可用的语句标号,必须出现在可执行语句之前。比如X=Y+3.GOTO 43 Y=Y+5.4 Z=X+Y8.5.2 计算GOTO语句计算GOTO语句在Fortran 95标准中是一项被废除的语法,这里只作简单介绍以便在阅读一

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

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

28、去使用GOTO语句。只要在使用中时刻牢记GOTO语句只在一个基本程序结构中使用,程序流程的跳转仅限于基本结构之内。8.6 程序结束、终止和暂停在Fortran中,程序的结束、终止和暂停都由相应的语句来完成。正确的了解和使用这些语句不仅能使程序的结构更为清晰,还能提供额外的功能以加强程序的交互性。本节将介绍Fortran中这三种操作的对应语句。8.6.1 程序结束(END)在Fortran中,END语句的作用主要有两点:结束本程序单位的运行;作为一个程序单位结束的标志。END语句只能出现在一个程序单元中的最后一行,并且一个程序单元只能有一个END语句。在主程序中,END语句的作用是使整个程序结束

29、运行。在子程序中,END语句一方面作为子程序结束的标志,另一方面则使流程返回到调用程序中。8.6.2 程序终止(STOP)在Fortran中,STOP语句的唯一作用就是终止程序的运行。同END语句不同,STOP语句可以出现在程序可执行语句中的任意位置,并且可以有多个。程序在运行到STOP语句时,就会停止执行。子程序中的STOP语句并不会使流程返回到调用程序,而是直接停止整个程序的执行。当一个程序中有多个STOP语句时,为了使用户能够辨别是哪一条STOP语句停止了程序的运行,可以在执行STOP语句的同时输出必要的信息。其一般形式如下:STOP 停止代码8.6.3 程序暂停(PAUSE)PAUSE

30、语句又叫暂停语句,这是一个Fortran 77的遗留产物。在Fortran 90中不推荐使用该语句,在Fortran 95中则被废止。这主要是由于该语句可能会造成程序执行的不可预料性,例如在Compaq Visual Fortran中进行视窗程序开发时,如果使用了PAUSE语句,程序并不会如预期那样暂停执行,而是反复不断的弹出控制台窗口。PAUSE语句的作用是使程序暂时停止执行,而不是终止或结束执行。在程序执行到该语句时,系统只是暂时将程序的执行挂起来,等待用户的进一步指令。PAUSE语句在程序调试时非常有用。比如一个大的计算任务是由几个小的子计算任务依次执行来完成的,这就可以在每一个子计算任务的末尾加上PAUSE语句,一段一段的进行调试。当所有的子计算任务都调试完成、排除问题之后,再将所有的PAUSE语句去掉。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com