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