《函数和过程子程序》由会员分享,可在线阅读,更多相关《函数和过程子程序(5页珍藏版)》请在金锄头文库上搜索。
1、函数和过程子程序1.一个较复杂的问题,能够细化分解为一些相对较小的子问题,能够将每一个子问题使用一段相对独立的小程序来解决; 2.一些具有相同或功能相似的程序段在程序中的不同位置反复出现,能够将这样的程序段做成一个整体,用一个标识符给它起一个名字,凡是需要这个程序段的地方只要简单地引用其标识符即可。 3.子程序包括过程和函数两种形式。 一、函数 1.标准函数 :由Pascal定义的函数。如我们熟悉的ord,chr等,程序员编程时直接引用就行了。 2.自定义函数:由程序员在程序中定义后再使用。 如果一个子程序执行后能够返回其结果,那么它就能够用于表达式中,称这种子程序为函数,这种语句序列的定义称
2、为函数说明。函数说明形式如下:function 函数名(形式参数表):函数类型; -函数首部 说明部分; begin 语句1; 语句2; 语句n End3、函数的调用: 函数返回一个函数值,过程则能完成一系列各种操作。函数在语法上相当于一个表达式,所以,调用时,函数不能独立成为一个语句;它能够出现在任何表达式能够出现的地方。而过程调用是一句独立的语句。 例如赋值语句的右边: X:=函数名(实在参数表); X的类型与函数类型必须一致 又,如果函数类型是boolean,则还能够出现在条件语句中,充当条件表达式: if 函数名(实在参数表) then 除函数首部和过程首部的句法略有差别外,函数体和过
3、程体完全相同。函数体中至少要有一条语句对函数名赋值。如函数abs 中有语句“abs:=z”。函数的每次求值至少要执行这样的一条语句,为此次计算求得一个值。返回时就把这个值带调用的地方。二、过程 1.标准过程:由Pascal定义的过程。如我们熟悉的read,write等,程序员编程时直接引用就行了。 2.自定义过程:由程序员在程序中定义后再使用。给某个语句序列组成的子程序赋于一个适当的名字。程序中凡是需要出现这个语句序列的地方,能够简单的写上子程序的名字。这种完成一个操作的子程序称为过程;子程序的定义称为过程说明。过程说明由过程首部和过程体组成,其形式如下:procedure 过程名(形式参数表
4、); -过程首部 说明部分; begin 执行语句; end;例 输出两个数中最大值的过程 procedure largest(a,b:integer);3、过程的调用:过程在语法上相当于一个语句,所以,调用时,直接写下就行: 过程名(实在参数表);三、形参和实参 子程序调用(过程调用或函数调用)的执行顺序分为以下几步: 实参和形参结合执行子程序返回调用处继续执行 子程序说明的形式参数表对子程序体直接引用的变量实行说明,详细指明这些参数的类别、数据类型要求和参数的个数。子程序被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求Pascal子程序三类形
5、参: 1.值参数形式参数表中前面没有var,后有类型的参数。仅为过程和函数的执行提供初值而不影响调用时实际参数的值。在调用过程或应用函数时,值参数所对应的实际参数必须是表达式,而且它的值不能使文件类型或包括文件类型的值。 2.变量参数 形式参数表中前面有var后由类型的参数。如果需要子程序向调用程序返回值时,应采用变量参数。变量参数要求它的实参是和它同一类型的变量。因为在子程序执行时,遇到对相对应形参的引用式定值,就是对相对应实参的引用式定值,即对形参的任何操作就是对实参本身的操作。Procedure show(Var a:integer); 形式参数A是 对应的实参必须是变量 变参与实参的关
6、系是传地址 变参可作输入参数,有出口值表示过程的返回值如: procedure show(a:integer); 形式参数A是 对应的实参能够是表达式 值参与实参的关系是传值 值参仅作输入参数,无出口值例:下列程序的运行结果如何: program ex; var i,j:integer; procedure sample(x:integer;var y:integer); X为值参 Y为变参 begin x:=x+2;y:=y+2; end; begin i:=0; j:=0; sample(i,j); i:=i+3;j:=j+5; writeln(i,j); readln; end.再思考:
7、若把上面的过程首部改为:Procedure show(var a:integer);其输出结果还一样吗?为什么?program ex2;var a,b:integer;procedure swap(Var x,y:integer)var t:integer;begint:=x;x:=y;y:=t;end;begina:=1;b:=2;writeln(a:3,b:3);swap(a,b);writeln(a:3,b:3);end.例3 写出下列两个程序的运行结果。3.无类型变量参数 形式参数表中前面有var而后面没有类型的参数。形参是无类型变量,对应的实参允许为任意类型的变量,但要在子程序中设置
8、的强制类型转换(类型名(无类型变量参数名),将无类型变量参数改变为相应类型。四、全局变量和局部变量的作用域 全局变量是指主程序中说明的变量;局部变量是指过程或函数内说明的变量。 1. 全局变量和它的作用域 全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况:(1)在全局变量和局部变量不同名时,其作用域是整个程序。 (2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。 2.局部变量和它的作用域 凡是在子程序内部使用的变量,必须在子程序中加入说明。这种在子程序内部说明的变量称为局部变量。局部变量的作用域是其所在的子程序。形式参数也只能在子程序中有效。因
9、此也属于局部变量。局部变量的作用域分为两种情况: (1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过程。 (2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域不包含此过程。过程与函数的不同之处 过程和函数虽然在形式上类似,但是它们二者在定义和使用上又有不同之处,总结起来有以下4点 1.函数以FUNCTION开头,而过程以PROCEDURE开头。 2.函数是通过函数名返回函数值,在函数形式参数表后面要说明函数(即返回值)的类型。而过程的结果由参数送回,它可以包括多个结果或无结果(即只是一个动作)。在过程的形式参数表后面无过程类型说明 3.函数体中至少要包括一个给函数名赋值的语句。而过程不能给过程名赋值,因此过程体可以为空。4.函数的调用出现在表达式中,而过程的调用必须作为一个单独的语句。