文档详情

Fortran95第10章 基本计算(二)选择控制结构

飞***
实名认证
店铺
DOCX
103.09KB
约10页
文档ID:5475281
Fortran95第10章  基本计算(二)选择控制结构_第1页
1/10

第 10章 基 本 计 算 (二 )选 择 控 制 结 构 在上章我们可以看到,赋值语句之所以能够驱动计算过程的运行,除了赋值语句本身构成完整的运算求值指令之外,计算机本身所具有的串行机制保证了,只要把执行语句与说明语句串列下来,然后保证数据对象流的畅通,计算机就能够按照语句序列的次序依次执行下来,从而完成相应的计算任务不过分析一下我们的实际计算任务,就会发现真正完全可以只需要按照一个固有计算序列算下来,就可以完成计算的问题只是少数简单的问题而已,稍微复杂点的问题往往都需要在计算过程当中出现某种判别问题,使得计算途径可以分支,对不同的情形,会有不同的计算途径与不同的计算结果;还会出现反复进行同一种运算,然后再在适当的条件下跳出循环的情形,如果只是使用串行序列来描述此时的运算过程,会使得程序的写作充满重沓的语句显然这些类型的计算任务,或者是语句串行序列无法描述的,或者是描述发生令人难以忍受的所以一种描述计算过程的语言,除了可以构成串行的计算序列之外,还必须能够控制这个序列有可能出现的选择分支与循环的情形,这就是所谓语言的控制结构本章和下章,我们将分别讨论 FORTRAN 所提供的两种类型的控制结构以及相应的控制语句:● 选择控制结构;● 循环控制结构。

把程序序列当中的控制结构清晰地加以强调出来,实际上既有助于程序的阅读,也是符合人的思维的清晰性原则的,因此控制结构的规范化正是编程语言追求结构化的一个主要着力点,但是在早期 FORTRAN 版本里面,并没有完全意识到结构化编程风格的重要性,因此引入了一些常常破坏结构的转移控制语句,而 FORTRAN 语言的现代版本还没有完全放弃它们,但不提倡使用,这些转移控制语句我们在下章也将简略地讨论到10.1 执行顺序一个完整的 FORTRAN 程序,或程序单位,就给出了一个由可执行语句引导的语句执行序列,这个序列就是语句在程序里面出现的序列,称为正常运行序列但是某些可执行结构或可执行语句,能够控制实际的语句运行不止是按照语句书写的序列进行,这样的可执行结构或语句包括控制结构和分支语句控制语句执行序列有两种基本风格:● 使用可执行结构,使得程序能够选择性地运行程序序列里某个特定位置的语句块或结构● 使用能够分支到程序其他任意位置的语句的可执行语句一般说来,上面的第一种方式具有更好的可阅读性和可维护性,因此我们将详细讨论第一种方式的实现,而第二种方式则放在下章末尾简略说明一下10.2 块与可执行结构所谓控制结构由一个或多个语句块和结构构成,其中必定显式地或隐式地包含控制逻辑语句。

根据相应的逻辑控制条件,就可以选择性地运行某个特定的语句块与结构一个块就是一个由 0 个或多个语句与结构构成的序列,句法形式(R801)为:[execution-part-construct]…构成块的语句与结构的序列构成一个程序单位,是一个某种意义上的整体,即或者整个块被执行,或者整个块都不被执行,不能够出现块的某个部分被执行的情形不过也可能出现在整个块被执行的情况下,块内的某些语句没有被执行的情况,例如在块内的比较靠前的分支语句,常常能够制止它后面的语句得到执行,但是从语法意义上来看,整个块的功能得到了完整的实现,因此这种情形也被认为是块的完全执行所谓结构就是由一个或多个语句块或者结构,加上作用于这些块的控制语句构成● 结构通常在块前具有一个初始语句,而在块后具有一个终止语句;● 当结构包含不止一个块时,结构必定包含了用来选择执行哪个块的条件语句,而一个块是否被执行,正是由结构的作为条件语句的控制逻辑语句当中的表达式决定的;● 结构也有可能在块之间放置特定的语句,用来决定相应的块是否被执行;● DO 结构专门用来决定一个块可以被连续地执行的次数例 10-1】 下面给出的可执行结构控制了一个块:IF(K8.3)THENX=0.0Y=100ELSEX=100Y=0.0END IF上例的执行顺序就是:● 首先执行 I8.3,如果为真,则执行 X=0.0,Y=100;● 如果为假,则执行紧跟后面的 ELSE 语句。

● 进入 ELSE 语句后,执行 X=100,Y=0.0● 然后执行 END IF 语句,退出该 IF 结构10.3.2 IF 语句一个 IF 语句用在只需要控制一个语句的场合1. IF 语句的形式IF 语句的句法形式(R807)为;IF(scalar-logical-expression)action-statement【例 10-3】IF(X=0)Y=X+12. IF 语句的运行首先执行逻辑表达式,如果为真值,则执行 IF 语句里的作用语句(action-statement) ;如果为假,则退出该语句,执行程序里跟在 IF 语句后面的其他语句注意作用语句(action-statement)不能是一个 IF 语句,也不能是一个 END 语句如果逻辑表达式包含一个函数引用,那么逻辑表达式的运行可能 产生修改作用语句的副作用,这是允许的作用语句能够改变变量,或输 入输出系统条件,或控制 语句的状 态,作用语句的例子包括赋值,WRITE,GO TO 语 句等;说明性语句, FORMAT 语句,和 ENTRY 语句等不属于作用语句,而结构也不能看成是作用 语句10.4 CASE 结构和 IF 结构类似的是,CASE 结构也可以包含多个块,而最终能够获得执行的最多只能是一个。

