研究生课程程序语言设计原理教程第07章.ppt

上传人:文库蛋蛋多 文档编号:2427831 上传时间:2023-02-19 格式:PPT 页数:21 大小:212.50KB
返回 下载 相关 举报
研究生课程程序语言设计原理教程第07章.ppt_第1页
第1页 / 共21页
研究生课程程序语言设计原理教程第07章.ppt_第2页
第2页 / 共21页
研究生课程程序语言设计原理教程第07章.ppt_第3页
第3页 / 共21页
研究生课程程序语言设计原理教程第07章.ppt_第4页
第4页 / 共21页
研究生课程程序语言设计原理教程第07章.ppt_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《研究生课程程序语言设计原理教程第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;;SnAda语句较全:简单_语句:=空_语句|赋值_语句|过程调用_语句|goto_语句|入口调用_语句|出口_语句|返回_语句|引发_语句|夭折_语句|延迟_语句|代码_语句 其中空_语句,赋值_语句,延迟语句,代码_语句不影响控制和转移,exit(出口)语句,raise(引发)语句,abort(夭折)语句,return(返回)语句都是顺序控制器。,7.3 条件选择控制,if(e)无结构。Algo

3、l60改为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 else S2 endif endif 就近匹配,嵌套if和ca

4、se 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 case 没有break要顺序执行,直到next,e1,e2,e3,S1,S2,S3,C以条件表达式实现选择控

5、制 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,EXP3Adafor BACKDAY in reverse DAY RANGE loop 在循环控制变量和表达式约定上几十年来一直在演变 C采用迭代元素(Iteratio

6、n element)iterate()=iterate(;)对迭代元素不加任何限制。语句,表达式,连续赋值,空均可。先算,再算,若不为零,则算然后执行。若为零出口。若不为零再算,若不为零重复以上步骤,若为零则出循环。,计数循环,例:用for循环计算表中元素之和,设表list是一简单结构,一个成分是值value,另一个成分是指向下一表元素的指针next。可以有以下六种写法:1 先赋sum初值进入正规for 循环:sum=0;sum+=current-value;for(current=list;current!=NULL;current=current-next)sum+=current-val

7、ue/循环控制变量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!=NULL;)sum+=current-value,current=current-next;/用,号连接的两语句成为一个命令表达式,4 循环条件为空,用条件表达式完成:current=list,sum=0;for(;)if(current=NULL)

8、break;else sum+=current-value,current-next;/不提倡此种风格5 完全不用循环体,全部在循环条件中完成 for(current=list,sum=0;(current=current-next)!=NULL;sum+=current-value);/效率最高.但list不能为NULL表 6 逻辑混乱,也能正确计算:current=list,sum=0;for(;current=current-next;sum+=current-value)if(current=NULL)break;/最坏的风格,list也不能为NULL表,隐式迭代控制,对聚集对象的迭代

9、,APL的隐式迭代 ANSWER A FUNC B/声明定义两参数函数名为FUNC1 ANSWER(3A)-B/函数定义 X 4 9 16 25/X,Y束定为整数向量 Y 1 2 3 4 Z(3 4)1 2 3 4 1 4 9 16 1 8 27 64/Z束定为34矩阵/若有以下表达式,见右下栏的解释。运算符=为比较,表达式 解释 X+1 X的每一元素加1=(5 10 17 26)X+Y X,Y对应元素相加=(5 11 19 29)X FUNC Y(3*X)-Y=(11 25 45 71)(X+1)=(X+Y)(5 10 17 26),(5 11 19 29)=(1 0 0 0)只有一个元素一

10、样。Z=1 将1与Z的每个元素比较,相同为1,否则0,得(1 0 0 0)(1 0 0 0)(1 0 0 0)+/Z=W 如果W是纯量,结果是一向量其元素是W 在Z中每行出现的次数,如W4时为(1 1 0)。如果W是和Z一样的矩阵,其结果是一长 度等于Z的行数的向量,元素为每行中W,Z 元素匹配的位序。,-一种类似dBASE的dBMAN查询的隐循环 设每个雇员一个文件,当前记录类型域是:lastname sex hours grosspay with held 有以下dBMAN命令:1.display all for last name=Jones and sex=M 2.copy to lo

