研究生课程_程序语言设计原理教程_第07章.ppt
《研究生课程_程序语言设计原理教程_第07章.ppt》由会员分享,可在线阅读,更多相关《研究生课程_程序语言设计原理教程_第07章.ppt(21页珍藏版)》请在三一文库上搜索。
1、第7章 程序控制,冯诺依曼机器模型变量的时空特性对程序中求值的次序是十分敏感的 表达式的求值次序是最低层的程序控制,在它的上层是四类控制:顺序控制、选择控制、重复(迭代)、函数或过程调用 再上一层是对程序模块的控制。包括一个程序的各模块组织以及它们与环境的相互关系 并发控制也是一类控制,它可以在语句级,特征块和模块级实施并发控制,,,7.1 一般概述,语句级控制由于GOTO危害导致结构化程序。 1966年Boehm和Jacopini回答了这个问题:任何流程图的计算逻辑都可以用顺序组、 条件选择组、迭代组三种程序结构实现。 保留GOTO的积极作用限制GOTO的副效应, 把它们改头换面变为比较安全
2、的顺序控制器(sequencer)。,命令式语言只要有赋值语句V=EXP,简单的逻辑条件IF(e)和GOTO语句就可以编出一切计算程序(输入/出除外)。,7.2 顺序控制,S1; S2 进一步扩展可为: S1; S2; ;Sn Ada语句较全: 简单_语句:=空_语句 |赋值_语句 | 过程调用_语句 |goto_语句 | 入口调用_语句 |出口_语句 | 返回_语句 |引发_语句 | 夭折_语句 |延迟_语句 | 代码_语句 其中空_语句,赋值_语句 ,延迟语句,代码_语句不影响控制和转移,exit(出口)语句,raise(引发)语句,abort(夭折)语句,return(返回)语句都是顺序
3、控制器。,7.3 条件选择控制,if(e)无结构。Algol60改为ifthenelse结构, 退化是ifthen 悬挂else if E1 then if E2 then S1 else S2 E1为真假均可执行S2 解决if E1 then begin if E2 then S1 else S2 end Pascal,Algol,C if E1 then begin if E2 then S1 end else S2 if E1 then if E2 then S1 endif else S2 endif Fortran-77,Ada if E1 then if E2 then S1 el
4、se S2 endif endif 就近匹配,嵌套if和case e是同一表达式仅值不同 可改换ease Ada 的case语句 IF exp1 THEN ST1 ELSEIF exp2 THEN ST2 ELSEIF exp. . ELSE SF3 ENDIF case Exp is switch (exp) when v1= S1; case v1: S1; when v2= S2; break; . case v2: S2; when vm|vn=Sn; break; when others = St; default: St; end case; next; 执行一个Si跳到end c
5、ase 没有break要顺序执行,直到next,e1,e2,e3,S1,S2,S3,C以条件表达式实现选择控制 a=bc ? b:c if (bc) a=b; else a=c; 条件表达式 条件语句 命令式语言大量依赖顺序命令, 纯函数式语言完全依赖写嵌套函数调用。,7.4 迭代控制,迭代一般用于处理同构的、聚集数据结构的重复操作,诸如数组、表、文件。 显式迭代(循环),显示迭代有以下几种:,无限循环, 有限循环的三种形式: while_do,do_until,do_while_do,FORTRAN 初始 上界 增量 DO L I=EXP1, EXP2, EXP3 Ada for BACKD
6、AY in reverse DAY RANGE loop 在循环控制变量和表达式约定上几十年来一直在演变 C采用迭代元素(Iteration element) iterate () = iterate (; ; ) 对迭代元素不加任何限制。语句,表达式,连续赋值,空均可。先算,再算,若不为零,则算然后执行。若为零出口。若不为零再算,若不为零重复以上步骤,若为零则出循环。,计数循环,例: 用for循环计算表中元素之和,设表list是一简单结构, 一个成分是值value,另一个成分是指向下一表元素的指针next。 可以有以下六种写法: 1 先赋sum初值进入正规for 循环: sum=0; sum
7、 += current -value; for (current=list; current != NULL; current =current - next) sum += current-value /循环控制变量current就用表list 2 sum在循环内赋初值: for (current=list, sum=0; current != NULL; current =current - next) sum += current-value 3 循环控制变量可以在for以外赋初值, 增量在体内赋值: current = list, sum=0; for ( ; current != N
8、ULL; ) sum += current-value, current = current-next; /用,号连接的两语句成为一个命令表达式,4 循环条件为空,用条件表达式完成: current = list, sum = 0; for(; ; ) if (current = NULL) break; else sum += current-value, current-next; /不提倡此种风格 5 完全不用循环体,全部在循环条件中完成 for (current = list, sum = 0; (current = current-next)!= NULL; sum += curre
9、nt-value); /效率最高. 但list不能为NULL表 6 逻辑混乱,也能正确计算: current = list, sum = 0; for(;current=current-next;sum += current-value) if (current = NULL) break; /最坏的风格,list也不能为NULL表,隐式迭代控制,对聚集对象的迭代,APL的隐式迭代 ANSWER A FUNC B /声明定义两参数函数名为FUNC 1 ANSWER (3A) - B /函数定义 X 4 9 16 25 /X,Y束定为整数向量 Y 1 2 3 4 Z (3 4) 1 2 3 4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 研究生课程 程序语言 设计 原理 教程 07
链接地址:https://www.31doc.com/p-5029901.html