和 IF 结构不同的是,CASE 结构的选择是基于结构开头的 SELECT CASE 语句里的标量表达式的取值,这个取值被称为情况指标,它可以是离散型的各种标量值,例如整型,字符型,逻辑型,而在 IF 结构里,用来进行判别而提供选择条件的是逻辑型取值,即只有.TURE.和 .FALSE.两个值得到情况指标之后,搜索所有的 CASE 语句里的情况选择符的值,如果有与情况指标匹配的,则执行相应的 CASE 语句里的块,否则执行具有默认选择符的 CASE,如果不存在具有默认选择符的 CASE,则退出使用 CASE 结构可以很自然地表达需要分情况考虑的问题,同时每种情况的定义必须是已知的例 10-4】 设分段函数: sin()0coxy可以很自然地使用 CASE 结构描述如下:SELECT CASE(x>=0)CASE(.TRUE.)Y=SIN(X)CASE(.FALSE.)Y=COS(X)END SELECT【例 10-5】 一年中十二个月的天数也可以用 CASE 结构表示如下:MONTHDAY :SELECT CASE(MONTH)CASE(2)DAYS= 28CASE(4,6,9,11)DAYS=30CASE(1,3,5,7,8,10,12)DAYS=31END SELECT MONTHDAY10.4.1 CASE 结构的形式CASE 结构的句法形式(R808) 为:[case-construct-name:]SELECT CASE(case-expression)[CASE(case-value-range-list)[case-construct-name]block]…[CASE DEFAULT[case-construct-name]block]END SELECT [case-construct-name]其中的情况表达式(case-expression) 为标量表达式,该表达式经过计算得到的取值为情况指标。

其中的情况值范围(case-value-range) 即连同其括号称为情况选择符,表示它的取值所属的离散区间,也可以就是一个单独的值,它的句法形式(R814)为:case-valuecase-value ::case-valuecase-value :case-value即如果是区间的话,该区间可以是半边开的其中的情况值(case-value)是一个标量初始化表达式,与情况表达式的类型等属性一样所谓初始化表达式即在编译时可以取值的表达式,本质上即常量表达式它们的取值都只能是整型,字符型和逻辑型可以看到在 CASE 结构里,包含了三种语句:● SELECT CASE 语句;● CASE 语句;● END SELECT 语句而在 CASE 语句当中,跟在关键词 CASE 后面的(case-value-range-list)或 DEFAULT 就是情况选择符CASE 结构的一般规则如下:● 如果 CASE 结构具有名称的话,那么结构名称必须成对出现在 SELECT CASE 语句和 END SELECT 语句当中● 情况选择符后面如果出现结构名称的话,必须与 SELECT CASE 语句当中的结构名称一致。

● 具有情况选择符 DEFAULT 的 CASE 语句是可选的,如果它出现在结构当中的话,上述 CASE 结构的句法形式并没有要求它放置在结构的最后● 在一个 CASE 结构里,情况表达式与所有的情况值都必须属于同一个类型,如果属于字符型,它们可以具有不同的长度,但是种别参数必须一致● 情况值范围里面出现冒号时,表示一个区间,而区间的构成隐含着相应的关系表达式● 情况值不能是逻辑型● 如果是字符型的话,则依据字符型的关系运算规则确定相应的取值范围例 10-6】CASE(“ABOUT”:“Z”)里面的情况值范围为按照与处理器相关的默认字符类型的关系运算,在 ABOUT 与 Z之间的所有字符串结构当中的表达式的取值完成后,必 须保证最多只能有一个情况 选择符的值与情况指标值匹配,也即不允许在不同的情况之 间情况值出现重复的情形情况值 DEFAULT 与任何跟所有 结构内的其他情况值都不匹配的情况指 标值匹配例 10-7】CALCU_AREA: SELECT CASE(OBJECT)CASE(RECTANGLE) CALCU_AREAAREA=LENGTH*WIDTHCASE(SQUARE) CALCU_AREAAREA=SIDE*SIDECASE(CIRCLE) CALCU_AREAAREA=PI*RADIUS**2END SELECT CALCU_AREA10.4.2 CASE 结构的运行首先计算 SELECT CASE 语句当中的作为标量表达式的情况指标,它的值最多与结构里的一个情况值匹配,与之匹配的情况值后面紧跟的块得到执行,然后退出结构。

程序进入紧跟该结构的 END SELECT 语句后面的可执行语句或结构如果没有与情况指标值匹配的情况值,而结构里包含了 CASE DEFAULT 语句,按照DEFAULT 的定义,情况值这时必定与之匹配,因此执行该语句后面的块,然后退出该结构如果结构当中不存在 CASE DEFAULT 语句,又没有与情况指标值匹配的情况值,那么退出该结构,不执行结构里的任何块所谓情况指标值与结构里的一个情况值匹配,包含如下情形:● 如果情况值为单独的一个值,则运用等价与非等价关系运算,看是否与指标值等价;● 如果情况值是一个区间,则按照下表 10-1 的定义:表 10-1 不同情况值的匹配情况值范围 匹配的定义case-value1 :case-value2 case-value1 .LE. case-index .LE. case-value2case-value : case-value .LE. case-index:case-value case-value .GE. case-index注意不同 CASE 语句的情况值范围不能有重叠结构的执行最多只允许其中的一个块被执行只能从结构内部分支到该结构的 END SELECT 语句。

不允许分支到 CASE 语句,但可以分支到 SELECT CASE 语句下面的图 10-2 给出了 CASE 结构的运行流的示意图:图 10-2 CASE 结构的运行流示意图:【例 。

下载提示
相似文档
正为您匹配相似的精品文档