Pascal程序设计(第7课)-函数和过程课件

上传人:我*** 文档编号:139686741 上传时间:2020-07-23 格式:PPT 页数:25 大小:162KB
返回 下载 相关 举报
Pascal程序设计(第7课)-函数和过程课件_第1页
第1页 / 共25页
Pascal程序设计(第7课)-函数和过程课件_第2页
第2页 / 共25页
Pascal程序设计(第7课)-函数和过程课件_第3页
第3页 / 共25页
Pascal程序设计(第7课)-函数和过程课件_第4页
第4页 / 共25页
Pascal程序设计(第7课)-函数和过程课件_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《Pascal程序设计(第7课)-函数和过程课件》由会员分享,可在线阅读,更多相关《Pascal程序设计(第7课)-函数和过程课件(25页珍藏版)》请在金锄头文库上搜索。

1、Pascal语言,第7课,计算机程序设计和问题求解的最基本的思想是:将一个大的复杂的问题分解为多个更小的、更简单的和更容易处理的小问题。只要单独解决每一个小问题,就可以借助这些小问题解决最终的大问题。并且这样做的好处是可以单独对每一个小问题进行设计,最后由主程序调用一个个的小程序,这样有利于合作开发。,【函数与过程程序设计】,我们前面学到的一些程序都是由较短的语句序列组成的,没有或很少有嵌套,但是在写较为复杂的程序时,比如说包括多级嵌套的程序,将会变得相当复杂和难以理解,所以我们引进了函数和过程的概念。 对于较为复杂的程序,我们可以只写一个初始的程序段,我们叫主程序。主程序主要负责总体的计算流

2、程,控制各个子问题解决的先后顺序。而将每一个子问题求解的程序段作为一个单独的程序模块由主程序调用,我们就称这个单独的程序模块叫做函数或过程。,【函数与过程程序设计】,Pascal提供了一些标准函数,比如sin(正弦)、cos(余弦)、sqrt(开方)、abs(绝对值)函数等。我们在前面都已经用过,它们在表达式中引用是相当简单的。 Pascal提供的标准函数是有限的,并且有时不能满足某个问题的需要,这时就需要定义新的函数。 函数说明(函数定义)的一般形式: Function ():; ; Begin End;,【函数】,函数说明(函数定义)的一般形式: Function ():; ; Begin

3、 End;,【函数】,说明: (1)函数说明的第一行称为函数首部,它必须用Function开头,然后是函数名(合法的标识符)、参数表(由形式参数名表和说明形式参数的类型标识符组成)和函数类型(即结果的类型)。 (2)函数首部的后面是函数分程序,它由说明部分和语句部分组成。 (3)说明部分定义函数中使用到的变量,可以没有。 (4)语句部分又称函数体,由Begin和End括起来,函数体对数据后将运算结果赋给函数名,作为函数结果传给调用它的程序,所以在函数体中至少有一个给函数名赋值的语句: :=;,函数说明(函数定义)的一般形式: Function ():; ; Begin End;,【函数】,注意

4、: a、函数的类型即是结果的类型,只能由标准类型标识符(real、integer、char、boolean)或枚举、子界、指针等类型标识符指明; b、如果没有参数,形式参数表和括号要去掉; c、在参数表中,可以有多个参数,用“,”来分开相同类型的各个参数;用“;” 来分开不同类型的参数;各种类型的参数分别用“:”后的类型标识符说明。比如: (x,y,z:real;m,n:integer;ch:char),函数调用:为了调用非标准函数,必须预先将函数定义(或称函数说明)写在主程序的说明部分,要求处于变量说明之后,然后在程序中直接使用函数即可。 函数调用的一般形式为: () 解释:函数调用必须出现

5、在表达式中,函数的每次调用,是将每个实在参数的值赋给形式参数,由函数计算完成规定的处理,并送回处理结果。,【函数】,Program a1(input,output); Var n,i:integer; s:real; Function fac(t:integer):real; var j:integer; m:real; begin m:=1; For j:=2 to t do m:= m*j; fac:=m; end; Begin readln(n); s:=fac(n); 函数调用 Writeln(n,!=,s); End.,例1:计算n!,其中n由键盘输入。,n为实在参数; t为形式参数

6、;,注意: a、实在参数是调用时函数括号中的变量参数;形式参数是函数定义中使用的参数。通常情况下形式参数值的改变不会影响实在参数的数值。 b、实在参数与形式参数的个数要相同。实在参数与形式参数按照顺序一一对应,它们之间用“,”隔开。每个实在参数必须与它对应的形式参数在类型上赋值相容; c、实在参数可以是表达式。调用时先计算表达式的值,然后将它们赋给对应的形式参数; d、如果没有形式参数,则略去实在参数和括号。,【实在参数和形式参数】,函数是有局限性的,它们仅可以用于计算单个函数值,这个值是通过函数名带回给调用程序的。我们常常需要写出一些单独的程序模块送回多个结果,或者写一个模块并不需要送回任何

7、的结果,而只执行某些任务,比如打印以前计算的结果,这时就不能用函数了,但是可以用Pascal的过程来解决。 过程说明(过程定义)的一般形式: Procedure (); ; Begin End; 需要时,可以在过程中加说明,如常量说明、变量说明,以及其他函数和过程说明等。,【过程】,过程与函数的不同点: (1)函数以Function开头,而过程以Procedure开头。 (2)函数是通过函数名送回一个结果值,并且函数首部的最后要说明函数(即结果)的类型。而过程的结果由参数送回,可以包括多个结果或无结果。 (3)函数体中至少要包含一个给函数名赋值的语句;而过程不能给过程名赋值,因此过程体可以为空

