书签 分享 收藏 举报 版权申诉 / 94
上传文档赚钱

类型第三章-过程式程序的设计语言-课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4146851
  • 上传时间:2022-11-14
  • 格式:PPT
  • 页数:94
  • 大小:748.05KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《第三章-过程式程序的设计语言-课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    第三 程式 程序 设计 语言 课件
    资源描述:

    1、第三章 过程式程序设计语言基本观点:计算实现的模型如果按冯诺依曼原理强制改变内存中的值叫命令(或译指令、强制Imperative式)的。由于强制改变值,程序状态的变化没有一定规则,程序大了就很难查错,很难调试,不易证明其正确。组织程序的范型即:算法过程+数据结构(计算控制+计算对象)3.1 计算对象表示值与类型3.2 计算对象实现存储3.3 计算对象连接束定3.4 计算组织-程序控制3.5 计算组织-函数与过程3.6 计算组织-抽象与封装类型是计算机可能实现的结构和约定对客观世界差异的刻划。同一类型的外延,即同一结构表示所有可能的值构成一个域。分类原则:同样表示结构,同样语义解释,同样的操作。

    2、同类型值运算结果:同类型。无符号整数:二进制解释的值整数:符号 值 3.1 计算对象-值与类型0 10 0 0 1 1 11 11 0 1 0 0 0 1 0 1 0 1 00 0 0 0 1 0 1 0 1 0 1 1 浮点数:符号 阶码 尾数程序语言中:基元(primitive)类型:整型/实(定,浮)/字符/真值/枚举结构(structured)类型:元组/数组/记录(结构)/表/串3.1.1 字面量、变量、常量 名字操纵值,名:字面量 从名字即知类型 字面值不变 变量 符号名要声明类型 值可变 常量 符号名要声明类型 值不变 基元值的名字是地址的别名,地址值在计算机中不恒定 操纵地址的

    3、名字是指针(地址变量)float *p,x=37.32;p=&x;(p)203C(x)117F117F37.32续名值可分导致 x =x +1;按名 按名取值:引用reference 存值 左值 右值 int&Rint=Svar Rint 是引用类型的变量,即左值变量必须给一右值,因 而成Svar别名 y=x+;x 既是右值也是左值3.1.2 值是头等程序对象程序语言中的值 字面量(整、实、布尔、字符、枚举、串)复合量(记录、数组、元组、结构、表、联合、集合、文件)指针值 变量引用(左值、右值)函数和过程抽象,数学对象参与运算的权利是一样的,值是计算对象也要按一致性原则:可出现在表达式中并求值

    4、 可作函数返回值 可单独存储 可以构成复杂的数据结构 可作函数参数3.1.3 类型系统类型定义 值的集合和值上操作集合(V,Op)类型系统 一组可直接使用的类型类型规则类型检查机制3.1.3 类型系统 静态与动态 静 动 变量 有类型 无类型 动态简洁、灵活 参数 有类型 无类型 静态清晰、死板 值 有类型 有类型 弱/强类型无类型 LISP,Smalltalk弱类型 变量有类型。类型兼容性大,系统不作检查强制类型 隐式类型强制(转换),自动截尾,补零。显式 类型强制 PL/1伪强类型 静态均有类型且作检查,由于不严,导出等价准则 Pascal强类型 类型有严格定义,均作检查 Ada类型等价

    5、按结构等价 type A is array(range 1.100)of INTEGER;type B is array(range 1.100)of INTEGER;OA1,0A2:A;OB1,OB2:B;OC1:array(range 1.100)of INTEGER;OD1,OD2:array(range 1.100)of INTEGER;OE1:A;OA1,OA2,OB1,OB2,OC1,OD1,OD2,OE1均等价 续 按名等价 OA1,OA2 是同一类型(都用A声明)OA1,OB1,OC1是不同类型(类型名为A,B,无)OD1,OD2 是同一类型(同时声明,虽无名)OD1,OC1

    6、是不同类型(两次声明)OA1,OE1 是同一类型(虽两次声明,但同名)类型完整性准则 涉及值的类型中不能随意限定操作,力求没有第二类的值续3.1.4 类型兼容 不同类型值混合运算,人为定出计算级别,由低 层升格为高层,结果值是高层的 隐式转换 弱类型 I:=R;显式转换 强类型 I:=Integer(R);强类型按名判定,不同类型名则不兼容只有子类型不同名可以兼容 显式和隐式混合type BASE is INTEGER;subtype SON_TYPE is BASE range 1.1000;-子类型type DIVERSE is new BASE range 1.1000;-派生类型A,B

    7、:BASE;C,D:SON_TYPE;E:DIVERSE;A:=B+C,-合法,结果为B类型赋给AA:=C+E;-不合法A:=C+SON_TYPE(E);-合法,有显式强制A:=E;-不合法,两个类型E:=B+BASE(E);-不合法续3.2 3.2 计算对象的实现计算对象的实现-存存 储储 存储对象是程序对象在计算机中的实现存储对象是程序对象在计算机中的实现 程序对象不一一对应为存储对象程序对象不一一对应为存储对象 x:=0;x,0是两程序对象是两程序对象 只有一个存储对象只有一个存储对象x加指令清零加指令清零 初值常量也不作为单独存储对象初值常量也不作为单独存储对象3.2.1 3.2.1

    8、程序变量的时空特性程序变量的时空特性引用和指针引用和指针P指针是地址变量指针是地址变量 *P是是P所指的内容所指的内容,也有左值和右值也有左值和右值 *P左值是左值是P所指地址值,即所指地址值,即P的值的值 *P右值是所指地址内的内容值右值是所指地址内的内容值136140144A AB BC C3 31 12 23 31 16 63 32 20 0136140144(R RA A)3 31 12 2(R RB B)3 31 16 6(R RC C)3 32 20 0136144(p p1 1)4 44 48 8(p p2 2)4 45 50 04274.543312.27607.01(A A)

    9、1 13 36 6(B B)1 14 40 0(C C)1 14 44 4引用是常指针是变量的别名引用是常指针是变量的别名,但实现是不一样的但实现是不一样的递引用递引用 dereferencedereference通过指针变量引用变量的值为递引用通过指针变量引用变量的值为递引用*P1右值即递引用右值即递引用有些语言显式递引用算符如有些语言显式递引用算符如FORTH的的1 13 1 13 VARIABLE xx (VARIABLE xx (声明变量声明变量xxxx并赋初值并赋初值13)13)2 0 2 0 VARIABLE Y (VARIABLE Y (声明变量声明变量Y Y并赋初值并赋初值0)

    10、0)3 3 xx 2 xx 2*Y!(Y!(相当于相当于Y=xxY=xx*2)2)如果只写如果只写xx 2 xx 2*则为将则为将xxxx的地址乘以的地址乘以2 2放在放在Y Y之中之中3.2.1 变量的时态变量的时态 分配分配/未分配未分配/除分配除分配 分配分配:为程序对象创建为程序对象创建存储对象存储对象 编译时分配叫静态分配编译时分配叫静态分配 allocate 运行时分配叫动态分配如声明指针运行时分配叫动态分配如声明指针p,执执new才分配才分配 未分配未分配:声明了未分配运行时分配声明了未分配运行时分配 除分配除分配:取消存储对象取消存储对象(程序对象程序对象)delete操作显式

    11、操作显式 自动除配自动除配:无用单元收集无用单元收集Garbage collection动态语言有,静态可有动态语言有,静态可有Ada可没有可没有C续续43?a b c d e f 声明和定义:定义必然声明;反之不然声明和定义:定义必然声明;反之不然 声明的两个作用声明的两个作用:给出对象:给出对象,该对象的时间有效性该对象的时间有效性 出了声明的作用域该对象失去定义。在声明的作用出了声明的作用域该对象失去定义。在声明的作用 域内显式删除也失去定义域内显式删除也失去定义定义定义/未定义未定义/失去定义失去定义 只要分配存储对象必然有残值只要分配存储对象必然有残值,无意义即未定义无意义即未定义

    12、赋值或初值变量得以定义赋值或初值变量得以定义a,b:分配且有定义分配且有定义c,d:分配未定义或失去定义分配未定义或失去定义e,f:未分配或除配未分配或除配3.2.2 存储模型 基元类型值基元类型值 仅除数组仅除数组 记录、构造、表记录、构造、表 不可更新其中一元素不可更新其中一元素 函数抽象函数抽象,ML重过程重过程 变量引用变量引用可存储值可存储值StorableStorable:指最小的可直接访问的可存储单元中的值指最小的可直接访问的可存储单元中的值Pascal可存储值可存储值:集合不选择更新某一元素是可存储值,集合不选择更新某一元素是可存储值,Pascal,C ,Ada数组可选择更新数

    13、组可选择更新,不是可存储值。不是可存储值。引用非可存储引用非可存储(C+可存储可存储),过程和函数名也非可存储过程和函数名也非可存储ML几乎都是可存储值几乎都是可存储值,也带来毛病:每次更新结构数据都要重也带来毛病:每次更新结构数据都要重来。它们是:来。它们是:(if exp then sin else cos)(x)得得sin(x)cos(x)可存储值可存储值 存储对象的生存期存储对象的生存期 全局变量全局变量 和引用程序寿命一样长和引用程序寿命一样长 局部变量局部变量 和程序中的一个模块寿命一样长和程序中的一个模块寿命一样长 持久变量持久变量 比程序寿命长除非显式撤销比程序寿命长除非显式撤

    14、销 文件变量文件变量 瞬间变量(瞬间变量(transient)持久变量的逆持久变量的逆每个存储对象都有创建每个存储对象都有创建(生生),可用可用(活着活着),撤销,撤销(死死)的的生命期。按生命期长短分:生命期。按生命期长短分:静态存储对象静态存储对象 编译时分配存储对象编译时分配存储对象,近代语言类属对象直到装入后近代语言类属对象直到装入后确立确立(elaboration)之时才定下存储对象叫静态分配之时才定下存储对象叫静态分配 一旦执行不再改动其存储,直至所在存储单元无效一旦执行不再改动其存储,直至所在存储单元无效叫静态叫静态(Static)存储对象存储对象 全局变量均为隐式的静态对象全局

    15、变量均为隐式的静态对象,COBOL,BASIC全全静态,静态,ALGOL,C是显示声明静态,是显示声明静态,Pascal除全局,除全局,Ada 不能。不能。C语言的静态变量是既私有又不随所在声明块中消逝语言的静态变量是既私有又不随所在声明块中消逝,全局于所在文件。全局于所在文件。auto是静态分配动态装入不叫静态对是静态分配动态装入不叫静态对象。象。Extern是静态对象。是静态对象。externstaticauto动态存储对象动态存储对象 把寿命特长的(如文件,全局量)排出来归到栈底的某一组,把寿命特短的(如循环控制变量)另立嵌套组,这个问题也就解决。块5块66块1块2块3块45466546

    16、寿寿命命动态存储对象动态存储对象XX 二叉树其大小由输入值定在运行中确立。内存开二叉树其大小由输入值定在运行中确立。内存开辟堆(辟堆(heap)随生成随堆放动态存储对象。指针(即随生成随堆放动态存储对象。指针(即堆变量)所指程序对象用堆存放堆变量)所指程序对象用堆存放 问题:多次重分,内存成了小洞问题:多次重分,内存成了小洞 解决办法:按寿命分组寿命最长的放在较低(按解决办法:按寿命分组寿命最长的放在较低(按其所在块生命期)。其所在块生命期)。重复使用重复使用无法再分无法再分堆栈帧管理堆栈帧管理 由动态堆栈联想到一般嵌套式语言可按动态堆栈式管由动态堆栈联想到一般嵌套式语言可按动态堆栈式管理理,

    17、多数变量和所在块寿命一样长多数变量和所在块寿命一样长(语言称之为自动变量语言称之为自动变量)动态堆栈式存储动态堆栈式存储 按程序动态执行按程序动态执行,以动态堆栈管理局部数据和动态生以动态堆栈管理局部数据和动态生成数据成数据 运行时堆栈运行时堆栈Run-time stack其底压入程序代码和全局,其底压入程序代码和全局,静态量。每执行到调用时生成一个堆栈帧静态量。每执行到调用时生成一个堆栈帧(frame)记录该记录该块数据信息块数据信息,每当返回则局部量自动撤销对于递归块的每当返回则局部量自动撤销对于递归块的局部量可多次生成多次消除。局部量可多次生成多次消除。动态链描述调用父辈地址动态链描述调

    18、用父辈地址,返回地址是继续执行的下返回地址是继续执行的下一地址。一地址。静态链描述词法父辈静态链描述词法父辈lexical parent块地址块地址,按该块复制按该块复制局部变量。局部变量。参数参数 返回地址返回地址动态链动态链静态链静态链返回值返回值局部变量局部变量程序代码程序代码全局静态存储全局静态存储首先调用块首先调用块堆栈帧堆栈帧第二调用块第二调用块堆栈帧堆栈帧最新最新调用块调用块堆栈帧堆栈帧临时变量空间临时变量空间栈顶栈顶堆栈帧堆栈帧组织组织运行时堆栈运行时堆栈续续调调用用块块首首地地址址本本帧帧词词法法父父辈辈 举例举例 求整数连乘积之递归程序求整数连乘积之递归程序:functio

    19、n product(jj:Integer):Integer;var kk:Integer;begin if jj (does (运行时动作指令,运行时动作指令,取下标取下标)5 5 rangecheckrangecheck (函数调用,函数调用,检查下标检查下标)6 6 if (if (如果不越界如果不越界)7 7 linearsublinearsub (函数调用,函数调用,计算线性下标值计算线性下标值)8 8 then (then (给出数组基地址和位移给出数组基地址和位移)9 9 ;(;切换成解释执行,切换成解释执行,数据类型定义毕数据类型定义毕)10 10 11 211 2by3arra

    20、y box (by3array box (声明并分配名为声明并分配名为boxbox的数组变量的数组变量)12 10 1 2 12 10 1 2 box (box (给给box(1box(1,2)2)赋值赋值10)10)3.3.3 3.3.3 无类型语言束定无类型语言束定名字名字 束定束定length age 符号表符号表 运行时内存存储对象:类型标签运行时内存存储对象:类型标签scalar numberarray of 4 number不同时刻可以将一名字束定到不同存储对象上。不同时刻可以将一名字束定到不同存储对象上。APL语言可显式操纵束定:束定符号语言可显式操纵束定:束定符号 APLAPL

    21、是无类型解释执行语言,以下是计算税金的程序:是无类型解释执行语言,以下是计算税金的程序:TAXCALCTAXCALC 1 ENTER GROSS PAY 1 ENTER GROSS PAY 2 GROSS 2 GROSS /输入什么值输入什么值GROSSGROSS就是就是 什么类型什么类型,表示终端输入。表示终端输入。3 3 LESS LESS GROSS 18000/GROSS (n mod 2=0)函数型构函数型构 函数体函数体 束定束定 函数定义函数定义 值定义值定义 fun even(n:int)=(n mod 2=0)函数抽象函数抽象 体体顺序声明的顺序声明的Ada例子例子packa

    22、ge MANAGER is -package MANAGER is -声明程序包规格说明声明程序包规格说明 type PASSWORD is privatetype PASSWORD is private;-声明私有类型未定义声明私有类型未定义 NULL_PASSWORD:coustantNULL_PASSWORD:coustant PASSWORD PASSWORD;-立即立即用私有类型声明变量用私有类型声明变量 function GET return PASSWORDfunction GET return PASSWORD;-返回私有类型函数返回私有类型函数 function IS_VAL

    23、ID(P:in PASSWORD)return BOOLEANfunction IS_VALID(P:in PASSWORD)return BOOLEAN;PrivatePrivate type PASSWORD is range 0.700 type PASSWORD is range 0.700;-定义私有类型定义私有类型 NULL_PASSWORD:constant PASSWORD:=0 NULL_PASSWORD:constant PASSWORD:=0;-此时才定义此时才定义end MANAGERend MANAGER;顺序与并行声明顺序与并行声明 声明是顺序的声明是顺序的,声明后

    24、立即有用声明后立即有用,次序是重要的次序是重要的 D1;D2;D3 /D2中可利用中可利用D1的声明,的声明,D3可利用可利用D1,/D2的声明(见的声明(见Ada例)例)并行声明并行声明D1D2它们一般相互独立它们一般相互独立,确立次序不影响语义确立次序不影响语义 ML的例子:的例子:Val Pi=3.14159 and sin=fn(x:real)=(.)and cos=fn(x:real)=(.)and tan=fn(x:real)=sin(x)/con(x)非法非法 并行声明仅当声明语句结束,各并行子声明同时生效并行声明仅当声明语句结束,各并行子声明同时生效 递归声明递归声明 用声明定

    25、义自己的声明用声明定义自己的声明 D=D 直接递归。名字一样就是递归直接递归。名字一样就是递归 D1=D2 间接递归,或相互递归间接递归,或相互递归 D2=D1 指明递归(指明递归(ML)val rec power=fn(x:real,n:int)=if n=0 then 1.0 else if n 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 e1e2e3S1S

    26、2S3 C C以条件表达式实现选择控制以条件表达式实现选择控制 a=bc?b:c if(bc)a=b;else a=c;条件表达式 条件语句 命令式语言大量依赖顺序命令,纯函数式语言完全依赖写嵌套函数调用。迭代控制迭代控制迭代一般用于处理同构的、聚集数据结构的重复操作,诸如数组、表、文件。显式迭代(循环),显示迭代有以下几种:无限循环Bloop name;Bend loop;有限循环的三种形式:while_do Exp T FB while Exp loop B:end loop F B Exp TREPEAT BUNTIL Exp;do_until B1 exp1 T F F T exp2B

    27、2BEGINB1;WHILE Exp1B2;REPEAT Exp2do_while_doFORTRAN 初始 上界 增量DO L I=EXP1,EXP2,EXP3Adafor BACKDAY in reverse DAY RANGE loop 在循环控制变量和表达式约定上几十年来一直在演变 C采用迭代元素(Iteration element)iterate()=iterate(;)对迭代元素不加任何限制。语句,表达式,连续赋值,空均可。先算,再算,若不为零,则算然后执行。若为零出口。若不为零再算,若不为零重复以上步骤,若为零则出循环。计数循环 例:用for循环计算表中元素之和 设表list是一

    28、简单结构,一个成分是值value,另一个成分是指向下一表元素的指针next。可以有以下六种写法:1 先赋sum初值进入正规for 循环:sum=0;sum+=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以外赋初值,增量在体

    29、内赋值:current=list,sum=0;for(;current!=NULL;)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+=current-va

    30、lue);/效率最高.但list不能为NULL表 6 逻辑混乱,也能正确计算:current=list,sum=0;for(;current=current-next;sum+=current-value)if(current=NULL)break;/最坏的风格,list也不能为NULL表3.4.2 异常处理异常处理 程序无法执行下去,也就是出现了异常(exception)情况。在早期语言的程序中,出现了这种情况就中断程序的执行,交由操作系统的运行程序处理。现在向用户开放,Ada,C+,Java 定义用户定义:exception;系统定义的异常(Ada):CONSTRAINT_ERROR 凡取

    31、值超出指定范围叫约束异常 NUMBER_ERROR 数值运算结果值实现已不能表达 叫数值异常 STORAGE_ERROR 动态存储分配不够时,叫存储异常 异常定义与处理段 TASKING_ERROR 任务通信期间发生的异常叫任务异常。PROGRAM_ERROR 除上四种而外程序中发生的一切异常,都叫程序异常.如子程序未确立就调用等。预定义的可以显式也可以隐式引发,而用户定义的异常必须 显式引发 引发语句:raise;引发语句可出现在任何可执行语句所在的地方。一旦引发,则本程序块挂起转而执行本块异常处理段中同名的异常处理程序。每个程序块都可以在该块末尾设立异常处理段:declare:;begin

    32、:;exception:when=-异常处理段 when。-一般再次引发原异常(缺省名字)end;Java的异常处理语句,try_catch_finally:try/可能有异常语句组 /用throw 显式抛出异常 /也可以隐式自动抛出异常 catch()/异常处理段-1 /catch(捕捉)try 中抛出的异常对象 /不匹配则跳过本catch 不执行 catch()/异常对象段-2 /匹配执行后跳过所有catch finally/善后处理段 /只要进入try块,本段必须执行 /C+无此机制,其余同 Ada的嵌套异常及异常传播的 with TEXT_IO,MATH_FUNCTIONS;use T

    33、EXT_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 exception when NUMBER_ERROR=raise;end ONE_CIRCLE;procedure CIRCLES is DIAMETER:Floa

    34、t;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 C

    35、IRCLE;3 3.5.5 函数和过程函数和过程 命令式语言中子程序有两种形式:函数(必须返回值)也叫函数,过程(实施一组动作)也叫子例程subroutine。它们是程序的第一次分割,这种分割的好处:实施的功能单一,便于调试;相对独立,便于多人分工完成,且时间不受约束;相对封闭,人们易于控制,是分解复杂性的有力措施。子程序和主程序联系的接口特别重要。在这个界面上要指出该例程的数据特征,即输入什么输出什么。而整个子程序体是完成从输入到输出的实现手段。界面指出“做什么?”,而子程序体回答“怎么做”。80年代程序完成第二次分割:将子程序定义(即界面)和子程序体显式的分开,成为相对独立的规格说明(Sp

    36、ecification)和体(body)。3.5.13.5.1 函数和过程抽象函数和过程抽象 函数抽象是用一个简单的名字抽象代表一个函数。函数由函数型构(Signature)和函数体(body)组成。函数计算的目的是求值。函数体等同于一个复合的表达式。函数抽象是对表达式的抽象 过程抽象是用一个简单的名字抽象代表一个计算过程。过程由过程型构和过程体组成。过程调用的目的是执行一组命令过程抽象是对命令(即语句)集的抽象 函数由函数型构和函数体组成。形式是:function FUNC(fp1,fp2,.):returntype;/函数型构 B;/函数体,可包括任何声明和语句 其中fp1,fp2,为形式

    37、参数,也叫形式变元(argument)returntype 为函数返回值的类型 函数引用是应用函数的唯一手段,它在同名的函数名之下给出实 在参数(实在变元):FUNC(ap1,ap2,.);各种语言函数定义(a)FORTRAN INTEGER FUNCTION FACT(N)/前缀指明返回类型 INTEGER N,I,F /参数类型在此声明 F=1 DO 10 I=2,N F=F*1 10 CONTINUE FACT =F /必须至少定义函数名一次 RETURN /至少有一返回语句 END(b)Pascal FUNCTION fact(n:Integer):Integer;/参数类型在变元表中

    38、定义,BEGIN /后缀指明返回类型 fact=1;IF n=1 OR n=0 THEN Return ELSE Fact=n*fact(n-1);/也要定义函数名 END(c)C int fact(n)/前缀指明返回类型 int n;/参数在体中声名类型 int i,f;/ANSI C改参数原型 f=1;if(n1)for(i=2;i /用函数定义值 if n=1 then 1 else n*fact(n-1)续 多重入口和指定返回FORTRAN 的多重入口示例 SUBROUTINE DEG(R,THETA,X,Y)C=3.14159/180.0 THETA=C*THETA ENTRY RA

    39、D(R,THETA,X,Y)X=R*COS(THETA)Y=R*SIN(THETA)RETURN END若THETA是度数值时,则调用语句为:CALL DEG(R,THETA,X,Y)/入口在子程序顶部若THETA是弧度值时,则:CALL RAD(R,THERA,X,Y)/入口在子程序中FORTRAN的指定返回SUBROUTINE RM(X,Y,*,*,*).RETURN2/返回语句标号80 .RETURN1/返回语句标号70 .RETURN3/返回语句标号120 .END CALL RM(A,B,70,80,120)形实参数表中元素个数,次序,类型应一致。早期语言都严格遵此准则。近代语言提供

    40、了较多的灵活表示法。Ada引入缺省参数,实参个数可少于形参个数;指明参数结合不考虑次序;Ada引入参数模式in,out,inout指明只读,只写,读写参数。C语言允许任意多个参数的调用。如内定义函数printf()调用时可以写任意个输出,只是第一参数中的格式个数与参数个数对应。过程定义与调用 过程子程序定义形式 procedure PROC(fp1,fp2,.)/过程型构 B;/子程序体包含局声明 对应的过程调用是:PROC(ap1,ap2,.);C语言一切过程,包括主程序都是函数过程。它以void(无值)关键字代替函数类型指明符,实施子程序过程语义 引用或调用的形式 无参过程-函数和过程的参

    41、数表均可为空。有的语言保留(),有的只有一个名字。一般无参过程也要更新过程内部的值。函数过程还会返回不同的值。全局量在函数中有效。改变了全局量两次调用结果值当然不一样。这就是函数的副作用(side effect)。-有副作用的函数 C 在很大程度上利用函数副作用,例如,当需要跳过空白时写:while(c=getch()=);-Ada中常用的随机数:function RANDOM return FLOAT range 0.01.0;引用时,若FIELD已声明为常量:RESULT=RANDOM*FIELD;RANDOM若无副作用RESULT值不可能改变。3.5.2 参数机制语言中第一类对象均可作函

    42、数/过程参数。由于变量的时空特性,传递的形-实参数可以有许多不同的实现结合的办法,即参数机制。传值调用(call-by-value)1实参表达式先求值2将值复制给对应的形参。形参和实参有同样大小的存储3过程运行后一般不再将改变了的形参值复制回实参 Pascal中的传值调用 PROCEDURE test1(J2,A2:Integer;P2:list)BEGINWriteln(J2,A2,P2.value);J2=J2+1;P2=P2.next;Writeln(J2,A2,P2.value)END.调用程序有:test1(J1,A1J1,P1.next);第一次打印为:1 30%第二次打印为:2

    43、30$堆 栈 帧中 的 调用 程 序 J1 A1 P1 1264530*$/%堆 栈 帧 中 的 过 程 t est1 2 J2 A2 P2 130指针 束定传值调用图示 传名调用(call-by-name)传名在过程/函数中加工的就是实参已分配的值,因此不需付出双倍存储代价。但传名过程的虚实结合是将程序体中所有形参出现的地方均以实参变元名置换。这样出现几次算几次效率是低的。传名调用程序示例由于Pascal无传名机制,此处作一点扩充:PROCEDURE test2(NAME J2,A2:Integer;NAME P2:List);函数体同test1执行同样调用:test2(J1,A1J1,P1

    44、.next);名结合后打印:1 30%执行后结果是:2 45$*$/%堆 杖 帧中 过 程 t e st2 就是 J2 就是 A2 就是 P2 J1P1。n extA1J1 传名调用图示堆 栈 帧中 的 调用 程 序 J1 2 A1 P1 1264530引用调用引用调用(call_by_reference)引用参数实现时,编译器在子程序堆栈中设许多中间指针,将形参名束定于此指针,而该指针的值是实参变量的地址(在主程序堆栈框架内),在子程序中每次对形参变量的存取都是自动地递引用到实参存储对象上。引用调用的Pascal示例:PROCEDURE test3(VAR J2,A2:Integer;VAR

    45、 P2:List);函数体同test1相应的调用程序是:test3(J1,A1J1,P1.next);第一次打印是:1 30%第二次打印是:2 30$引用调用图示堆 栈 帧中 的 调用 程 序 2 J1 A1 P1 11264530*$/%堆 栈 帧 中 的 过 程 t est1 J2 A2 P2 参数模式与返回调用(call-by-return)显式指明参数传递模式,可以为编译实现提供信息 fun_name(x,y:Real;VAR s,q:Integer).x,y传值实现,它只读。s,q引用实现,可读/写Ada只规定参数模式in,out,inout,传递方向的模式(mode)。由编译选择实

    46、现方式:proc_name(X,Y:in Real;S:inout Integer;Q:outInteger)in模式可不写出(缺省)。函数只能有in的模式,过程都有,且出现次序不受限制。x,y因在子程序中只读,传值实现可保证不受破坏。s读/写用引用实现,而q是只写参数,传值和引用都不能保证”只”写实现返回调用机制有两种办法:其一是复制。另一种办法是引用实现增加”只写”保护 值-返回调用(call-by-value-and-return)是对by-reference的改进,因多进程竞争数据资源时多重引用(束定)易于引起混乱P2返回值由P2定 返回值由P1定 正常顺序执行对于并发多任务宜只读只写

    47、 值与返回调用机制是把值调用和返回调用组合起来,实现调用程序双向通道,这对于有多个存储器的多处理器系统和网络分布式系统值调用极度安全在子程序执行期间因不是束定,形参变量的值不会中途改变,复制回去和拷贝进来处可设断点检查P1P2P1P2P1P2 指针参数(call_by_point)指针作为参数其实现方式一般是复制机制,它复制的是地址(指针内容)注意和引用调用之同异例:指针Pascal引用版:交换两变量的内容PROCEDURE swap1(VAR a,b:Integer);VAR t:Integer;BEGIN T=a;a=b;b=tEND;调用程序片断:j=3;k=5;swap1(j,k);/

    48、结果j=5,k=3J=3K=5Caller-frame=a=t=b3=Swapl-frame指针版:变换两变量的内容 TYPE int_ptr=Integer;VAR jp,kp:int_ptr;PROCEDURE swap2(a,b:int_ptr);VAR t:Integer;BEGIN t=a;a=b;b=t END;相应调用程序片断:NEW(jp);jp=3;NEW(kp);kp=5;Swap2(jp,kp);主 调程 序 堆 栈 帧 jp kp 堆 栈 帧 中 的 S WAP2 a b t 3 指针调用图示 动 态 堆 35C语言的指针参数传递 void swap3(int*a,in

    49、t*b)int t;t=*a;*a=*b;*b=t;形参是两指针,实参不用指针的版本:main()int j=3;k=5;/声明并初始化两整数 swap3(&j,&k);/类型匹配吗?主 调 程 序 堆 栈 框 架 j k 5堆 栈 框 架 中 的 SW AP3 a b 3 t C语言的指针-引用调用3.63.6 抽象与封装抽象与封装 函数和过程是封装的程序实体,它有数据和操作,规格说明(型构)和过程体,一体使于人们控制复杂性 Pascal统一的嵌套结构不造于大型程序main代 码Sub2数 据 代 码Sub1数 据 代 码main数据main数据mainSub110Sub1115Sub162

    50、1Sub22284321小程序结构小程序结构大程序结构大程序结构数据2sub1-sub10数据4sub22-sub28数据1sub11-sub15数据3sub16-sub21main续 将相关的数据和操作封装成大模块(若干类型,若干过程/函数)结构上形成包package或模块 Modula包是可分别编译。随时连接软件资源,是解决复杂系统的有力手段包的规格说明和包体显式分开。语义上正好是“作什麽”,“怎麽做”数据对象和类型子程序规格(操作)(操作)私有数据子程序体子程序体子程序体私有操作程序包体规格说明外界可见3.6.1 模块和包 规格说明和体在表示结构上的分离。有利于修改,维护 封装实现数据隐

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第三章-过程式程序的设计语言-课件.ppt
    链接地址:https://www.163wenku.com/p-4146851.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库