深入理解函数和过程的精髓

技术与开发

学习内容:Pascal语言

学习进度:第七课

上手难度:★★★★

考试类型:二级Delphi

函数和过程是实现结构化程序设计思想的重要手段,是用来实现特定功能的语句块,也是考试的重点和难点,考生必须明白函数与过程的相似点与不同点,在笔试的读程序题目中,要能读懂函数和过程的实际执行情况,理解程序的参数传递并能正确计算出程序的运行结果。

一、如何用好函数

1.函数怎么定义

Pascal语言有两种子程序:函数和过程。函数的主要特点是在函数执行后可以方便地返回所需值,定义函数的格式如下:

function 函数名(形式参数表):返回值类型;

var//局部变量声明;

begin

语句1;语句2;……//函数体

end;

函数的定义分为三个部分:函数首部、变量声明和函数体。函数首部是函数调用程序和函数内部的接口,其中函数名指明了函数的名称,形式参数列表说明了调用函数时使用到的变量及其类型;var部分的变量声明是函数用到的内部变量的声明,在局部声明部分声明的常量、变量、类型只能在函数内部使用;函数体是一个程序段,由begin开始,以end结束,end后面必须跟一个分号。

2.理解函数的传递参数

在考题中,考生最头疼的应该就是函数在调用过程中传递参数的几种方式了,这是函数的难点,考生务必要掌握,下面我们一起来分析函数调用时传递参数的几种方式。

第一种:值传递。值传递是缺省的参数传递方式,即将值参的拷贝压入栈中,函数使用、操纵的是栈中的拷贝值,不是原始值。

第二种:地址传递。当通过地址传递时,没有按正常方式把参数值的拷贝压栈,而是直接引用参数原始值,函数中的代码也同样访问原始值,这样就能在函数中改变参数的值。地址传递用关键字var 标志。需要注意的是实参一般不能是常量!

第三种:常量参数传递,使用关键字const标志。const的作用与值传递方式相似,但是有更严格的限制,即在函数体内不允许对该参数赋值,也不能将它作为按地址传递的实参传递给另一个函数。使用const修饰语可以使编译器对结构体(structured)或字符串类型的参数进行优化,同时也能够安全地预防不小心将参数以地址传递方式传递给其他函数的错误发生。

小知识:三种参数传递的区别

值传递时,实参j的值传递给函数benben的形参x后,不论x的值是否变化,j的值将保持不变;地址传递时,实参j的地址传递给函数benben的形参x后,x的值将改变实参j的值;而常量参数传递时,在函数体benben中不允许改变形参x的值。

二、过程的定义和使用

1.过程如何声明和定义

给某个语句序列组成的子程序赋予一个适当的名字,程序中凡是需要出现这个语句序列的地方,可以简单地写上子程序的名字,这种完成一个操作的子程序称为过程。过程的声明和函数的声明一般都在type区,如procedure douya(i:integer);过程声明之后应当在implementation后面定义这个过程。定义过程的一般形式如下:

procedure 过程名(形式参数表);

var//变量声明;

begin

语句1;语句2;……//过程体

end;

过程的定义包含三个部分:过程首部、变量声明和过程体,其中procedure、var、begin、end为关键字。除了返回值以外的其他内容,过程和函数的定义基本相同。过程调用的格式是:<过程名称> (<参数列表>)。和函数调用一样,参数列表中的各个参数必须用逗号分隔开来,并且应该和过程声明中的变量声明一一对应。

2.过程的学习重点

考试中针对过程的重点还是在参数列表中,特别是把一个数组作为参数进行传递,考生需要认真研究。用数组名作为过程参数时应注意以下几点:第一,应分别在主调过程和被调过程中定义数组。第二,形参数组和实参数组的类型必须一致,否则将引起错误。第三,形参数组和实参数组的长度可以不相同,考生需要注意当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符。第四,用数组名作为过程实际参数时,不是把数组元素的值传递给形式参数数组,而是把实参数组的起始地址传递给形参数组。第五,数组作为参数不但可以在过程中调用,也可以在函数中调用。

小提示:如果不需要把整个数组的所有元素作为参数传递,仅需要传递其中一部分,可以使用Slice 函数。

读者反馈

读者 冷军:循环结构的中断语句除了break、continue、exit之外,还有没有其他的语句呢?

小新解答:还有一个goto语句,goto语句可以将程序的执行转移到某个特定标号标志的语句,在Object Pascal中使用goto语句的形式为:goto 标号,比如goto 100;//数字作为标号,或者goto lable1;//标志符作为标号。