欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    pascal 第6讲 过程和函数.ppt

    • 资源ID:70713052       资源大小:305KB        全文页数:64页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    pascal 第6讲 过程和函数.ppt

    过 程 和 函 数过程一、过程的定义一、过程的定义Pascal的过程定义由过程首部与过程体组成,其形式:的过程定义由过程首部与过程体组成,其形式:Procedure过程名过程名(形式参数表形式参数表);说明部分说明部分;BEGIN过程体过程体(语句块语句块)END;1.过程首部过程首部(1)过程首部以关键词)过程首部以关键词Procedure开头。开头。(2)过程名与函数名的使用规则相同,但要注意过程名不)过程名与函数名的使用规则相同,但要注意过程名不能和同一程序中的变量、数组、函数同名。同时过程名不能能和同一程序中的变量、数组、函数同名。同时过程名不能代表任何数据,因此不必说明类型。代表任何数据,因此不必说明类型。(3)参数表中为过程的形式参数,用逗号分隔。过程和函)参数表中为过程的形式参数,用逗号分隔。过程和函数一样也可以不带形参,此时,只是在主程序调用它时,数一样也可以不带形参,此时,只是在主程序调用它时,执行指定的操作。执行指定的操作。(4)形式参数的使用主要有值形参与变量形参。)形式参数的使用主要有值形参与变量形参。如下例:如下例:ProcedureFAC(A,B:real;C:integer;varx,y:reaL);其中:其中:A,B,C称为值形参,它们与在函数中介绍的形参相称为值形参,它们与在函数中介绍的形参相同;同;X,Y称为变量形参,在它们的前面冠有保留字称为变量形参,在它们的前面冠有保留字Var;关于形式参数的有关内容将在后面介绍。关于形式参数的有关内容将在后面介绍。2过程体:过程体:过程体与函数体相同,也包括说明和执行这两个部分。过程体与函数体相同,也包括说明和执行这两个部分。(1)在过程体内使用的有关常量、变量等必须在过程体的说)在过程体内使用的有关常量、变量等必须在过程体的说明部分内加以说明或定义。明部分内加以说明或定义。(2)在过程体说明的有关量,只有在过程体执行期间有效,)在过程体说明的有关量,只有在过程体执行期间有效,当退出过程体后,为这些量分配的存储单元被释放。当退出过程体后,为这些量分配的存储单元被释放。(3)过程体的执行部分不能给过程名赋值,因为过程名不能)过程体的执行部分不能给过程名赋值,因为过程名不能代表任何数据。代表任何数据。二、过程的调用二、过程的调用主程序是通过一条独立的过程调用语句来调用过程的。主程序是通过一条独立的过程调用语句来调用过程的。调用过程必须给出一个过程名,并用实在参数代替形式参数,调用过程必须给出一个过程名,并用实在参数代替形式参数,一般形式是:一般形式是:过程名过程名(实在参数表实在参数表);对于过程的调用要注意以下几点:对于过程的调用要注意以下几点:(1)调用的过程必须在调用之前进行说明,也就是说必须)调用的过程必须在调用之前进行说明,也就是说必须先说明后调用。先说明后调用。(2)调用过程时,通常是通过值形参给过程提供原始数据,)调用过程时,通常是通过值形参给过程提供原始数据,通过变量形参将值带回调用程序。因此我们可以这样来理通过变量形参将值带回调用程序。因此我们可以这样来理解:值形参是过程的输入参数,变量形参是过程的输出参解:值形参是过程的输入参数,变量形参是过程的输出参数。数。(3)仅当在主程序中调用过程时,过程中的语句块才被执)仅当在主程序中调用过程时,过程中的语句块才被执行,调用完毕自动返回主程序的调用点,使主程序继续往行,调用完毕自动返回主程序的调用点,使主程序继续往下执行。因此,过程中的过程定义仅起一个说明作用。下执行。因此,过程中的过程定义仅起一个说明作用。例如,执行下面程序:例如,执行下面程序:(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的入口点。然而,由于执行该程序时并的入口点。然而,由于执行该程序时并没有调用没有调用sub过程,因此执行完第过程,因此执行完第(1)语句后,程序并不会自语句后,程序并不会自动进入从第动进入从第(2)语句开始的该过程,因而打印出来的结果是语句开始的该过程,因而打印出来的结果是x=100。过程应用举例过程应用举例例例1:编写程序,求:编写程序,求:S=2!+4!+6!+8!+10!测试数据:测试数据:输入:无输入:无输出:输出:3669866分析:此题不用过程也很好求分析:此题不用过程也很好求S,但经仔细研究可发现:,但经仔细研究可发现:用一个过程去完成每次求阶乘的计算,避免了同一功能用一个过程去完成每次求阶乘的计算,避免了同一功能程序的重复,使程序更为简洁,也更加容易阅读。程序的重复,使程序更为简洁,也更加容易阅读。程序如下:程序如下: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;procedureadd(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;begink:=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)将求一个数阶乘的方法设)将求一个数阶乘的方法设计为一个过程,利用这个过程,求输入的任意的计为一个过程,利用这个过程,求输入的任意的两个数的阶乘和。(两个数的阶乘和。(N,M8)测试数据:测试数据:输入:一行,两个数之间隔一空格输入:一行,两个数之间隔一空格35输出:一行,两个的阶乘和。输出:一行,两个的阶乘和。126例例2:学校举行晚会,要:学校举行晚会,要M个学生中选个学生中选N个学生到舞台个学生到舞台上表演一个游戏,问有多少种选择方法。这是数学中上表演一个游戏,问有多少种选择方法。这是数学中的组合运算,的组合运算,可用下列公式计算可用下列公式计算,其中,其中M,N由键由键盘输入。盘输入。分析:从上述公式我们发现,它有三个完全相同的计分析:从上述公式我们发现,它有三个完全相同的计算阶乘的运算。若我们把计算阶乘的程序拿出来,作算阶乘的运算。若我们把计算阶乘的程序拿出来,作为一独立的过程,那么计算这道题目的程序结构就变为一独立的过程,那么计算这道题目的程序结构就变得非常简单了。得非常简单了。程序如下:程序如下: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=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.测试数据:测试数据:输入输入:510输出输出:50可以看出,可以看出,Pascal的过程函数相似,都需要先定义后的过程函数相似,都需要先定义后调用,但有以下几个主要差别:调用,但有以下几个主要差别:(1)函数通常被设计成求一个函数值;而过程通常被)函数通常被设计成求一个函数值;而过程通常被设计成能得到若干个运算结果,也可以用来完成一系设计成能得到若干个运算结果,也可以用来完成一系列的数据处理或与计算无关的各种操作。列的数据处理或与计算无关的各种操作。(2)调用方式不同。函数的调用出现在表达式中,而)调用方式不同。函数的调用出现在表达式中,而过程调用,是由一个独立的语句(过程语句)来完成过程调用,是由一个独立的语句(过程语句)来完成的。的。(3)过程没有类型,也不能给过程名赋值。)过程没有类型,也不能给过程名赋值。(4)返回值的实现方法不同。函值返回时,只由函数)返回值的实现方法不同。函值返回时,只由函数名带回一个函数值;过程返回时,可由实参将运算的名带回一个函数值;过程返回时,可由实参将运算的值带回,需要时可以带回多个值。值带回,需要时可以带回多个值。引入函数和过程(相当于在程序中引入了可以按引入函数和过程(相当于在程序中引入了可以按名引用的模块)之后,名引用的模块)之后,Pascal中的程序获得了简化。中的程序获得了简化。Pascal的过程和用户自定义函数的参数传递,局的过程和用户自定义函数的参数传递,局部变量等都将给程序以全新的面貌。部变量等都将给程序以全新的面貌。更重要的是过程和函数还具有完全递归的功能。更重要的是过程和函数还具有完全递归的功能。所谓递归就是一个函数或过程可以直接或间接地调所谓递归就是一个函数或过程可以直接或间接地调用自己。关于这方面的知识,将在下面专门介绍。用自己。关于这方面的知识,将在下面专门介绍。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;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)利用自定义过程求任)利用自定义过程求任意两个整数的和意两个整数的和(将求两个整数和的程序段设将求两个整数和的程序段设为一个过程为一个过程).测试数据:测试数据:输入:输入: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局部量、全程量与作用域局部量、全程量与作用域n n我们知道,程序有变量说明,过程与函数也有我们知道,程序有变量说明,过程与函数也有变量说明语句。凡在程序中使用到的量,均必变量说明语句。凡在程序中使用到的量,均必须先说明后使用,这是须先说明后使用,这是Pascal语言所具有的语言所具有的一个特点。同样,在过程与函数内部使用的变一个特点。同样,在过程与函数内部使用的变量,也应该在本过程或函数中加以说明,这种量,也应该在本过程或函数中加以说明,这种在子程序内部说明的变量,称之为局部变量。在子程序内部说明的变量,称之为局部变量。n n另外,将那些在程序开头的说明部分中加以定另外,将那些在程序开头的说明部分中加以定义与说明的量,称为全程量。义与说明的量,称为全程量。n n在不同的说明语句部分所说明的变量,在在不同的说明语句部分所说明的变量,在程序中对此变量进行存取的适用范围是不程序中对此变量进行存取的适用范围是不同的,我们将其适用的范围称之为作用域。同的,我们将其适用的范围称之为作用域。n n局部变量的作用域为所在子程序。由于形局部变量的作用域为所在子程序。由于形式参数只在所在子程序中有效,因此也属式参数只在所在子程序中有效,因此也属于局部变量。于局部变量。programaa;vara:integer;procedureadd(x:integer);vara1:integer;begina1:=x+10;writeln(a1=,a1);end;begina:=15;add(a);writeln(a=,a);end.请思考请思考:哪个是局部量?哪个是局部量?哪个是全程量?哪个是全程量?各自的作用域是什么?各自的作用域是什么?测试数据:测试数据:输出:输出:a1=25a=15关于这个问题,我们来看下面的一个例子:关于这个问题,我们来看下面的一个例子:局部变量的作用域的实质我们可以这样来理解,当局部变量的作用域的实质我们可以这样来理解,当其所在的子程序被调用时,局部变量才分配有确定其所在的子程序被调用时,局部变量才分配有确定的存储单元,而当程序的执行一旦返回到调用程序的存储单元,而当程序的执行一旦返回到调用程序时,局部变量所占用的存储单元就被释放。时,局部变量所占用的存储单元就被释放。至于全程变量的作用域,情况就要复杂一点,我们至于全程变量的作用域,情况就要复杂一点,我们还是先来看以下的一个例题:还是先来看以下的一个例题: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:=20;writeln(a1=,a,b1=,b);sub;writeln(a4=,a,b4=,b);end.值参数与变量参数值参数与变量参数 前面我们提到,前面我们提到,Pascal语言中过程与函数的主要参语言中过程与函数的主要参数种类有值参数与变量参数。变量参数在形式上比值参数种类有值参数与变量参数。变量参数在形式上比值参数多了一个前缀数多了一个前缀VAR,但两者不仅含义不同,且相应的,但两者不仅含义不同,且相应的实在参数的个数、顺序和类型都必须与形式参数一一对实在参数的个数、顺序和类型都必须与形式参数一一对应。应。FreePascal在处理数据传送时有三种方法。一种在处理数据传送时有三种方法。一种是传名,一种是传值,另一种方法是传地址。是传名,一种是传值,另一种方法是传地址。传名就是通过全程量传递数据,变量在主程序中定传名就是通过全程量传递数据,变量在主程序中定义,在子程序不被重新定义而被使用,那么它在主程序义,在子程序不被重新定义而被使用,那么它在主程序和子程序中就是同一个变量,所以在调用函数或过程时和子程序中就是同一个变量,所以在调用函数或过程时其值发生改变,返回主程序,它的值仍然是改变的。它其值发生改变,返回主程序,它的值仍然是改变的。它的用法比较简单,在此就不作详细介绍了,下面主要说的用法比较简单,在此就不作详细介绍了,下面主要说明传值和传地址两种传值方法的使用。明传值和传地址两种传值方法的使用。在调用过程或函数时,传值就是把一个调在调用过程或函数时,传值就是把一个调用语句中的实在参数的值,赋给对应的形式参用语句中的实在参数的值,赋给对应的形式参数。一旦过程(或函数)执行完了,相应分配数。一旦过程(或函数)执行完了,相应分配给形式参数的存储单元就被释放,其值也随之给形式参数的存储单元就被释放,其值也随之消失,相应实参的值并没有发生变化。也就是消失,相应实参的值并没有发生变化。也就是说,实在参数的值仅向形式参数作单向传送,说,实在参数的值仅向形式参数作单向传送,形式参数的值发生变化不会反过来影响实在参形式参数的值发生变化不会反过来影响实在参数的值。例如函数调用时就是采用了数的值。例如函数调用时就是采用了“按值传按值传送送”的方法,返回时只由函数名带回一个函数的方法,返回时只由函数名带回一个函数值。值。programaa;vara:integer;procedureadd(a1:integer);begina1:=a1+20;writeln(a1=,a1);end;begina:=10;add(a);writeln(a=,a);end.执行结果为:执行结果为:a1=30a=10FreePascal的过程也可用值参数方法传递数据,请看下例:的过程也可用值参数方法传递数据,请看下例:请注意两个打印结果。请注意两个打印结果。A1是值参数,在过程是值参数,在过程语句开始执行时,实参数语句开始执行时,实参数A的值的值10传递给传递给A1,经过,经过过程体的运算,过程体的运算,A1的值结果为的值结果为30,此时输出,此时输出A1=30,然而,当过程执行完毕返回主程序时,原,然而,当过程执行完毕返回主程序时,原实在参数实在参数A的值并未受影响,打印结果仍为的值并未受影响,打印结果仍为10。此例体现了此例体现了Pascal语言语言“按值传送按值传送”方法的方法的一个规则:变量和表达式能用传值方法来传送数据。一个规则:变量和表达式能用传值方法来传送数据。一般说来,只要在过程或函数中不出现对实参变量一般说来,只要在过程或函数中不出现对实参变量的赋值操作,实参变量的值是不会因调用过程或函的赋值操作,实参变量的值是不会因调用过程或函数而变更的(实参变量对过程或函数而言是全程变数而变更的(实参变量对过程或函数而言是全程变量)。量)。传地址是指将实在参数在内存的存储单元的传地址是指将实在参数在内存的存储单元的地址分配给形式参数。也就是说,实在参数与形地址分配给形式参数。也就是说,实在参数与形式参数实际上共同一个存储单元。式参数实际上共同一个存储单元。传地址的优点是被调用的过程能够影响传送传地址的优点是被调用的过程能够影响传送给它的变量的值,从而能把信息传给调用者。这给它的变量的值,从而能把信息传给调用者。这是因为是因为“按址传送按址传送”方法实质是在传指针,它指方法实质是在传指针,它指向数据存储的地址,所以过程知道变量存放什么向数据存储的地址,所以过程知道变量存放什么地方,因而能够对其进行读、写操作。地方,因而能够对其进行读、写操作。以下的例子就是用以下的例子就是用“按址传送按址传送”的方法进行的:的方法进行的:程序中,实参程序中,实参A起了起了双向传递数据的作用,即双向传递数据的作用,即把实际参数把实际参数A的存储单元的存储单元的地址传递到过程的形式的地址传递到过程的形式参数参数C,在过程体中进行,在过程体中进行运算后,再把结果带回主运算后,再把结果带回主程序输出。由此可知,用程序输出。由此可知,用传地址方法传送的变量值传地址方法传送的变量值能被调用的过程改变。能被调用的过程改变。programaa;vara:integer;procedureadd(varc:integer);beginc:=c+10;writeln(c=,c);end;begina:=10;add(a);writeln(a=,a);end.运行结果:运行结果:c=20a=20从上面两例的对比中可以看出:实参数据的单、双从上面两例的对比中可以看出:实参数据的单、双向传递,是由过程定义中相应的形参种类所决定的,向传递,是由过程定义中相应的形参种类所决定的,利用变量形参是从一个过程中传回数据的主要手段之利用变量形参是从一个过程中传回数据的主要手段之一。一。综上所述,我们可以得到如下的结论:综上所述,我们可以得到如下的结论:FreePascal中的参数若是值形参则参数传递必为传值,若中的参数若是值形参则参数传递必为传值,若形式参数为变量形参,则传地址。由于值形参的作用形式参数为变量形参,则传地址。由于值形参的作用仅仅是将子程序外部的值传递给过程或函数,因此又仅仅是将子程序外部的值传递给过程或函数,因此又称值参数是输入参数,所以对应的实际参数可以是常称值参数是输入参数,所以对应的实际参数可以是常数、变量或表达式。而变量参数除了能将子程序外部数、变量或表达式。而变量参数除了能将子程序外部的数据传递给过程或函数,更重要是它能将子程序中的数据传递给过程或函数,更重要是它能将子程序中变化的形式参数的值带出来,所以又将变量参数称之变化的形式参数的值带出来,所以又将变量参数称之为输出参数,其对应的实际参数必须为变量。为输出参数,其对应的实际参数必须为变量。programg9;varx,y:integer;procedurepd(a:integer;varb:integer);begina:=1;b:=a+b;end;beginx:=10;y:=20;pd(x,y);writeln(x,y:5);end.输出输出:_1.判断程序运行结果,不准在计算机上运算,只能用笔算。判断程序运行结果,不准在计算机上运算,只能用笔算。练习三programg10;varx:integer;procedurepr(varz:integer);beginz:=z+100;write(x=,x);end;beginx:=10;pr(x);x:=100;writeln(x=,x);end.输出:输出:_2.判断程序运行结果,不准在计算机上运算,只能用笔算。判断程序运行结果,不准在计算机上运算,只能用笔算。3.判断程序运行结果,判断程序运行结果,programg11;vara,b:integer;proceduresub;vara:integer;begina:=0;writeln(a2=,a,b2=,b);a:=a+15;b:=b+20;writeln(a3=,a,b3=,b);end;begina:=5;b:=10;writeln(a1=,a,b1=,b);sub;writeln(a4=,a,b4=,b);end.4.(文件名:(文件名:g12.pas)将求梯形面积的方法设计为一)将求梯形面积的方法设计为一个过程,利用这个过程,现在输入任意上底、下底和个过程,利用这个过程,现在输入任意上底、下底和高的值,求梯形的面积。底、高、面积的值均为实型高的值,求梯形的面积。底、高、面积的值均为实型数,最后结果保留二位小数。数,最后结果保留二位小数。测试数据测试数据输入:三个数,分别是上底、下底和高,数字间隔一输入:三个数,分别是上底、下底和高,数字间隔一空格空格2.53.56.6输出:输出:19.80函数n n(1 1)标准函数:)标准函数:)标准函数:)标准函数:n n我们已经接触过一些我们已经接触过一些我们已经接触过一些我们已经接触过一些Free PascalFree Pascal提供一些内部标准函数,提供一些内部标准函数,提供一些内部标准函数,提供一些内部标准函数,供编程时调用,象求供编程时调用,象求供编程时调用,象求供编程时调用,象求|X|X|可调用可调用可调用可调用ABSABS(XX),求可调用),求可调用),求可调用),求可调用SQRT(49)SQRT(49)等等。实际上,这些函数是一些包含在等等。实际上,这些函数是一些包含在等等。实际上,这些函数是一些包含在等等。实际上,这些函数是一些包含在Free Free PascalPascal系统中供用户调用的程序模块,分别命名为:系统中供用户调用的程序模块,分别命名为:系统中供用户调用的程序模块,分别命名为:系统中供用户调用的程序模块,分别命名为:ABS,SQRTABS,SQRT等。因而,只要在程序中遵照一定的调用规则,等。因而,只要在程序中遵照一定的调用规则,等。因而,只要在程序中遵照一定的调用规则,等。因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这写出某一函数名以及此函数所需的参数,系统就会自调用这写出某一函数名以及此函数所需的参数,系统就会自调用这写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。如:些程序模块,求得运算结果。如:些程序模块,求得运算结果。如:些程序模块,求得运算结果。如:ABS(X)ABS(X)SQRT(12+X)SQRT(12+X)等等。等等。等等。等等。n n(2 2)自定义函数)自定义函数)自定义函数)自定义函数n n系统提供的这些内部标准函数,虽然使用起来十分方便,但系统提供的这些内部标准函数,虽然使用起来十分方便,但系统提供的这些内部标准函数,虽然使用起来十分方便,但系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和数量毕竟有限,不可能包含用户的所有需要。在其中种类和数量毕竟有限,不可能包含用户的所有需要。在其中种类和数量毕竟有限,不可能包含用户的所有需要。在其中种类和数量毕竟有限,不可能包含用户的所有需要。在实际问题中,经常会遇到诸如求实际问题中,经常会遇到诸如求实际问题中,经常会遇到诸如求实际问题中,经常会遇到诸如求NN!这一类的运算,系统中!这一类的运算,系统中!这一类的运算,系统中!这一类的运算,系统中则没有提供相应的函数可供调用。为此,则没有提供相应的函数可供调用。为此,则没有提供相应的函数可供调用。为此,则没有提供相应的函数可供调用。为此,Free PascalFree Pascal允许允许允许允许用户自行定义一些函数,我们称之为自定义函数。这种自定用户自行定义一些函数,我们称之为自定义函数。这种自定用户自行定义一些函数,我们称之为自定义函数。这种自定用户自行定义一些函数,我们称之为自定义函数。这种自定义函数一经定义,就可象内部函数一样,通过函数名调用它。义函数一经定义,就可象内部函数一样,通过函数名调用它。义函数一经定义,就可象内部函数一样,通过函数名调用它。义函数一经定义,就可象内部函数一样,通过函数名调用它。但要注意:这些函数必须在程序中定义,也只能在本程序中但要注意:这些函数必须在程序中定义,也只能在本程序中但要注意:这些函数必须在程序中定义,也只能在本程序中但要注意:这些函数必须在程序中定义,也只能在本程序中使用。使用。使用。使用。自定义函数的定义格式n nFree PascalFree Pascal自定义函数用自定义函数用自定义函数用自定义函数用FUNCTIONFUNCTION语句开始,语句开始,语句开始,语句开始,每个自定义函数均由函数的首部和函数体组成。每个自定义函数均由函数的首部和函数体组成。每个自定义函数均由函数的首部和函数体组成。每个自定义函数均由函数的首部和函数体组成。n n定义格式如下:定义格式如下:定义格式如下:定义格式如下:Function Function 函数名(形参表):函数类型;函数名(形参表):函数类型;函数名(形参表):函数类型;函数名(形参表):函数类型;函数首函数首函数首函数首部部部部 说明部分;说明部分;说明部分;说明部分;Begin Begin 函数体函数体函数体函数体 语句块;语句块;语句块;语句块;函数名函数名函数名函数名:=:=表达式;表达式;表达式;表达式;必须有,函数运算结果通过函数名必须有,函数运算结果通过函数名必须有,函数运算结果通过函数名必须有,函数运算结果通过函数名带出函数体带出函数体带出函数体带出函数体 End;End;函数首部(1)函数首部以保留字)函数首部以保留字Function开头,其后的函数名必须与保留开头,其后的函数名必须与保留字之间有一个以上的空格。字之间有一个以上的空格。(2)函数名是对用户定义的一个函数的标识,用于存放调用后的)函数名是对用户定义的一个函数的标识,用于存放调用后的函数值。函数名与标识符的构成规则相同。在同一程序中,所定函数值。函数名与标识符的构成规则相同。在同一程序中,所定义的函数名,不能用作变量数组或过程名。义的函数名,不能用作变量数组或过程名。(3)圆括号中的形参表是用逗号隔开的一个或多个形参名。形参)圆括号中的形参表是用逗号隔开的一个或多个形参名。形参名由用户自己决定,所有形参都必须同时说明类型,不同类型的名由用户自己决定,所有形参都必须同时说明类型,不同类型的说明之间用分号隔开。说明之间用分号隔开。例如:例如:FunctionEX01(X,Y:Real;m,n:integer):real;形参即函数的自变量,其初值来源于函数的调用。只有在程序执形参即函数的自变量,其初值来源于函数的调用。只有在程序执行过程中调用了函数,形参才有可能得到具体的值并参与运算,行过程中调用了函数,形参才有可能得到具体的值并参与运算,求得函数值。可见形参表相当于变量说明,但应特别注意:此处求得函数值。可见形参表相当于变量说明,但应特别注意:此处只能使用类型标识符,而不能直接使用类型。只能使用类型标识符,而不能直接使用类型。若函数没有自变量,则形参表可以缺省,称为无参函数。此若函数没有自变量,则形参表可以缺省,称为无参函数。此时函数的定义形式为:时函数的定义形式为:Function函数名:函数类型;函数名:函数类型;函数首部函数首部(4)函数的类型也就是函数值的类型,它由函数首部来说)函数的类型也就是函数值的类型,它由函数首部来说明,所求得的函数值通过函数名传送回调用程序。由此可见明,所求得的函数值通过函数名传送回调用程序。由此可见函数的作用一般是为了求得一个值。函数的作用一般是为了求得一个值。函数体函数体也由说明与执行部分组成。函数体也由说明与执行部分组成。(1)说明部分用来对函数体内所用的类型、常量、变)说明部分用来对函数体内所用的类型、常量、变量等进行说明,这些量只在本函数内有效,与函数体外量等进行说明,这些量只在本函数内有效,与函数体外的同名量无关。的同名量无关。(2)函数体的执行部分以)函数体的执行部分以BEGIN开始,以开始,以END结束结束(其后紧跟一个分号)。中间为语句块但至少要有一条(其后紧跟一个分号)。中间为语句块但至少要有一条赋值语句。即:赋值语句。即:函数名函数名:=表达式;表达式;该操作把表达式的值赋给函数名,然后把这个值通过函该操作把表达式的值赋给函数名,然后把这个值通过函数名返回调用它的程序中去。数名返回调用它的程序中去。功能 自定义函数定义了一个求值的模块,当一个语自定义函数定义了一个求值的模块,当一个语句中使用了这个函数时,这个模块才被调用执句中使用了这个函数时,这个模块才被调用执行。行。例例1:用函数求:用函数求a+b=c的值的程序是:的值的程序是:参考程序:参考程序:programaa;vara,b,c:longint;functionadd(a,b:longint):longint;vars:longint;begins:=a+b;add:=s;end;beginread(a,b);c:=add(a,b);writeln(c);end.测试数据:测试数据:输入:输入:89877798输出:输出:16785该程序中的该程序中的ADD函函数,就演示了函数结数,就演示了函数结构。构。函数的调用函数的调用函数一经定义,就可以在同一程序中与函数值类型兼容的函数一经定义,就可以在同一程序中与函数值类型兼容的表达式中多次被调用。其调用形式如下:表达式中多次被调用。其调用形式如下:变量变量:=函数名函数名(实在参数表实在参数表);函数调用的说明:函数调用的说明:(1)自定义函数中的形参称为形式参数,由于它不是实)自定义函数中的形参称为形式参数,由于它不是实际存在的变量,所以又称虚拟变量。例如:前面所举例子中的际存在的变量,所以又称虚拟变量。例如:前面所举例子中的X即为形式参数。即为形式参数。它们并不占用内存单元,只有在调用函数时,才临时开辟它们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,存放实在参数的值。相应的内存单元,存放实在参数的值。所谓实在参数是在调用函数时所用的自变量,只是在调用函数所谓实在参数是在调用函数时所用的自变量,只是在调用函数时,才将实在参数的值传送到相应于形参的临时的内存单元中时,才将实在参数的值传送到相应于形参的临时的内存单元中去。去。形参实质上是实参的一个形参实质上是实参的一个“替身替身”和和“代办代办”,实参在程序中,实参在程序中可以千变万化,但可以千变万化,但“代办代办”只有一个,从而保证了一个子程序只有一个,从而保证了一个子程序可被多次调用。通常,将这种数值传送称为可被多次调用。通常,将这种数值传送称为“参数传值参数传值”。在调用函数时,实在参数将值赋给形式参数。因而,必须注意在调用函数时,实在参数将值赋给形式参数。因而,必须注意实在参数的个数、类型应该与形式参数一一对应,并且必须要实在参数的个数、类型应该与形式参数一一对应,并且必须要有确定的值。有确定的值。(2)函数调用的步骤为:计算实参的值,传送给对应的形参;)函数调用的步骤为:计算实参的值,传送给对应的形参;然后执行函数体;最后将函数值返回到调用处。然后执行函数体;最后将函数值返回到调用处。(3)函数说明是静态的,不具备执行的含义。也就是说,如)函数说明是静态的,不具备执行的含义。也就是说,如果一个函数说明之后未被调用,则该函数永远不会被执行。果一个函数说明之后未被调用,则该函数永远不会被执行。1(文件名:(文件名:h1.pas)将求两个整数的差设计)将求两个整数的差设计为一个函数,然后求任意两个整数的差。为一个函数,然后求任意两个整数的差。测试数据:测试数据:输入:输入:987788788输出:输出:89990练习一2(文件名:(文件名:h2.pas)将求三角形的面积设计)将求三角形的面积设计为一个函数,然后求任意底和高的三角形的面积。为一个函数,然后求任意底和高的三角形的面积。保留二位小数。保留二位小数。测试数据:测试数据:输入:输入:10.22.5输出:输出:12.753.3.(文件名:(文件名:h3.pash3.pas)利用标准函数,对输入)利用标准函数,对输入的一个长度不小于的一个长度不小于8 8的字符串的字符串,分别输出它的长分别输出它的长度、第度、第2 2个字符和第个字符

    注意事项

    本文(pascal 第6讲 过程和函数.ppt)为本站会员(hyn****60)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开