pascal 第6讲 过程和函数.ppt
《pascal 第6讲 过程和函数.ppt》由会员分享,可在线阅读,更多相关《pascal 第6讲 过程和函数.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、过 程 和 函 数过程一、过程的定义一、过程的定义Pascal的过程定义由过程首部与过程体组成,其形式:的过程定义由过程首部与过程体组成,其形式:Procedure过程名过程名(形式参数表形式参数表);说明部分说明部分;BEGIN过程体过程体(语句块语句块)END;1.过程首部过程首部(1)过程首部以关键词)过程首部以关键词Procedure开头。开头。(2)过程名与函数名的使用规则相同,但要注意过程名不)过程名与函数名的使用规则相同,但要注意过程名不能和同一程序中的变量、数组、函数同名。同时过程名不能能和同一程序中的变量、数组、函数同名。同时过程名不能代表任何数据,因此不必说明类型。代表任何
2、数据,因此不必说明类型。(3)参数表中为过程的形式参数,用逗号分隔。过程和函)参数表中为过程的形式参数,用逗号分隔。过程和函数一样也可以不带形参,此时,只是在主程序调用它时,数一样也可以不带形参,此时,只是在主程序调用它时,执行指定的操作。执行指定的操作。(4)形式参数的使用主要有值形参与变量形参。)形式参数的使用主要有值形参与变量形参。如下例:如下例:ProcedureFAC(A,B:real;C:integer;varx,y:reaL);其中:其中:A,B,C称为值形参,它们与在函数中介绍的形参相称为值形参,它们与在函数中介绍的形参相同;同;X,Y称为变量形参,在它们的前面冠有保留字称为变
3、量形参,在它们的前面冠有保留字Var;关于形式参数的有关内容将在后面介绍。关于形式参数的有关内容将在后面介绍。2过程体:过程体:过程体与函数体相同,也包括说明和执行这两个部分。过程体与函数体相同,也包括说明和执行这两个部分。(1)在过程体内使用的有关常量、变量等必须在过程体的说)在过程体内使用的有关常量、变量等必须在过程体的说明部分内加以说明或定义。明部分内加以说明或定义。(2)在过程体说明的有关量,只有在过程体执行期间有效,)在过程体说明的有关量,只有在过程体执行期间有效,当退出过程体后,为这些量分配的存储单元被释放。当退出过程体后,为这些量分配的存储单元被释放。(3)过程体的执行部分不能给
4、过程名赋值,因为过程名不能)过程体的执行部分不能给过程名赋值,因为过程名不能代表任何数据。代表任何数据。二、过程的调用二、过程的调用主程序是通过一条独立的过程调用语句来调用过程的。主程序是通过一条独立的过程调用语句来调用过程的。调用过程必须给出一个过程名,并用实在参数代替形式参数,调用过程必须给出一个过程名,并用实在参数代替形式参数,一般形式是:一般形式是:过程名过程名(实在参数表实在参数表);对于过程的调用要注意以下几点:对于过程的调用要注意以下几点:(1)调用的过程必须在调用之前进行说明,也就是说必须)调用的过程必须在调用之前进行说明,也就是说必须先说明后调用。先说明后调用。(2)调用过程
5、时,通常是通过值形参给过程提供原始数据,)调用过程时,通常是通过值形参给过程提供原始数据,通过变量形参将值带回调用程序。因此我们可以这样来理通过变量形参将值带回调用程序。因此我们可以这样来理解:值形参是过程的输入参数,变量形参是过程的输出参解:值形参是过程的输入参数,变量形参是过程的输出参数。数。(3)仅当在主程序中调用过程时,过程中的语句块才被执)仅当在主程序中调用过程时,过程中的语句块才被执行,调用完毕自动返回主程序的调用点,使主程序继续往行,调用完毕自动返回主程序的调用点,使主程序继续往下执行。因此,过程中的过程定义仅起一个说明作用。下执行。因此,过程中的过程定义仅起一个说明作用。例如,
6、执行下面程序:例如,执行下面程序:(1)constx=100;(2)Proceduresub(x:integer);BeginX:=x+200;Write(subx=,x);End;(3)beginWrite(x=,x);End.执行结果是:执行结果是:x=100为了说明问题,在程序的前面附加了为了说明问题,在程序的前面附加了(1)(2)(3)的标号。从程的标号。从程序的标号来看,虽然程序第序的标号来看,虽然程序第(1)标号语句的下一语句的标号是标号语句的下一语句的标号是(2),也就是过程,也就是过程sub的入口点。然而,由于执行该程序时并的入口点。然而,由于执行该程序时并没有调用没有调用su
7、b过程,因此执行完第过程,因此执行完第(1)语句后,程序并不会自语句后,程序并不会自动进入从第动进入从第(2)语句开始的该过程,因而打印出来的结果是语句开始的该过程,因而打印出来的结果是x=100。过程应用举例过程应用举例例例1:编写程序,求:编写程序,求:S=2!+4!+6!+8!+10!测试数据:测试数据:输入:无输入:无输出:输出:3669866分析:此题不用过程也很好求分析:此题不用过程也很好求S,但经仔细研究可发现:,但经仔细研究可发现:用一个过程去完成每次求阶乘的计算,避免了同一功能用一个过程去完成每次求阶乘的计算,避免了同一功能程序的重复,使程序更为简洁,也更加容易阅读。程序的重
8、复,使程序更为简洁,也更加容易阅读。程序如下:程序如下:programaa;vari:integer;b,s:longint;procedurenjs(x:integer;vart:longint);varj:integer;begint:=1;forj:=1toxdot:=t*j;end;begins:=0;fori:=2to10doifnotodd(i)thenbeginnjs(i,b);s:=s+b;end;writeln(s);end.1.判断程序运行结果,不准用计算判断程序运行结果,不准用计算机算,只能用笔算。机算,只能用笔算。programg1;vars,a,b:longint;p
9、rocedureadd(x,y:longint;varsum:longint);vari:integer;beginsum:=0;fori:=xtoydobeginsum:=sum+i;end;end;begins:=0;read(a,b);add(a,b,s);writeln(s);end.输入输入:910输出输出:练习一2.判断程序运行结果,不准用计算机算,只能用笔算。判断程序运行结果,不准用计算机算,只能用笔算。programg2;vark:real;procedurep(x:real;vary:real);varz:real;beginz:=x*x+3;y:=y+z;end;begin
10、k:=1.0;p(2.0,k);writeln(k:0:2);end.输出输出:3.判断程序运行结果,不准用计算机算,只能用笔算。判断程序运行结果,不准用计算机算,只能用笔算。programg3;vara,b,c:integer;procedurepro;varc:integer;begina:=1;b:=2;c:=3;end;begina:=100;b:=200;c:=300;pro;writeln(a:5,b:5,c:5);end.输出输出:4.(文件名:(文件名:g4.pas)将求一个数阶乘的方法设)将求一个数阶乘的方法设计为一个过程,利用这个过程,求输入的任意的计为一个过程,利用这个过
11、程,求输入的任意的两个数的阶乘和。(两个数的阶乘和。(N,M8)测试数据:测试数据:输入:一行,两个数之间隔一空格输入:一行,两个数之间隔一空格35输出:一行,两个的阶乘和。输出:一行,两个的阶乘和。126例例2:学校举行晚会,要:学校举行晚会,要M个学生中选个学生中选N个学生到舞台个学生到舞台上表演一个游戏,问有多少种选择方法。这是数学中上表演一个游戏,问有多少种选择方法。这是数学中的组合运算,的组合运算,可用下列公式计算可用下列公式计算,其中,其中M,N由键由键盘输入。盘输入。分析:从上述公式我们发现,它有三个完全相同的计分析:从上述公式我们发现,它有三个完全相同的计算阶乘的运算。若我们把
12、计算阶乘的程序拿出来,作算阶乘的运算。若我们把计算阶乘的程序拿出来,作为一独立的过程,那么计算这道题目的程序结构就变为一独立的过程,那么计算这道题目的程序结构就变得非常简单了。得非常简单了。程序如下:程序如下:programaa;varL,m,n:integer;a,b,c:real;x:longint;procedurefac(k:integer);vari:integer;f:longint;beginf:=1;fori:=1tokdof:=f*i;x:=f;end;测试数据:测试数据:输入:输入:m,n=107输出:输出:120beginwrite(m,n=);read(m,n);ifm
13、=nthenL:=1elseL:=m-n;fac(m);a:=x;fac(n);b:=x;fac(L);c:=x;c:=a/(b*c);writeln(c:0:0)end.例例3:利用自定义过程求任意两个整数的乘积:利用自定义过程求任意两个整数的乘积(将求两个将求两个整数乘积的程序段设为一个过程整数乘积的程序段设为一个过程).programlkj;vara,b,c:longint;proceduresum(a,b:longint;varc:longint);beginc:=a*b;end;beginreadln(a,b);sum(a,b,c);writeln(c);end.测试数据:测试数据:
14、输入输入:510输出输出:50可以看出,可以看出,Pascal的过程函数相似,都需要先定义后的过程函数相似,都需要先定义后调用,但有以下几个主要差别:调用,但有以下几个主要差别:(1)函数通常被设计成求一个函数值;而过程通常被)函数通常被设计成求一个函数值;而过程通常被设计成能得到若干个运算结果,也可以用来完成一系设计成能得到若干个运算结果,也可以用来完成一系列的数据处理或与计算无关的各种操作。列的数据处理或与计算无关的各种操作。(2)调用方式不同。函数的调用出现在表达式中,而)调用方式不同。函数的调用出现在表达式中,而过程调用,是由一个独立的语句(过程语句)来完成过程调用,是由一个独立的语句
15、(过程语句)来完成的。的。(3)过程没有类型,也不能给过程名赋值。)过程没有类型,也不能给过程名赋值。(4)返回值的实现方法不同。函值返回时,只由函数)返回值的实现方法不同。函值返回时,只由函数名带回一个函数值;过程返回时,可由实参将运算的名带回一个函数值;过程返回时,可由实参将运算的值带回,需要时可以带回多个值。值带回,需要时可以带回多个值。引入函数和过程(相当于在程序中引入了可以按引入函数和过程(相当于在程序中引入了可以按名引用的模块)之后,名引用的模块)之后,Pascal中的程序获得了简化。中的程序获得了简化。Pascal的过程和用户自定义函数的参数传递,局的过程和用户自定义函数的参数传
16、递,局部变量等都将给程序以全新的面貌。部变量等都将给程序以全新的面貌。更重要的是过程和函数还具有完全递归的功能。更重要的是过程和函数还具有完全递归的功能。所谓递归就是一个函数或过程可以直接或间接地调所谓递归就是一个函数或过程可以直接或间接地调用自己。关于这方面的知识,将在下面专门介绍。用自己。关于这方面的知识,将在下面专门介绍。1programg5;varx,y,z:integer;proceduresy(x:integer;vary:integer);varz:integer;beginx:=5;y:=6;z:=7;writeln(x,y,z);end;beginx:=1;y:=2;z:=3
17、;sy(y,x);writeln(x,y,z);end.输出输出:练习二判断程序运行结果2programg6;vary,t:integer;a,b:real;proceduref(m:integer;vars,k:real);beginy:=2*y;s:=s*y;k:=s/4;k:=k+s+y;end;beginread(y,a);f(y,a,b);writeln(a:0:2,b:10:2);end.输入输入:12输出输出:3(文件名:(文件名:g7.pas)利用自定义过程求任)利用自定义过程求任意两个整数的和意两个整数的和(将求两个整数和的程序段设将求两个整数和的程序段设为一个过程为一个过程
18、).测试数据:测试数据:输入:输入:105输出:输出:154.(文件名:(文件名:g8.pas)将求两个数的最小公倍数的程序设定为一)将求两个数的最小公倍数的程序设定为一个过程个过程,编程求任意两个数的最小公倍数。编程求任意两个数的最小公倍数。测试数据:测试数据:输入:输入:128输出:输出:24提示:求最小公倍数过程提示:求最小公倍数过程procedureabc(m,n:longint;vary:longint);beginy:=m;whiley=m*ndobeginifymodn=0thenbreak;y:=y+m;end;end;子程序中的参数子程序中的参数 n n局部量、全程量与作用域
19、局部量、全程量与作用域n n我们知道,程序有变量说明,过程与函数也有我们知道,程序有变量说明,过程与函数也有变量说明语句。凡在程序中使用到的量,均必变量说明语句。凡在程序中使用到的量,均必须先说明后使用,这是须先说明后使用,这是Pascal语言所具有的语言所具有的一个特点。同样,在过程与函数内部使用的变一个特点。同样,在过程与函数内部使用的变量,也应该在本过程或函数中加以说明,这种量,也应该在本过程或函数中加以说明,这种在子程序内部说明的变量,称之为局部变量。在子程序内部说明的变量,称之为局部变量。n n另外,将那些在程序开头的说明部分中加以定另外,将那些在程序开头的说明部分中加以定义与说明的
20、量,称为全程量。义与说明的量,称为全程量。n n在不同的说明语句部分所说明的变量,在在不同的说明语句部分所说明的变量,在程序中对此变量进行存取的适用范围是不程序中对此变量进行存取的适用范围是不同的,我们将其适用的范围称之为作用域。同的,我们将其适用的范围称之为作用域。n n局部变量的作用域为所在子程序。由于形局部变量的作用域为所在子程序。由于形式参数只在所在子程序中有效,因此也属式参数只在所在子程序中有效,因此也属于局部变量。于局部变量。programaa;vara:integer;procedureadd(x:integer);vara1:integer;begina1:=x+10;writ
21、eln(a1=,a1);end;begina:=15;add(a);writeln(a=,a);end.请思考请思考:哪个是局部量?哪个是局部量?哪个是全程量?哪个是全程量?各自的作用域是什么?各自的作用域是什么?测试数据:测试数据:输出:输出:a1=25a=15关于这个问题,我们来看下面的一个例子:关于这个问题,我们来看下面的一个例子:局部变量的作用域的实质我们可以这样来理解,当局部变量的作用域的实质我们可以这样来理解,当其所在的子程序被调用时,局部变量才分配有确定其所在的子程序被调用时,局部变量才分配有确定的存储单元,而当程序的执行一旦返回到调用程序的存储单元,而当程序的执行一旦返回到调用
22、程序时,局部变量所占用的存储单元就被释放。时,局部变量所占用的存储单元就被释放。至于全程变量的作用域,情况就要复杂一点,我们至于全程变量的作用域,情况就要复杂一点,我们还是先来看以下的一个例题:还是先来看以下的一个例题:programaa;vara,b:integer;proceduresub;vara:integer;begina:=0;writeln(a2=,a,b2=,b);a:=a+10;b:=b+10;writeln(a3=,a,b3=,b);end;测试数据:测试数据:输出:输出:a1=15b1=20a2=0b2=20a3=10b3=30a4=15b4=30begina:=15;b
23、:=20;writeln(a1=,a,b1=,b);sub;writeln(a4=,a,b4=,b);end.值参数与变量参数值参数与变量参数 前面我们提到,前面我们提到,Pascal语言中过程与函数的主要参语言中过程与函数的主要参数种类有值参数与变量参数。变量参数在形式上比值参数种类有值参数与变量参数。变量参数在形式上比值参数多了一个前缀数多了一个前缀VAR,但两者不仅含义不同,且相应的,但两者不仅含义不同,且相应的实在参数的个数、顺序和类型都必须与形式参数一一对实在参数的个数、顺序和类型都必须与形式参数一一对应。应。FreePascal在处理数据传送时有三种方法。一种在处理数据传送时有三种
24、方法。一种是传名,一种是传值,另一种方法是传地址。是传名,一种是传值,另一种方法是传地址。传名就是通过全程量传递数据,变量在主程序中定传名就是通过全程量传递数据,变量在主程序中定义,在子程序不被重新定义而被使用,那么它在主程序义,在子程序不被重新定义而被使用,那么它在主程序和子程序中就是同一个变量,所以在调用函数或过程时和子程序中就是同一个变量,所以在调用函数或过程时其值发生改变,返回主程序,它的值仍然是改变的。它其值发生改变,返回主程序,它的值仍然是改变的。它的用法比较简单,在此就不作详细介绍了,下面主要说的用法比较简单,在此就不作详细介绍了,下面主要说明传值和传地址两种传值方法的使用。明传
25、值和传地址两种传值方法的使用。在调用过程或函数时,传值就是把一个调在调用过程或函数时,传值就是把一个调用语句中的实在参数的值,赋给对应的形式参用语句中的实在参数的值,赋给对应的形式参数。一旦过程(或函数)执行完了,相应分配数。一旦过程(或函数)执行完了,相应分配给形式参数的存储单元就被释放,其值也随之给形式参数的存储单元就被释放,其值也随之消失,相应实参的值并没有发生变化。也就是消失,相应实参的值并没有发生变化。也就是说,实在参数的值仅向形式参数作单向传送,说,实在参数的值仅向形式参数作单向传送,形式参数的值发生变化不会反过来影响实在参形式参数的值发生变化不会反过来影响实在参数的值。例如函数调
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pascal 第6讲 过程和函数 过程 函数
限制150内