《过程与函数优秀课件.ppt》由会员分享,可在线阅读,更多相关《过程与函数优秀课件.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、过程与函数第1页,本讲稿共25页提出函数与过程的理由提出函数与过程的理由 计算机程序设计和问题求解的最基本思想是:将一计算机程序设计和问题求解的最基本思想是:将一计算机程序设计和问题求解的最基本思想是:将一计算机程序设计和问题求解的最基本思想是:将一个大的复杂的问题分解成更小、更简单和更容易处理个大的复杂的问题分解成更小、更简单和更容易处理个大的复杂的问题分解成更小、更简单和更容易处理个大的复杂的问题分解成更小、更简单和更容易处理的子问题。在的子问题。在的子问题。在的子问题。在PascalPascal语言提供了函数和过程,使得问语言提供了函数和过程,使得问语言提供了函数和过程,使得问语言提供了
2、函数和过程,使得问题的分解和处理更加方便。题的分解和处理更加方便。题的分解和处理更加方便。题的分解和处理更加方便。函数或过程:将对应于一个子问题求精的语句写在一起,函数或过程:将对应于一个子问题求精的语句写在一起,函数或过程:将对应于一个子问题求精的语句写在一起,函数或过程:将对应于一个子问题求精的语句写在一起,作为一个单独的程序模块。作为一个单独的程序模块。作为一个单独的程序模块。作为一个单独的程序模块。通常通过子程序定义抽象操作,通常通过子程序定义抽象操作,实现程序的模块化。实现程序的模块化。第2页,本讲稿共25页一、函数一、函数 1。定义。定义函数说明一般形式:函数说明一般形式:函数说明
3、一般形式:函数说明一般形式:FUNCTION FUNCTION ():):):):;BEGINBEGIN END END;注意注意注意注意:(1 1)函数名由合法的标识符指出)函数名由合法的标识符指出)函数名由合法的标识符指出)函数名由合法的标识符指出;参数表由形式参数名表和说明参数的类型标识符组成参数表由形式参数名表和说明参数的类型标识符组成参数表由形式参数名表和说明参数的类型标识符组成参数表由形式参数名表和说明参数的类型标识符组成;函数函数函数函数类型即结果类型类型即结果类型类型即结果类型类型即结果类型,由类型标识符指明。由类型标识符指明。由类型标识符指明。由类型标识符指明。(2 2)形式
4、参数类似于数学函数中的自变量)形式参数类似于数学函数中的自变量)形式参数类似于数学函数中的自变量)形式参数类似于数学函数中的自变量,为函数子程序提供初始量。在一个形式参数表中,可以为函数子程序提供初始量。在一个形式参数表中,可以为函数子程序提供初始量。在一个形式参数表中,可以为函数子程序提供初始量。在一个形式参数表中,可以有多个参数。逗号用来分开同类型的各个参数名,分号用来分开不同类型的参数。有多个参数。逗号用来分开同类型的各个参数名,分号用来分开不同类型的参数。有多个参数。逗号用来分开同类型的各个参数名,分号用来分开不同类型的参数。有多个参数。逗号用来分开同类型的各个参数名,分号用来分开不同
5、类型的参数。例如:(例如:(例如:(例如:(x,y:real;m,n:integerx,y:real;m,n:integer)(3 3)说明部分对仅说明部分对仅在函数中使用的量加以说明在函数中使用的量加以说明,可以包括函数所需要的常量、说明类型、变量说明,可以包括函数所需要的常量、说明类型、变量说明,也可以包括其他函数或过程说明,一般称之为也可以包括其他函数或过程说明,一般称之为局部变量局部变量。函数也可以没有说明。函数也可以没有说明。(4 4)函数体)函数体)函数体)函数体:(:(函数部分的程序体函数部分的程序体函数部分的程序体函数部分的程序体)其中至少要有一个给函数名赋值的语句,并以分号结
6、束函数体。其中至少要有一个给函数名赋值的语句,并以分号结束函数体。其中至少要有一个给函数名赋值的语句,并以分号结束函数体。其中至少要有一个给函数名赋值的语句,并以分号结束函数体。第3页,本讲稿共25页2.函数调用函数调用一般形式:一般形式:一般形式:一般形式:()解释:函数调用必须出现在表达式中。函数每次调用,是将解释:函数调用必须出现在表达式中。函数每次调用,是将解释:函数调用必须出现在表达式中。函数每次调用,是将解释:函数调用必须出现在表达式中。函数每次调用,是将每个实在参数的值赋给对应的形式参数,然后由函数完成规定每个实在参数的值赋给对应的形式参数,然后由函数完成规定每个实在参数的值赋给
7、对应的形式参数,然后由函数完成规定每个实在参数的值赋给对应的形式参数,然后由函数完成规定的处理,并回送处理结果。的处理,并回送处理结果。的处理,并回送处理结果。的处理,并回送处理结果。注意:注意:注意:注意:实在参数与形式参数的个数要相同,一一对应,类型上赋值实在参数与形式参数的个数要相同,一一对应,类型上赋值实在参数与形式参数的个数要相同,一一对应,类型上赋值实在参数与形式参数的个数要相同,一一对应,类型上赋值相容。相容。相容。相容。实在参数可以是表达式。实在参数可以是表达式。实在参数可以是表达式。实在参数可以是表达式。若没有形式参数,则若没有形式参数,则若没有形式参数,则若没有形式参数,则
8、 略去实在参数和括号。略去实在参数和括号。略去实在参数和括号。略去实在参数和括号。第4页,本讲稿共25页例例例例:编写一个求K!的函数,调用此函数计算:(0nm=0)and(nm)and(mn2thenlarger:=n1elselarger:=n2;end;largerbeginlargest:=larger(larger(f1,f2),f3);计算和返回f1,f2,f3的最大值end;largestlargest的函数说明指明了largest函数和它的子函数larger的结果值类型都为整数。子函数larger的结果值由赋值语句larger:=n1(或larger:=n2)确定;larges
9、t函数的结果值由赋值语句largest:=larger(larger(f1,f2),f3)确定。第6页,本讲稿共25页例例:求正整数A和B之间的完全数(AB).分析:所谓完全数是指它的小于该数本身的因子之和等于它本身,如6123,6即是一个完全数。因此我们可定义一个布尔型函数perfect(x),若x是完全数,其值为TURE,否则为FALSE。整个程序算法如下:1fori:=AtoBdo2ifperfect(i)thenwriteln(i);vari,a,b:integer;begin主程序开始write(Inputa,b:);repeat输入0a0)and(b0)and(ab);writel
10、n(Listofallperfectnumbers:);从a到b逐个判断,是完全数则打印出来fori:=atobdoifperfect(i)thenwriteln(i);end.functionperfect(x:integer):boolean;vark,sum:integer;begin累加x所有小于本身的因数sum:=1;fork:=2toxdiv2doifxmodk=0thensum:=sum+k;判断x是否是完全数perfect:=x=sum;将结果赋值给函数名end;endofperfect第7页,本讲稿共25页二、过程二、过程 1。定义。定义过程说明一般形式:过程说明一般形式:过
11、程说明一般形式:过程说明一般形式:PROCEDURE PROCEDURE (););););BEGINBEGIN END END;注意:注意:注意:注意:(1 1)形式参数表有两种格式:)形式参数表有两种格式:)形式参数表有两种格式:)形式参数表有两种格式:数值形参数值形参数值形参数值形参和以和以和以和以VARVAR开头的开头的开头的开头的变量形参变量形参变量形参变量形参。(2 2)过程体中没有也不可以有给过程名赋值的语句,返回值由变量形参提供。)过程体中没有也不可以有给过程名赋值的语句,返回值由变量形参提供。)过程体中没有也不可以有给过程名赋值的语句,返回值由变量形参提供。)过程体中没有也不
12、可以有给过程名赋值的语句,返回值由变量形参提供。2.2.过程调用一般形式:过程调用一般形式:过程调用一般形式:过程调用一般形式:()解释:与数值形参对应的实在参数可以是表达式,与变量形参对应的实在参数必须是变量,解释:与数值形参对应的实在参数可以是表达式,与变量形参对应的实在参数必须是变量,解释:与数值形参对应的实在参数可以是表达式,与变量形参对应的实在参数必须是变量,解释:与数值形参对应的实在参数可以是表达式,与变量形参对应的实在参数必须是变量,而不能是一般的表达式。而不能是一般的表达式。而不能是一般的表达式。而不能是一般的表达式。第8页,本讲稿共25页例:定义一个求三数中最大值的过程例:定
13、义一个求三数中最大值的过程procedurelargest(f1,f2,f3:integer;varir:integer);计算和返回f1,f2,f3的最大值irvarg:integer;procedurelarger(n1,n2:integer;varr:integer);largest的子过程,计算和返回n1,n2的最大值rbeginifn1n2thenr:=n1elser:=n2;end;largerbeginlarger(f1,f2,g);求出f1,f2中的最大值glarger(g,f3,ir);求出g,f3中的最大值Ir,作为f1,f2,f3中的最大值返回end;largestLar
14、gest有四个类型为整型的形式参数:f1,f2,f3和Ir,前三个参数f1,f2,f3为调用者向被调用者传入的三个要求比较大小的整数,这三个参数仅用作传入数据,不传出计算结果,因此称为值参;第四个参数Ir用来向调用者传送三数中的最大值,这种用作传出计算结果的参数称为变量参数,由var标志。Largest使用的子过程larger有三个类型为整型的形式参数:n1,n2和r,前二个参数n1,n2为过程Largest向它传入的二个要求比较大小的整数,属于值参;第三个参数r用来向过程Largest传送n1和n2的最大值,属于变量参数。第9页,本讲稿共25页例:例:输出以下一个图形:*分析:我们前面学习可
15、用的二重循环打印出上图形,现我们设置一个过程打印出N个连续的*号。programex7_2;vari:integer;proceduredraw_a_line(n:integer);该过程打印出连续n个星号,并换行varj:integer;beginforj:=1tondowrite(*);writeln;end;beginfori:=1to6dodraw_a_line(i);调用过程,第I行打印i个连续星号end.第10页,本讲稿共25页例例 说明一个求两个整数的最大公约数和最小公倍数的过程说明一个求两个整数的最大公约数和最小公倍数的过程Procedure mab(a,b:integer;v
16、ar maxab,minab:integer);Var f:boolean;i:integer;Begin if ab then begin t:=a;a:=b;b:=t;end;f:=true;i:=a;while f and i0 do begin if (a mod i=0)and(b mod i=0)then begin maxab:=I;minab:=a*b div I;f:=false;end;i:=i-1;end;End;第11页,本讲稿共25页过程与函数的区别第12页,本讲稿共25页实参与形参子程序调用(过程调用或函数调用)的执行顺序分以下几步:实参与形参结合执行子程序体返回调
17、用处继续执行子程序说明的形式参数表对过程或函数内的语句序列直接引用的变量进行说明,详细指明这些参数的类别、数据类型要求和参数的个数。过程或函数被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求。Pascal子程序形参主要分类:1.值参数形式参数表中前面没有var,后有类型的参数。它类似过程和函数的局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。在调用过程或应用函数时,值参数所对应的实际参数必须是表达式,而且它的值不能使文件类型或包括文件类型的值。实参必须和形参赋值相容。2.变量参数形式参数表中前面有var后由类型的参数。如果需要子
18、程序向调用程序返回值时,应采用变量参数。变量参数要求它的实参是和它同一类型的变量。因为在子程序执行时,遇到对相应形参的引用式定值,就是对相应实参的引用式定值,即对形参的任何操作就是对实参本身的操作。第13页,本讲稿共25页例输出两个数中最大值的过程Varx:y:integerprocedurelargest(a,b:integer);beginifabthenwriteln(a)elsewriteln(b);end.beginReadln(x,y);Lagest(x,y);End.实际引用时所用的参数x,y,是主程序定义的变量过程中定义的形式参数a,b,在实际引用过程时,将被实际参数代替第14
19、页,本讲稿共25页过程、函数的数据传递过程、函数的数据传递在程序调用子程序时,调用程序将数据传递给被调用的过程或函数,而当子程序运行结束后,结果又可以通过函数名、变参。当然也可以用全局变量等形式实现数据的传递。接下来我们,就来研究参数传递与局部变量、全局变量等问题。第15页,本讲稿共25页数值形参数值形参 和和 变量形参变量形参Procedure show(a:integer)值形参和对应的实参必须一一对值形参和对应的实参必须一一对应,包括个数和类型。应,包括个数和类型。对应的实在参数可为表达式对应的实在参数可为表达式与实在参数之间传递关系是传值与实在参数之间传递关系是传值仅视作输入参数,它有
20、入口值,仅视作输入参数,它有入口值,而无出口值,故不能表示计算的而无出口值,故不能表示计算的结果结果值形参作为子程序的局部量,当值形参作为子程序的局部量,当控制返回程序后,值形参的存储控制返回程序后,值形参的存储单元释放。单元释放。实参和值形参之间数据传递是单向实参和值形参之间数据传递是单向的,只能由实参传送给形参,相当的,只能由实参传送给形参,相当赋值运算。赋值运算。Procedure show(var a:integer)对应的实在参数必须为变量对应的实在参数必须为变量与实在参数之间传递关系是传地址与实在参数之间传递关系是传地址既可视作输入参数,又可视作输出既可视作输入参数,又可视作输出参
21、数,它可有入口值,也可无入口参数,它可有入口值,也可无入口值,但一般应有出口值,以表示调值,但一般应有出口值,以表示调用过程的返回结果用过程的返回结果变量形参与对应的实参的类型必须完全相变量形参与对应的实参的类型必须完全相同。同。对变量形参,运行时不另外开辟存储单对变量形参,运行时不另外开辟存储单元,而是与对应的实参使用相同的存储元,而是与对应的实参使用相同的存储单元。也就是说,调用子程序时,是将单元。也就是说,调用子程序时,是将实参的地址传送给对应的变量形参。当实参的地址传送给对应的变量形参。当控制返回到调用程序后,变量形参的存控制返回到调用程序后,变量形参的存储单元不释放,但变量形参本身无
22、定义,储单元不释放,但变量形参本身无定义,即不得再使用。即不得再使用。一般在函数中使用值形参,而在过程中才使用变量形参,但也有例外。一般在函数中使用值形参,而在过程中才使用变量形参,但也有例外。第16页,本讲稿共25页写出下列两个程序的运行结果。写出下列两个程序的运行结果。programex1;programex2;vara,b:integer;vara,b:integer;procedure swap(x,y:integer);procedure swap(Var x,y:integer);vart:integer;vart:integer;beginbegint:=x;x:=y;y:=t;
23、t:=x;x:=y;y:=t;end;end;beginbegina:=1;b:=2;a:=1;b:=2;writeln(a:3,b:3);writeln(a:3,b:3);swap(a,b);swap(a,b);writeln(a:3,b:3);writeln(a:3,b:3);end.end.分析:这两个程序唯一的区别是ex1中将x,y作为值形参,而ex2中将x,y作为变量形参,因此在ex2中对x,y的修改实际上是对调用该过程时与它们对应的变量a,b的修改,故最后,a,b的值为2,1。而ex1中调用swap过程时,只是将a,b的值传递给x,y,之后在过程中的操作与a,b无关。ex1的运行结
24、果为:ex2的运行结果为:12121221第17页,本讲稿共25页全局变量和局部变量全局变量和局部变量局部变量:局部变量:凡是在子程序内部作用的变量子程序内部作用的变量,应该在本子程序内加以说明。这种在子程序内部说明的变量称为局部变量局部变量。形式参数形式参数也只是在该子程序中有效,因此也属于局部变量。一个变量的作用域是指在程序中能对此变量进行存取的程序范围。因此,局部变量的作用域就是其所在的子程序局部变量的作用域就是其所在的子程序。实际上,局部变量只是当其所在的子程序被调用时才具有确定的存储单元,当控制从子程序返回到调用程序后,局部变量的存储单元就被释放,从而变得无定义。全局变量:全局变量:
25、是指在主程序的说明部分中说明的量。全局变量的作用域分两种情况:当全局变量和局部量不同名时,其作用域是整个程序范围(自定义起直到主程序结束)。当全局变量和局部量同名时,全局变量的作用域不包含局部量的作用域。在子程序的执行部分使用的是与全局变量同名的局部变量。在子程序的执行部分使用的是与全局变量同名的局部变量。在子程序的执行部分使用的是与全局变量同名的局部变量。在子程序的执行部分使用的是与全局变量同名的局部变量。第18页,本讲稿共25页求程序输出的结果varx,y:integer;procedurea;varx:integer;beginx:=2;writeln(#,x,#);writeln(#,
26、y,#);end;ofabeginmainprogramx:=1;y:=2;writeln(*,x,*,y);a;writeln(*,x,*,y);end.分析:程序中x,y是全局变量,但在过程a中也有变量x,故全程变量x的作用域为除过程a外的任何地方。而y的作用域包含了子程序a,即整个程序。运行结果如下:*1*2#2#2#*1*2第19页,本讲稿共25页求程序输出的结果programex(input,output);varx,y,z:integer;procedures(x:integer;vary:integer);varz:integerbeginx:=5;y:=6;z:=7;end;b
27、eginx:=1;y:=2;z:=3;s(x,y);writeln(x,y,z);end.第20页,本讲稿共25页求程序输出的结果programrange(input,output);varx,y:integer;procedurep1;varx,z:integer;beginx:=10;y:=y+1;z:=10;writeln(x,y,z);end;beginx:=1;y:=1;writeln(x,y);p1;writeln(x,y,z);end.输出结果:111021012(error)第21页,本讲稿共25页递归调用直接递归直接递归子程序内引用子程序本身。例如按递归定义形式写出fac(n
28、)函数的说明如下:functionfac(n:integer):integer;beginifn=0thenfac:=1elsefac:=n*fac(n-1);end;fac第22页,本讲稿共25页例:骨牌铺法骨牌铺法有1*n的一个长方形,用一个1*1、1*2和1*3的骨牌铺满方格。例如n=3时为1*3的方格。此时用1*1、1*2和1*3的骨牌铺满方格,共有四种铺法。图列出了四种铺法。输入n(0n30),输出铺法总数。题解题解varn:integer;格子数functionf(i:integer):longint;输入格子数,计算和返回铺法总数beginifiin1.2递归边界thenf:=i
29、elseifi=3thenf:=4elsef:=f(i-1)+f(i-2)+f(i-3);递归end;fbeginreadln(n);输入格子数writeln(f(n);计算和返回1*n的长方形的铺法总数end.main“铺砖问题”有推广价值。例如某人走n级的楼梯,每步可以走1级、2级或3级,走完n级楼梯共有多少走法。这个问题的数学意义和解法与“铺砖问题”相同。第23页,本讲稿共25页函数的递归调用varn:integer;functioncount(n:integer):integer;beginifn=1thencount:=0elseifnmod2=0thencount:=count(n
30、div2)+2elsecount:=count(n*3+1)+2;end;beginreadln(n);writeln(count(n);end.输入:20第24页,本讲稿共25页读程序写结果 var a,b,c,d:integer;procedure p(a:integer;var b:integer);var c:integer;begin a:=a+1;b:=b+1;c:=2;d:=d+1;writeln(m,a,b,c,d);if a3 then p(a,b);writeln(n,a,b,c,d)end;begin a:=1;b:=1;c:=1;d:=1;writeln(x,a,b,c,d);p(a,b);writeln(y,a,b,c,d);end.X1111M2222M3323N3323N2323y1313第25页,本讲稿共25页