




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章程序流程控制 在前面的章节中 程序的执行都是按照语句出现的先后次序来执行的 在实际的计算任务中 能够按照固有的执行次序完成计算的问题只是少数的简单问题 大多数的问题往往在程序执行过程中 根据实现设计的计算步骤 也就是通常所说的算法 往往会出现若干分支选项或是重复计算的情况 流程控制就是提供一种选择 使得除了常规的串行计算序列之外 能够应对这个序列中可能出现的选择分支与循环的情形 本章将介绍算法与流程的基本知识和两种基本的控制结构 8 1算法与流程 要想充分利用计算机的高速计算能力来处理实际的问题 需要使用者能够将问题抽象成计算能够理解的计算机语言 也就是使用者应该编写计算机程序的能力 那么学习了一种计算机语言是否就具有了编程的能力呢 答案是否定的 使用者还需要具有将实际问题分解成一连串具体可操作步骤的能力 这就涉及到算法的问题了 通常意义上的编程高手 不仅仅是指这个人对于某一门计算机语言有深入的研究 还指这个人在算法上也有一定的造诣 8 1 1算法 学习一种计算机语言仅仅学习它的语法规则还不够 更重要的是要学习如何针对各种类型的具体问题 制定行之有效的解决方法和操作步骤 也就是所谓的算法 Algorithm 只要学会了制定正确且有效的算法 用何种高级计算机语言来编写具体的计算机程序就仅仅只是一个工具选择的问题了 因此 算法的设计也是计算机程序设计的核心内容 需要注意的是 算法这个词所涉及的并不仅仅是计算的问题 算法可以包括很多领域 泛指为解决实际而采取的方法和步骤 在英语中 计算方法和算法是两个词 前者是 ComputationalMethod 后者是 Algorithm 计算方法更像通常意义上所理解的算法 它指求解数值解的近似方法 实际的 算法 一词含义更为广泛 它不仅仅指数值计算中的计算方法 还可以指事务处理中的规章流程 物资供应中的调配方法 糕点师傅制作蛋糕的技法等 而程序员所关心的 自然仅仅是指能够在计算机上实现的算法 8 1 2传统流程图 流程图是一种算法描述手段 它用一些图框来表示计算过程中各种类型的操作 在图框中写出算法的各个步骤 然后用带箭头的线条把这些图框连接起来 以表示执行的先后顺序 采用这种方式来表示算法 形象直观 理解起来非常容易 美国国家标准化协会ANSI规定了一些常用的流程图符号 已为世界各国的程序工作者普遍采用 下面介绍最常用的一些流程图符号 8 1 3基本程序结构 前一节介绍的流程图又称为传统流程图 传统流程图中使用流程线来指出各个框之间的执行顺序 流程线在使用上没有严格限制 因此 流程图的绘制者可以根据自身的意愿将流程线画成他想要的形式 随之而来的是程序的执行流程也随意地转来转去 这种做法使流程图显得杂乱无章 阅读者需要花费相当的精力去追踪程序流程 对算法逻辑的理解也较为困难 人们为这种情况起了一个名字 BS 意思是一碗面条 要提高算法的描述质量 使算法在设计和阅读方面都变得方便 就必须限制流程线的滥用 即流程线不能毫无规律的四处乱转 必须按一定的方向来绘制 但是 分支结构和循环结构又是在描述算法时不可避免的 一个算法不可能按从头到尾的顺序执行下来 总会有一些向前或向后的非顺序转移 针对这些问题 人们设计了三种最基本的流程结构 使用这三种基本结构就可以表示一个良好的算法 可以将这些基本结构称为预制件 一个算法就是通过这些预制件像搭积木一样按顺序排列起来的 8 1 4用伪代码表示算法 用前面介绍的流程图来表示算法直观易懂 但画起来却比较费事 同时在设计一个算法时往往不可能一蹴而就 经常需要对原来的想法进行反复修改 这时 想要在已经画好的流程图上添加新的元素就非常困难了 因此 流程图只适宜于表示算法 用在设计算法的过程中并不是很理想 特别是算法比较复杂 需要经常进行修改时就显得更不方便 为了方便的进行算法设计 经常会使用一种称为伪代码的工具 伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法 使用伪代码来描述代码就像写一篇带命题的叙事作文一样 只要按照事件发生的逻辑先后次序来书写就可以了 它不使用图形符号 因此描述算法时相当方便 格式紧凑 易于理解 最重要的是它很易于向计算机程序语言过渡 8 2选择结构 选择结构提供一种多义执行的手段 即当判断条件满足特定要求时就去执行特定的操作 选择结构是三种基本程序结构之一 Fortran语言中提供了多种语句来实现选择结构 本节将主要介绍Fortran语言中选择结构的实现方式和相关的语句 8 2 1判断语句IF和分支选择语句SELECTCASE IF语句和SELECTCASE语句在Fortran语言中都能够用于构造选择结构 两者在语言功能上并无多大差别 本节简要介绍IF语句和SELECTCASE语句的基本概念和作用 详细的用法会在后面的小节进行介绍 在Fortran77时代 选择结构是通过IF语句和IF构造来实现的 其中 IF语句只能提供单一选择 即条件满足就执行某种操作 条件不满足则不执行任何操作 IF语句在有多个并列条件需要判断时就很不方便 而且一旦某一个条件成立后 IF语句并不会跳过其余的判断 这就使得判断的效率较低 在有多个并列条件需要判断时 最好使用IF构造 IF构造能够提供多义选择 即构造中存在多个条件选项 当不满足条件一时 就去检查条件二 只要在进行检查的过程中有一个条件满足就会去执行相应的操作 执行完相应的操作后就跳出所在的IF构造 而不会再去检查其余的判断条件 8 2 2判断语句IF的基本用法 使用IF语句来实现选择结构通常有两种用法 语句形式和构造形式 前者一般用于实现单一选择 后者则可以实现二义选择 1 语句形式采用IF语句来实现单一选择的一般语法形式如下 IF 逻辑表达式 执行语句2 构造形式 除了能够使用IF语句来实现单一判断之外 还可以使用块IF语句来组成IF构造用于多重选择 3 IF语句的使用 8 2 3判断语句IF实现多重判断 IF构造除了可以实现二义判断之外 还可以实现多重判断 这时候 IF构造中需要加入新的元素 ELSEIF语句 有了ELSEIF语句后 IF构造中可以同时存在多个判断条件和多个执行模块 但是只有其中一个条件能够成立 并且只有一个执行模块能够执行 使用IF语句和ELSEIF语句来实现多重判断的基本形式如下 IF 逻辑表达式1 THENTHEN块ELSEIF 逻辑表达式2 THENELSEIF块 ELSEELSE块ENDIF 8 2 4IF语句的嵌套 IF构造除了能够单独使用外 构造中的任意一个语句块里都可以再次嵌入另一个构造 被嵌入的构造可以是另一个IF构造 也可以是另一些形态 功能不同的构造 如CASE构造 DO构造等 前提是必须将整个构造完整地嵌入到IF构造的某一个语句块中 不允许被嵌入构造的一部分在一个语句块中 另一部分在别的语句块或是不在被嵌入的IF构造中 即被嵌入的任何构造不允许跨越两个独立的语句块 IF语句嵌套的形式可以表示如下 构造名1 IF 逻辑表达式1 THEN 构造名2 IF 逻辑表达式2 THEN 构造名3 IF 逻辑表达式3 THEN ENDIF 构造名3 ENDIF 构造名2 ENDIF 构造名1 8 2 5IF语句的特殊用法 在Fortran77中 IF语句还能够实现一种特殊的选择方法 也就是算术IF语句 算术IF语句根据算术表达式值得结果 有条件的将程序的计算流程转到三条执行语句中的一句 IF语句的这种用法的基本形式如下 IF 表达式 标号1 标号2 标号3其中 表达式为标量整型或实型表达式 两端用括弧括起来 标号1至3必须是本程序单元中的有效可执行语句的标号 语句中所有的三个语句标号都必须书写 但并不一定要指向三个不同的语句 在同一个算术IF语句中允许同一个语句标号出现多次 算术IF语句在执行时 首先会计算表达式的值 根据表达式的值来确定要执行哪一个标号指定的执行语句 如果表达式的值小于零 则程序流程转到标号1指定的语句去执行 如果表达式的值等于零 则程序流程转到标号2指定的语句去执行 如果表达式的值大于零 则程序流程转到标号3指定的语句去执行 8 2 6SELECTCASE语句的用法 SELECTCASE语句是Fortran90 95标准中新增加的语句 该语句用于容纳CASE块 为程序员提供了一种从多个备用可执行分支选项中选取一个来执行的手段 尽管多重判断的IF构造也可以实现这一功能 但是在某些多条件选择的应用场合使用IF构造会使代码显得比较繁琐 层次关系比较复杂 使用CASE构造就可以避免这一问题 编写出来的代码也显得更加直观 简洁 CASE构造的作用和IF构造非常类似 它也用于编写分叉选择算法 即根据判断条件的成立与否来区分操作不同的可执行模块 不同之处在于 CASE构造只能把某个判断条件的可能结果区分成若干个孤立的离散值或片断 这意味着CASE构造中的判断条件不允许出现重叠 按不同的值或片断进行不同的操作 如果遇到判断条件比较复杂或者存在多种判断条件互相交叉的情况时 CASE构造在处理这些判断条件时显得不是很方便 在这种情况下只能考虑使用IF构造来进行处理 8 2 7SELECTCASE语句的应用 下面给出一些SELECTCASE语句的实际应用例子 首先演示的程序使用了整型表达式的CASE构造 例子的原型就是程序TEST0802的个人所得税计算程序 在进行改动前需要注意 CASE构造中的选择表达式是不允许为实型表达式的 因此 需要一个将实型数据转换为整型数据的函数 可以考虑使用基本数学函数中的INT函数 8 3循环结构 除了顺序结构 选择结构外 实际的程序中还常常遇到需要重复执行的操作或代码段 在这种情况下 就需要用到一种新的控制结构 循环结构 如果程序的世界中缺少了这种结构 那么结果将不可想象 比如上一节最后一个实例中所作的5次猜测 如果没有循环结构 同样功能的代码段 即 猜测 判断 需要重复书写5次 这种情况至少还知道要重复书写几次 在有的应用领域 如数值领域的迭代求解 甚至连要重复的次数都不清楚 循环结构的出现使得这一类问题变得不再是任何问题 本节就将介绍循环结构的相关内容 8 3 1基本的DO构造 DO构造在Fortran77和Fortran90 95中都提供用以执行循环操作 但是两个标准在DO构造的具体实现形式上是不同的 尽管这样 两个标准下的各种DO循环都可以归纳为如下所示的DO构造一般形式 构造名 DO 标号 循环控制 块终止语句其中 构造名选项只允许在Fortran90 95标准中使用 用于标识构造的起止范围 DO语句后的标号选项在Fortran77和Fortran90 95标准中同样适用 尽管带标号的DO构造是较老的语法形式 循环控制用于控制循环的执行 提供循环停止或跳出循环的手段等 中止语句用于标定循环构造的结束位置 并不是说循环执行到该条语句就会停止执行 而是通过该条语句将流程返回到DO语句 8 3 2无条件循环与DO语句 现实中的循环可以分为不带循环变量与带循环变量两种形式 前者只能通过循环体中的条件判断等跳出循环体 后者则能够通过循环变量来执行确定次数的重复操作 后者也可以称为无条件的循环 它可以不通过条件判断来实现循环的终止 当需要执行的循环次数为已知时 使用DO语句来实现循环比较方便 它由一个DO语句和循环体组成 在Fortran90 95标准中的一般形式如下 构造名 DO循环变量 循环初值 循环终值 循环增量 循环体ENDDO 构造名 8 3 3条件循环与DO构造 在编程实践中 除了会遇到执行次数确定的循环外 还有一种情况是执行次数未知的循环 这一类循环不能通过使循环变量 增加 到循环终值的形式来终止 只能通过循环体中的判断条件来控制程序的流程是否跳出循环构造 因此 这种循环又被称为条件循环 在相应的循环构造中不含醒 房刂票淞俊1 条件循环实现方式一2 条件循环实现方式二除了将判断条件写在循环体内的方式 也称为直到型循环 之外 还可以通过WHILE语句来实现当型循环 在Fortran90 95标准中 DOWHILE语句被增加到循环构造方式中以支持当型循环 8 3 4循环的署名 同其他的一些构造一样 循环也是可以命名的 命名的原则同变量的命名原则完全一致 循环一旦命名 则在循环终止语句后必须跟上循环的名字 以使编译程序明白那一个循环结构被封闭 命名的循环在有多层嵌套或是DO构造较多的情况下会使各个循环显得更加清晰 下面来看一段实际的例子 TEST0818 F90 署名循环范例PROGRAMTEST0818IMPLICITNONEINTEGER IPRINT DOI 1 2PRINT 第 I 次循环 ENDDOPRINTENDPROGRAMTEST0818 8 3 5循环的嵌套 同IF构造和SELECTCASE构造类似 DO构造也允许在自身中再嵌入其他的DO构造 在一个DO循环中又完整地包含另一个DO循环的方法 称为DO循环的嵌套 循环嵌套中的各层循环变量不允许重名 循环嵌套的层数可以不限 但是循环嵌套的层次太多会使得各层循环不容易分辨 对此 可以通过对循环进行命名以使循环嵌套的层次更清晰 要注意 循环嵌套中的内循环应当完整地嵌套在外循环之内 也就是说内循环是外循环中循环体的一部分 内外循环不允许交叉 例如 如下形式的循环嵌套是合法的 OUT DOI 1 4IN DOJ 1 5 ENDDOINENDDOOUT 8 3 6DO循环规则 在使用DO循环时 需要注意循环的一些其它规则 比如 循环变量可以在循环体中被引用 但不应当再被赋值 即使循环变量的值保持不变 例如下面的写法都是不正确的 循环变量N和M不能在循环体内被重新赋值 DON 1 10 N N 2 ENDDODOM 1 10 M M ENDDO 8 3 7隐式DO循环 隐式DO循环实际上是一种带控制循环变量的DO循环 但简化成只有DO循环的第一句 并且把关键字DO隐去 隐式DO循环的一般形式如下 I m1 m2 m3 其中 m1表示循环的初值 m2表示循环的终值 m3表示循环的增量 如果省略本项目 则默认为1 隐式DO循环不是一种可以独立存在的语句 它只能作为输入输出列表的一个组成部分 用来控制重复读写的次数 它的应用形式如下 I O列表 循环变量名 循环初值 循环终值 循环增值 8 4循环的控制 在Fortran90 95标准中 引入了两个控制循环执行流程的语句EXIT和CYCLE 这两条语句实际上在某些Fortran77编译器中早已被当成了不成文的标准之一了 8 4 1EXIT语句 在实际变成种 有许多实际问题是无法预先知道循环次数的 比如一些数学和工程领域中的迭代算法 对于这类问题 最常见的做法是给出一个判别条件 如果满足这个判别条件就重复执行循环体 否则就退出循环 因此有条件循环时循环的执行次数不是固定的 传统的做法是使用GOTO语句来使流程跳出循环 但这种方法不符合结构化程序设计的要求 针对这种情况 Fortran90 95通过引入EXIT语句来满足结构化程序设计的要求 EXIT语句的作用是停止循环并使流程控制退出循环结构 因此又被称为出口语句 该语句的一般形式如下 EXIT DO构造名 8 4 2EXIT语句与条件循环 通过DOWHILE语句来实现循环猜测 在这条DOWHILE语句中的逻辑判断表达式就是简单的逻辑真 TRUE 这种用法是允许的 它表示当型循环的执行条件一直满足 无须进行判断 但是在使用时应该注意 在循环体内一定要提供跳出循环的手段 否则循环会一直执行下去形成死循环 下面的代码通过在判断语句中加入EXIT语句 跳出循环 IF Rchar Gchar EXIT如果用户输入的字符等于系统随机得到的字符 则执行EXIT语句退出循环 如果用户猜测的字符不正确 则会向用户提示应该向哪个字符方向进行猜测 8 4 3EXIT语句与无条件循环 除了应用于条件循环中用作循环退出的手段外 EXIT语句还可以应用于无条件循环中 当EXIT语句应用于无条件循环中时 如果循环变量大于循环终值或是与EXIT语句配合的逻辑表达式为真都会跳出循环的执行 这种应用通常用在无法预知循环执行的次数并且不知道循环退出条件是否能够满足的场合 比如 计算流体力学中求解流动问题时 通常采用这种方法来提供双重的循环退出机制 由于这类问题的复杂性会涉及到计算方法 流动对象的网格好坏等因素 通常不知道该问题是否能够收敛 也不知道需要计算多少步才能收敛 8 4 4CYCLE语句 CYCLE语句是另一种常用于循环的流程控制语句 同EXIT语句不一样 CYCLE语句的作用不是流程跳出循环 而是使流程重新回到循环的开头 该语句的一般形式为 CYCLE DO构造名 当循环执行到CYCLE语句时 它会使循环的流程跳过位于它之后的那部分DO块 重新返回到循环的第一个可执行语句开始执行 运用CYCLE语句 可以使循环在某一次的迭代过程中不执行该语句后面的代码 使循环的应用更为灵活多变 CYCLE语句与EXIT语句一样属于特定的DO构造 如果语句引用了DO构造名 则它属于该构造 否则它属于所出现的最内层DO构造 8 5再论GOTO语句 GOTO语句是相当古老的流程控制语句 在Fortran77时代是主要的流程控制语句 尽管该语句功能强大 但是滥用该语句会造成整个程序的流程杂乱无章 不符合结构化程序设计的要求 这种说法并不意味着GOTO语句就不能使用 而是建议在程序中慎用该语句 当然 某些GOTO语句的形式 如计算GOTO语句和赋值GOTO语句 在Fortran90 95标准中是被废除 不建议使用的语句 8 5 1无条件GOTO语句 该语句的一般形式如下 GOTOlabel其中 label是本程序单元中可用的语句标号 必须出现在可执行语句之前 比如 X Y 3 GOTO43Y Y 5 4Z X Y 8 5 2计算GOTO语句 计算GOTO语句在Fortran95标准中是一项被废除的语法 这里只作简单介绍以便在阅读一些旧Fortran程序时能够有所帮助 计算GOTO语句的用途是根据表达式的值来确定程序的控制流程转向一系列设定的分支目标中的一项 这种GOTO语句的一般形式如下 GOTO 标号列表 表达式其中 标号列表由本程序单元中一系列可用的分支目标语句的标号组成 标号之间通过逗号 来分隔 同样的标号允许在标号列表中出现多次 8 5 3赋值GOTO语句 赋值GOTO语句在Fortran90标准中是一种过时的语法 在Fortran95标准中则被废除 同无条件GOTO语句相比 赋值GOTO语句后所跟的不是语句标号 而是表示语句标号的整型变量 需要注意的是 这里的整型变量不允许通过赋值符进行赋值 比如下面的赋值GOTO语句是错误的 I 10GOTOI 赋值GOTO语句中的标号变量必须使用ASSIGN语句来赋值 比如下面的形式就是正确的 ASSIGN10TOIGOTOI 8 5 4用 还是不用 正如前面一节提到的 GOTO语句的滥用在一定程度上决定了这一语句目前的处境 但是GOTO语句自身并没有错误 错误在于程序员过分依赖于GOTO语句的强大功能而没有注意到程序自身应该具有的逻辑性 因此 在新的Fortran标准中除了计算GOTO语句和赋值GOTO语句这两种过时的语法被废除以外 无条件GOTO语句仍然在新标准中保留了自己的一席之地 在实际编程过程中 用不着因为害怕破坏程序的结构而不敢去使用GOTO语句 只要在使用中时刻牢记GOTO语句只在一个基本程序结构中使用 程序流程的跳转仅限于基本结构
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设备安全检查培训制度课件
- 2026届湖南省长沙市芙蓉区长郡芙蓉中学九年级英语第一学期期末经典试题含解析
- 富贵菜种苗种植合同7篇
- 钢结构大棚基础合同4篇
- 委托合同-委托授权和委托合同6篇
- 数学竞赛中国试题及答案
- 黑龙江省哈尔滨市第六十九中学2026届九上化学期中质量跟踪监视模拟试题含解析
- 考点解析-冀教版8年级下册期末试卷含完整答案详解(名校卷)
- 四川省绵阳涪城区2026届九上化学期中学业质量监测试题含解析
- 设备使用课件模板
- YC/T 320-2009烟草商业企业管理体系规范
- GB/T 12755-1991建筑用压型钢板
- 燃气轮机介绍课件
- 2023年南京江宁交通建设集团有限公司招聘笔试模拟试题及答案解析
- 消防安全检查申报表
- 海飞丝销售策划书模板
- YYT 1244-2014 体外诊断试剂用纯化水
- 工程技术研究中心(重点实验室)可行性研究报告
- 城市轨道交通综合监控系统整套课件汇总完整版电子教案(全)
- 部编版五年级上册第一单元集体备课
- 史上最全FMEA教材详解
评论
0/150
提交评论