8、。 (4)函数的调用出现在表达式中,而过程的调用必须作为一个单独的语句。,【过程】,过程调用的一般形式为: () 实在参数表是一些用“,”分开的参数组成的,并且应该满足: a、形式参数表中可以包括值参数和变量参数,当无参数时,形式参数表和括号应该略去。 b、实在参数必须与过程说明中的形式参数个数相同,且次序一一对应。 c、与值参数对应的实在参数可以是表达式;与变量参数对应的实在参数只能是变量。 d、实在参数必须与变量参数类型同一,与值参数类型赋值相容。,【过程】,Program a2(input,output); Var n,i:integer; s:real; Procedure fac(t

9、:integer,Var s:real); var i:integer; begin s:=1; For i:=2 to t do s:= s*i; Begin readln(n); fac(n); 过程调用 Writeln(n,!=,s); End.,例2:计算n!,其中n由键盘输入。,t为值参数; s为变量参数;,注意: a、变量参数定义时需要用保留字VAR指明,而值参数不能加VAR。 b、与值参数对应的可以是表达式,而变量参数对应的实在参数只能是变量。 c、值参数的改变不会影响到相应的实在参数,调用完之后实在参数的值不会改变,比如本例中t的改变不会影响n的具体数值;而对变量参数的运算实际

10、上是对实在参数的运算,因此在函数中改变了实在参数的值,比如上例中s的值。 d、实在参数与值参数应类型赋值相容,而实在参数与变量参数应类型同一。,【值参数和变量参数】,Program a3(input,output); Var x,y:real; Function sh(t:real):real; Begin sh:= (exp(t)-exp(-t)/2 End; Begin 下面是主程序 read(x); y:=sh(1+sh(x)/(sh(2*x)+sh(3*x); writeln(x=,x ,y=,y); End.,Program a3(input,output); Var x,y,s1,

11、s2,s3:real; Procedure sh(t:real;VAR s:real); Begin s:= (exp(t)-exp(-t)/2 End; Begin 下面是主程序 read(x); sh(x,s1); sh(1+s1,s1); 变量s1用了两次 sh(2*x,s2); sh(3*x,s3); y:=s1/(s2+s3); writeln(x=,x ,y=,y); End.,【嵌套】,一个过程或函数可能要求调用另一个函数或过程,我们称这种调用为过程或函数的嵌套。,分析:我们可以定义两个函数,一个函数计算阶乘,另一个函数计算组合数。Pascal规定,被调用的函数说明应该写在调用它

12、的函数的前面,所以应该首先说明阶乘函数。,Program a4(input,output); Function fac(t:integer):real; var j:integer; m:real; begin m:=1; For j:=2 to t do m:= m*j; fac:=m; end; Function cmn(m,n:integer):real; begin cmn:=fac(m)/(fac(n)-fac(m-n); end;,Begin 主程序 writeln(cmn(9,3); writeln(cmn(8,5); end.,主程序可以单独调用函数fac和cmn。,Progr

13、am a4(input,output); Function cmn(m,n:integer):real; Function fac(t:integer):real; var j:integer; m:real; begin m:=1; For j:=2 to t do m:= m*j; fac:=m; end; 结束fac函数 begin cmn:=fac(m)/(fac(n)-fac(m-n); end; 结束cmn函数,Begin 主程序 writeln(cmn(9,3); writeln(cmn(8,5); end.,主程序可以单独调用函数cmn,但不可以直接调用fac,【嵌套】,后面的

14、过程或函数调用前面的没有问题,如果前面的还要调用后面的,就需要向前引用说明。 方法:将处于后面的函数或过程的首部放在前面,并加上保留字Forword,而原来处于后面的函数或过程说明中应去掉形式参数及函数类型说明。,Procedure b(x:integer,Var y:real); forword; Procedure a(p:integer,Var q:real); begin b(p,q); end; Procedure b; begin a(x,y); end;,【递归】,过程或函数调用它自身,称为递归。 函数直接调用自身称为直接递归,函数a 调用函数b,函数b又调用a,称为间接递归。

15、注意: (1) 递归就是在过程或函数里调用自身; (2) 在使用递增归时,必须有一个明确的递归结束条件,称为递归出口。,例5:用递归计算n!,其中n由键盘输入。,分析:递归就是函数调用自身,n!可以通过它的前一项(n-1)!通过公式n*(n-1)!得到,所以我们可以通过递归实现。递归出口就是当n=0的时候结束。 n!可以转换为以下的公式:,按照上面的公式,求n!就转化为了求(n-1)!的问题,而求(n-1)!,又变成了求(n-2)!的问题,如此继续,直到最后变成求0!,根据公式有0!=0,再反过来依次求出1!,2!,3!直到最后求出n!。,例5:用递归计算n!,其中n由键盘输入。,Progra

16、m a5(input,output); Var n,i:integer; s:real; Function fac(t:integer):real; begin if t=0 then fac:=1; else fac:=fac(t-1)*t; end; Begin readln(n); s:=fac(n); 函数调用 Writeln(n,!=,s); End.,例6:求m与n的最大公约数。,分析:从数学上可以知道求m和n的最大公约数等价于求n与(m mod n)的最大公约数,这时可以将n当作新的m, (m mod n)当作新的n,问题又变成了求新的m和n的最大公约数,如此继续,直到新的n等于0时,其最大公约数就是m。,公式:,例6:求m与n的最大公约数。,Program a6(in

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号