11、wpay.dat all for grosspay 0,回溯 Prolog查询的回溯实现,设数据库中已列出以下事实:f1.likes(Sara,John)f9.does(Mike,skating)f2.likes(Jana,Mike)f10.does(Jane,swimming)f3.likes(Mary,Dave)f11.does(Sara,skating)f4.likes(Beth,Sean)f12.does(Dave,skating)f5.likes(Mike,Jana)f13.does(John,skating)f6.likes(Dave,Mary)f14.does(Sean,swim

12、ming)f7.likes(John,Jana)f15.does(Mary,skating)f8.likes(Sean,Mary)f16.does(Beth,swimming)查询相爱且有共同运动爱好的两个人?-likes(X,Y),likes(Y,X),does(X,Z),does(Y,Z),匹配 结果 1.沿数据库匹配第一子目标(f1g1)Xf7.Y对X不对 失败 3.回溯重配g1,(f2g1)XJana,YMike 4.匹配g2,沿f1-f5(f5g2)g2成功 5.匹配g3,沿f9-f10(f10g3)XJana,Zswimming 6.匹配g4,f9,Y对,X不对,失败 7.回溯第5

13、步f11-f16无新匹配 失败 回溯第4步f6-f8无新匹配 失败 回溯第3步重配g1(f3g1)XMary,YDave 8.重匹配g2,(f6g2)g2成功 9.匹配g3(f15g3)XMary,Zskating 10.匹配g4,按 Z找Y(f12g4)YMary,Zskating 11.查询全部谓词满足(f3g1)(f6g2)(f15g3)(f12g4)X=Mary,Y=Dave,Z=skating 12.从(f4g1)再查找有无另一组解重复第7-11步,结果 无新解,7.5 异常处理,程序无法执行下去,也就是出现了异常(exception)情况。在早期语言的程序中,出现了这种情况就中断程

14、序的执行,交由操作系统的运行程序处理。现在向用户开放,Ada,C+,Java,定义用户定义:exception;系统定义的异常(Ada):CONSTRAINT_ERROR 凡取值超出指定范围叫约束异常 NUMBER_ERROR 数值运算结果值实现已不能表达 叫数值异常 STORAGE_ERROR 动态存储分配不够时,叫存储异常,异常定义与处理段,TASKING_ERROR 任务通信期间发生的异常叫任务异常。PROGRAM_ERROR 除上四种而外程序中发生的一切异常,都叫程序异常.如子程序未确立就调用等。预定义的可以显式也可以隐式引发,而用户定义的异常必须 显式引发 引发语句:raise;引发

15、语句可出现在任何可执行语句所在的地方。一旦引发,则本程序块挂起转而执行本块异常处理段中同名的异常处理程序。,每个程序块都可以在该块末尾设立异常处理段:declare:;begin:;exception:when=-异常处理段 when。-一般再次引发原异常(缺省名字)end;,Java的异常处理语句,try_catch_finally:try/可能有异常语句组/用throw 显式抛出异常/也可以隐式自动抛出异常 catch()/异常处理段-1/catch(捕捉)try 中抛出的异常对象/不匹配则跳过本catch 不执行 catch()/异常对象段-2/匹配执行后跳过所有catch finall

16、y/善后处理段/只要进入try块,本段必须执行/C+无此机制,其余同,Ada的嵌套异常及异常传播的 with TEXT_IO,MATH_FUNCTIONS;use TEXT_IO,MATH_FUNCTIONS;procedure ONE_CIRCLE(DIAM:Float)is RADIUS,CIRCUMFERENCE,AREA:Float;begin CIRCUMFERENCE:=DIAM*22.0/7.0;RADIUS:=DIAM/2.0;AREA:=RADIUS*RADIUS*22.0/7.0;PRINT_CIRCLE(DIAM,RADIUS,CIRCUMFERENCE,AREA);7

17、exception when NUMBER_ERROR=raise;end ONE_CIRCLE;,procedure CIRCLES is DIAMETER:Float;MAXIMUM:constant Float:=1.0e6;0TOO_BIG_ERROR:exception;PUT(please enter an float diameter.);begin 1loop begin GET(DIAMETER);if DIAMETER MAXIMUM then 2 raise TOO_BIG_ERROR;else 3 exit when DIAMETER PUT(Diameter too large!please reenter.);,5end;6end loop;PUT(“processing finished.”);PUT New_line;end CIRCLE;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号