《Delphi程序设计教程第2版教学课件作者刘瑞新第5章节过程与函数课件》由会员分享,可在线阅读,更多相关《Delphi程序设计教程第2版教学课件作者刘瑞新第5章节过程与函数课件(35页珍藏版)》请在金锄头文库上搜索。
1、第5章 过程与函数,根据是否有返回值,Delphi的子程序分为过程(Procedure)和函数(Function)两种形式。 过程与函数实现一定功能的语句块,可以在程序的其他地方被调用,也可以进行递归调用。过程与函数的区别是:过程没有返回值,而函数又返回值。,第五章:过程与函数,本章主要内容如下: 5.1 过程 5.2 函数 5.3 向子程序传递参数 5.4 子程序的嵌套与递归 5.5 变量的作用域 5.6 Delphi的程序结构,5.1 过程,过程分为标准过程与自定义过程两种。标准过程是指系统内部定义的过程,无需编写代码,即可直接调用。 自定义过程则由用户自行编写代码以完成指定的操作,包括事
2、件过程与通用过程两类。,5.1.1 事件过程的创建与调用,1. 事件过程的创建 1)、在对象观察器(Object Inspector)中选择指定对象(控件),然后在事件(Events)选项卡中选择指定的事件名称,并用鼠标双击其右边的空白区域,Delphi将自动产生一个默认的事件过程。 2)、可以手动添加事件过程。在事件选项卡中天家,在单元文件中编程。,5.1.1 事件过程的创建与调用,一个事件过程也可以被多个对象、多个事件共享。其方法是:首先为其中的一个对象事件建立事件过程,然后在创建其他对象的事件过程时,从事件名称右边的下拉列表中选择已经建立的事件过程名即可。 【例5-1】在一个窗口中包含3
3、个按钮,当用户单击其中一个时,要求其他个别按钮不能使用,如程序所示。,2. 事件过程的调用 可以在过程代码中调用已经创建的事件过程。如在例6-1中,为按钮Button3创建独立的OnClick事件过程来调用已经存在的Button1Click事件过程:,5.1.1 事件过程的创建与调用,5.1.2 通用过程的语法格式,过程的定义包括过程原型、过程题的定义 Procedure 过程名(形参表) 局部声明 begin 语句列; end;,5.1.2 通用过程的语法格式,形参说明的格式为: Var | Const形参名:类型 其中保留字Var表示实参(变量)按传址方式传递到形参,形参在过程中所作的改变
4、,退出过程后将影响实参的值,因此又称为变参。保留字Const表示该形参在过程中的值被当作常量而不能改变。,5.1.2 通用过程的语法格式,过程体是一个程序段,由局部声明部分与可执行部分组 5.1.3 通用过程的创建与调用 例5-2、在例5-1中建立一个通用过程来处理3个按钮的单击事件。 如程序所示,5.2 函数,函数是子程序的另一种形式,当子程序的执行返回一个值时,使用函数就比较简单。Delphi提供了许多内部函数,如Sqrt、Cos或Format。用户在编写程序时,只需写出函数名并给定参数就能得到函数值。当在程序中需要多次用到某一公式或要处理某一函数关系,而又没有现成的内部函数可以使用时,D
5、elphi允许编写用户自定义的函数。,5.2.1 函数的语法格式,Function 函数名(形参表) :返回类型; 局部声明 begin 语句列; end;,5.2.1 函数的语法格式,1. 函数首部类型。函数的返回值通过函数名或预定义的Result(隐含变量)带回。 2. 函数体 函数体与过程体相仿,也是一个程序段,由局部声明部分与可执行部分组成 【例5-5】已知直角三角形两直角边,计算第三边(斜边)的函数: 如程序所示,5.2.2 函数的创建与调用,在“代码”编辑窗口中,把光标定位在已有过程或函数的前面,即可输入函数的声明。 【例5-6】求3到10的阶乘之和(如图5-6所示)。 如程序所示
6、,5.3 向子程序传递参数,调用子程序的目的,就是在一定的条件下完成某一工作或计算某一函数值。外界要把条件告诉子程序,或者反过来,子程序要把某些结果报告给外界,这就是子程序与外界的通讯。,5.3.1 形式参数与实际参数,形式参数是指在定义过程或函数时,出现在过程或函数首部中的变量名,表示用于接收数据的变量。 实际参数是指在调用过程或函数时,传送给过程或函数的常量、变量或表达式。,5.3.1 形式参数与实际参数,实参表和形参表中对应的变量名不必相同,但是变量的个数必须相等,而且各实际参数的书写顺序必须与相应形式参数的类型相符。所谓类型相符,对于变量参数就是类型相同;对于值参数则要求实际参数对形式
7、参数赋值相容。,5.3.2 参数传递方式,按照参数传递方式的不同,Delphi中函数或过程的参数可分为变量参数、常量参数、值参数和外部(out)参数。 1. 变量参数 变量参数的传递方式为“按地址传递”,即将实参变量的地址传递给形参,这样形参与实参表示同一个存储单元。如果在过程或函数中改变形参变量的值,将同时影响实参变量的值。,5.3.1 形式参数与实际参数,2. 常量参数 在过程或函数首部形参表中的参数前面如果使用保留字Const,则表示该参数为常量参数。 无论实参是否变量,常量参数在过程中总是被当作常量,其值不能被改变。,5.3.2 参数传递方式,3. 值参数 在过程或函数首部形参表中的参
8、数前面如果没有保留字,系统缺省该参数为值参数。 值参数的传递方式为“按值传递”,即将实参的值传递给形参,如果在过程或函数中改变形参变量的值,则所作变动不会影响实参变量。,5.3.2 参数传递方式,4. 外部参数 在过程或函数首部形参表中的参数前面如果使用保留字out,则表示该参数为外部参数。,5.3.3 使用缺省参数,在声明过程或函数时,可以给形参指定一个缺省值,指定缺省值的方法是:在形参的类型后面使用“=”,并给出一个具体的值(常量)。如: Procedure MyProcedure(x : Real , y : Real = 10) ; begin end;,5.3.4 函数与过程的重载,
9、在Delphi中,允许有名字相同而参数不同的过程或函数,这就是过程和函数的重载(Overload)。 注意:在定义有默认参数的重载函数和过程时,必须让系统能从参数中区分出应该调用哪一个函数或过程,否则该定义是非法的。,5.4 子程序的嵌套与递归,在一个子程序(过程或函数)中包含另外一个子程序(过程或函数),称为子程序的嵌套。 递归调用在处理阶乘运算、级数运算、幂指数运算等方面特别有效。在间接递归调用中,子程序必须进行超前引用,即在子程序的首部后面加上保留字forword。,5.4.1 子程序的嵌套,1. 嵌套层次 在Delphi中,程序具有一定的层次结构。允许子程序的内部再定义新的子程序,即子
10、程序可以嵌套定义。为了准确地表达嵌套层次,通常将嵌套从外向内进行编号,并把相应子程序的层号称为子程序的嵌套深度。,5.4.2 子程序的递归,递归函数论是现代数学的一个重要分支,数学上常常采用递归的办法来定义一些概念,例如,自然数n的阶乘可以递归定义为: 【例5-11】契比雪夫多项式定义如下:,5.5 变量的作用域,作用域是指一个过程、函数和变量能被编译器识别的范围。,5.5.1 公有变量与私有变量,在单元的接口部分声明的变量属于公有变量,可以被其他单元引用。单元的接口interface决定了本单元对其他任何单元或程序的可见部分,在interface中的声明对要使用这些声明的单元或应用程序是可见
11、的。一个单元在需要引用其他单元的变量时,只要在uses语句中指明该单元即可。 在单元的实现(implementation)部分声明的变量属于私有变量,不能被其他单元引用。,5.5.2 全程变量与局部变量,在单元中的过程或函数中声明的变量,其有效范围仅限于该子程序本身,属于局部变量。而在子程序之前,implementation之后声明的变量可以为本单元中的所有子程序(过程或函数)引用,因此又属于全程变量。在interface中声明的公有变量也属于全程变量。 全程变量的作用域是整个程序 。而局部变量的作用域是定义它的子程序。,5.5.3 全程变量的声明,下面介绍implementation之后声明
12、全程变量的方法。 (1) 按F12键切换到代码编辑器窗口。将光标移到implementation的下一行,$R *.DFM的上一行。 (2) 输入如下变量声明的代码: var n, m : integer; 即可声明在本单元使用的整数类型的全程变量n,m。,5.6 Delphi的程序结构,一个Delphi应用程序对应一个工程,从程序结构的角度来看,它由一个主程序与若干个单元组成,而程序段则是构成主程序和单元的基本结构要素。,5.6 Delphi的程序结构,Delphi工程文件中的代码即为Delphi应用程序的主程序。主程序的结构为: program 工程文件名; uses语句 $R *.RES
13、 执行部分,5.6.2 单元与作用域,Delphi编程强调单元或模块的使用。在引入类之前,单元是模块化编程的基础,而类也是建立在单元概念基础上的。在Delphi 6的应用程序中,单元文件可以用来定义一个窗体,也可以用来定义程序中所使用的子程序、全程变量和常量等。,5.6.2 单元与作用域,1. 单元的结构 单元文件的结构如下所示: unit 单元名 / 单元首部 interface / 接口部分 implementation / 实现部分 end. / 单元结束,5.6.2 单元与作用域,2. 作用域 在单元的接口部分声明的标识符(类型、常量、变量、函数和过程等)在整个单元内(自声明处起至单元结束)有效。其他单元(客户单元)引用该单元时,则在客户单元内有效。 在实现部分隐含声明的标识符,不能在单元外使用,即它们在客户单元中不可见。这些标识符在本单元的实现部分自声明处起至实现部分结束的任何程序段中有效。,5.6.3 程序段与作用域,一个程序段是由声明部分和语句部分构成的结构,其一般结构为: 声明部分 begin 语句 end,