北航研究生课程程序语言设计原理教程第06章.ppt
《北航研究生课程程序语言设计原理教程第06章.ppt》由会员分享,可在线阅读,更多相关《北航研究生课程程序语言设计原理教程第06章.ppt(23页珍藏版)》请在三一办公上搜索。
1、第6章 函数和过程,命令式语言中子程序有两种形式:函数(必须返回值)也叫函数,过程(实施一组动作)也叫子例程subroutine。它们是程序的第一次分割,这种分割的好处:实施的功能单一,便于调试;相对独立,便于多人分工完成,且时间不受约束;相对封闭,人们易于控制,是分解复杂性的有力措施。子程序和主程序联系的接口特别重要。在这个界面上要指出该例程的数据特征,即输入什么输出什么。而整个子程序体是完成从输入到输出的实现手段。界面指出“做什么?”,而子程序体回答“怎么做”。80年代程序完成第二次分割:将子程序定义(即界面)和子程序体显式的分开,成为相对独立的规格说明(Specification)和体(
2、body)。,6.1 函数和过程抽象,函数抽象是用一个简单的名字抽象代表一个函数。函数由函数型构(Signature)和函数体(body)组成。函数计算的目的是求值。函数体等同于一个复合的表达式。函数抽象是对表达式的抽象过程抽象是用一个简单的名字抽象代表一个计算过程。过程由过程型构和过程体组成。过程调用的目的是执行一组命令过程抽象是对命令(即语句)集的抽象函数由函数型构和函数体组成。形式是:,function FUNC(fp1,fp2,.):returntype;/函数型构 B;/函数体,可包括任何声明和语句 其中fp1,fp2,为形式参数,也叫形式变元(argument)returntype
3、 为函数返回值的类型 函数引用是应用函数的唯一手段,它在同名的函数名之下给出实 在参数(实在变元):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;/参数类型在变元表中定义,BEGIN/后缀指明返回类型 fact=1;IF n=1
4、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 RAD(R,THETA,X,Y)X=R*COS(THETA)Y=R
5、*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),形实参数表中元素个数,次序,类型应一致。早期语言都严格遵此准则。近代语言提供了较多的灵活表示法。Ada引入缺省参数,实参个数可少于形参个数;
6、指明参数结合不考虑次序;Ada引入参数模式in,out,inout指明只读,只写,读写参数。C语言允许任意多个参数的调用。如内定义函数printf()调用时可以写任意个输出,只是第一参数中的格式个数与参数个数对应。过程定义与调用 过程子程序定义形式 procedure PROC(fp1,fp2,.)/过程型构 B;/子程序体包含局声明 对应的过程调用是:PROC(ap1,ap2,.);C语言一切过程,包括主程序都是函数过程。它以void(无值)关键字代替函数类型指明符,实施子程序过程语义,引用或调用的形式,无参过程,-函数和过程的参数表均可为空。有的语言保留(),有的只有一个名字。一般无参过程
7、也要更新过程内部的值。函数过程还会返回不同的值。全局量在函数中有效。改变了全局量两次调用结果值当然不一样。这就是函数的副作用(side effect)。-有副作用的函数 C 在很大程度上利用函数副作用,例如,当需要跳过空白时写:while(c=getch()=);-Ada中常用的随机数:function RANDOM return FLOAT range 0.01.0;引用时,若FIELD已声明为常量:RESULT=RANDOM*FIELD;RANDOM若无副作用RESULT值不可能改变。,6.2 参数机制,语言中第一类对象均可作函数/过程参数。由于变量的时空特性,传递的形-实参数可以有许多不
8、同的实现结合的办法,即参数机制。,6.2.1 传值调用(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 30$,6.2.2 传名调用(call-by
9、-name),传名在过程/函数中加工的就是实参已分配的值,因此不需付出双倍存储代价。但传名过程的虚实结合是将程序体中所有形参出现的地方均以实参变元名置换。这样出现几次算几次效率是低的。传名调用程序示例由于Pascal无传名机制,此处作一点扩充:PROCEDURE test2(NAME J2,A2:Integer;NAME P2:List);函数体同test1执行同样调用:test2(J1,A1J1,P1.next);,名结合后打印:1 30%执行后结果是:2 45$,6.2.3 引用调用(call_by_reference),引用参数实现时,编译器在子程序堆栈中设许多中间指针,将形参名束定于此
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 研究生课程 程序语言 设计 原理 教程 06
链接地址:https://www.31ppt.com/p-5936193.html