280 likes | 412 Vues
函数与过程. 东城区第八小学 李计绸. 函数. ( 1 )标准函数: 在第二章中,我们已经接触过一些 Free Pascal 提供一些内部标准函数,供编程时调用,象求 |X| 可调用 ABS ( X ),求可调用 SQRT(49) 等等。实际上,这些函数是一些包含在 Free Pascal 系统中供用户调用的程序模块,分别命名为: ABS,SQRT… 等。因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。如: ABS(X) SQRT(12+X) 等等。 ( 2 )自定义函数
E N D
函数与过程 东城区第八小学 李计绸
函数 • (1)标准函数: • 在第二章中,我们已经接触过一些Free Pascal提供一些内部标准函数,供编程时调用,象求|X|可调用ABS(X),求可调用SQRT(49)等等。实际上,这些函数是一些包含在Free Pascal系统中供用户调用的程序模块,分别命名为:ABS,SQRT…等。因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。如:ABS(X) SQRT(12+X)等等。 • (2)自定义函数 • 系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和数量毕竟有限,不可能包含用户的所有需要。在实际问题中,经常会遇到诸如求N!这一类的运算,系统中则没有提供相应的函数可供调用。为此,Free Pascal允许用户自行定义一些函数,我们称之为自定义函数。这种自定义函数一经定义,就可象内部函数一样,通过函数名调用它。但要注意:这些函数必须在程序中定义,也只能在本程序中使用。
自定义函数的定义格式 • Free Pascal自定义函数用FUNCTION语句开始,每个自定义函数均由函数的首部和函数体组成。 • 定义格式如下: Function 函数名(形参表):函数类型; {函数首部} 说明部分; Begin {函数体} 语句块; 函数名:=表达式; {必须有,函数运算结果通过函数名带出函数体} End;
函数首部 (1)函数首部以保留字Function开头,其后的函数名必须与保留字之间有一个以上的空格。 (2)函数名是对用户定义的一个函数的标识,用于存放调用后的函数值。函数名与标识符的构成规则相同。在同一程序中,所定义的函数名,不能用作变量数组或过程名。 (3)圆括号中的形参表是用逗号隔开的一个或多个形参名。形参名由用户自己决定,所有形参都必须同时说明类型,不同类型的说明之间用分号隔开。 例如: Function EX01(X,Y:Real; m,n:integer):real; 形参即函数的自变量,其初值来源于函数的调用。只有在程序执行过程中调用了函数,形参才有可能得到具体的值并参与运算,求得函数值。可见形参表相当于变量说明,但应特别注意:此处只能使用类型标识符,而不能直接使用类型。
若函数没有自变量,则形参表可以缺省,称为无参函数。此时函数的定义形式为:若函数没有自变量,则形参表可以缺省,称为无参函数。此时函数的定义形式为: Function 函数名:函数类型; {函数首部} (4)函数的类型也就是函数值的类型,它由函数首部来说明,所求得的函数值通过函数名传送回调用程序。由此可见函数的作用一般是为了求得一个值。
函数体 函数体也由说明与执行部分组成。 (1)说明部分用来对函数体内所用的类型、常量、变量等进行说明,这些量只在本函数内有效,与函数体外的同名量无关。 (2)函数体的执行部分以BEGIN开始,以END结束(其后紧跟一个分号)。中间为语句块但至少要有一条赋值语句。即: 函数名:=表达式; 该操作把表达式的值赋给函数名,然后把这个值通过函数名返回调用它的程序中去。
功能 自定义函数定义了一个求值的模块,当一个语句中使用了这个函数时,这个模块才被调用执行。
例1:用函数求a+b=c的值的程序是: 参考程序: program aa; var a,b,c:longint; function add(a,b:longint):longint; var s:longint; begin s:=a+b; add:=s; end; begin read(a,b); c:=add(a,b); writeln(c); end. 测试数据: 输入: 8987 7798 输出: 16785 该程序中的ADD函数,就演示了函数结构。
四、函数的调用 函数一经定义,就可以在同一程序中与函数值类型兼容的表达式中多次被调用。其调用形式如下: 变量:=函数名(实在参数表); 函数调用的说明: (1)自定义函数中的形参称为形式参数,由于它不是实际存在的变量,所以又称虚拟变量。例如:前面所举例子中的X即为形式参数。 它们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,存放实在参数的值。
所谓实在参数是在调用函数时所用的自变量,只是在调用函数时,才将实在参数的值传送到相应于形参的临时的内存单元中去。所谓实在参数是在调用函数时所用的自变量,只是在调用函数时,才将实在参数的值传送到相应于形参的临时的内存单元中去。 形参实质上是实参的一个“替身”和“代办”,实参在程序中可以千变万化,但“代办”只有一个,从而保证了一个子程序可被多次调用。通常,将这种数值传送称为“参数传值”。 在调用函数时,实在参数将值赋给形式参数。因而,必须注意实在参数的个数、类型应该与形式参数一一对应,并且必须要有确定的值。 (2)函数调用的步骤为:计算实参的值,传送给对应的形参;然后执行函数体;最后将函数值返回到调用处。 (3)函数说明是静态的,不具备执行的含义。也就是说,如果一个函数说明之后未被调用,则该函数永远不会被执行。
练习一 1.(文件名:h1.pas)将求两个整数的差设计为一个函数,然后求任意两个整数的差。 测试数据: 输入: 98778 8788 输出: 89990
2.(文件名:h2.pas)将求三角形的面积设计为一个函数,然后求任意底和高的三角形的面积。保留二位小数。2.(文件名:h2.pas)将求三角形的面积设计为一个函数,然后求任意底和高的三角形的面积。保留二位小数。 测试数据: 输入: 10.2 2.5 输出: 12.75
3.(文件名:h3.pas)利用标准函数,对输入的一个长度不小于8的字符串,分别输出它的长度、第2个字符和第5个字符,不同的输出结果之间间隔一个字符.3.(文件名:h3.pas)利用标准函数,对输入的一个长度不小于8的字符串,分别输出它的长度、第2个字符和第5个字符,不同的输出结果之间间隔一个字符. 提示:用到的函数有length、copy 测试数据: 输入: asdf3536sdf 输出: 11 s 3
4.(文件名:h4.pas)输入两个字符串,判断第一个字符串在第二个字符串中的起始位置。两个字符串位于两行。4.(文件名:h4.pas)输入两个字符串,判断第一个字符串在第二个字符串中的起始位置。两个字符串位于两行。 提示:用到的函数有pos 测试数据: 输入: abcd asdfabcdsdffsf 输出:一行,起始位置 5
5.(文件名为h5.pas)编一程序,将摄氏温度换为华氏温度。公式为:5.(文件名为h5.pas)编一程序,将摄氏温度换为华氏温度。公式为: 其中f为华氏温度,c是摄氏温度。将上述公式编为一个函数,要求输入摄氏温度,输出华氏温度,(保留两位小数).
自定义函数应用举例 例2:先编写一个自定义函数用以求X2-5X+4,然后再通过主程序调用此函数,分别求 Y1=32-5*3+4; Y2=(A+5)2-5*(A+5)+4
程序如下: program aa; var y1,y2,a:integer; function fun(x:integer):integer; begin fun:=x*x-5*x+4 end; begin write('input a='); read(a); y1:=fun(3); y2:=fun(a+5); writeln('y1=',y1); writeln('y2=',y2); end. 测试数据: 输入: input a=2 输出: y1=-2 y2=18
例3:现设计一个函数完成乘方运算。当然可以用power函数来实现。例3:现设计一个函数完成乘方运算。当然可以用power函数来实现。 分析:根据数学知识乘方运算的定义是: ,而当n<0时,
program aa; var x,y:real; n:integer; function fc(x1:real; n1:integer):real; var i:integer; t:real; begin t:=1; if n1>0 then for i:=1 to n1 do t:=t*x1; if n1<0 then for i:=1 to -n1 do t:=t/x1; fc:=t; end; begin read(x,n); y:=fc(x,n); writeln(y:0:2); end. 测试数据: 输入: 2 3 输出: 8.00
例4:设计一个函数digit(n,k),它能将自然数N的从右边开始的第K位上的数字取出来。例4:设计一个函数digit(n,k),它能将自然数N的从右边开始的第K位上的数字取出来。 例如:digit(13579,3)=5 digit(2468,6)=0 调用此函数,求出3次输入后,得到的第K位上的数字之和。 分析:为了取得一个数的第K位,可将其右边K-1位数字去掉,即:k-1次(N DIV 10))所得到数的个位就是所求的数字。
begin s:=0; for j:=1 to 3 do begin readln(n1,k1); s:=s+digit(n1,k1); end; writeln(s); end. 程序如下: program aa; var n1,k1,j,s:longint; function digit(n,k:longint):integer; var i:integer; begin n:=abs(n); for i:=1 to k-1 do n:=n div 10; digit:=n mod 10; end; 测试数据: 输入: 133756 2 534534534 6 98809 3 输出: 18
例5:求出正整数N~M之间的完全数(N<M)。 分析:所谓完全数是指它的因子之和等于它本身的数,如:6=1+2+3。为了判定完全数,可以定义一个布尔函数,若是完全数,其值为TRUE,否则为FALSE。
程序如下: program aa; var m,n,i:integer; function perfect(x:integer):boolean; var t,s:integer; begin s:=1; for t:=2 to x div 2 do if x mod t=0 then s:=s+t; if x=s then perfect:=true else perfect:=false end; begin readln(n,m); for i:=n to m do if perfect(i)=true then writeln(i); end. 测试数据: 输入: 2 100 输出: 6 28 注:主程序中的if perfect(i)=true then 通常可写为if perfect(i) then。
练习二 1.(文件名:h6.pas)求出正整数3~M(3<=M<=30000)之间的完全数。 测试数据: 输入:输入M的值 100 输出:每个完全数占一行 6 28 2.(文件名:h7.pas)利用自定义函数求任意两个整数N~M (0<=N<M<=30000)之间所有整数的和. 输入: N,M的值 5 105 输出: N,M之间所有整数的和 5555
3.(文件名:h8.pas)将判断一个数是否为素数设计为一个函数,然后输入任意一个数,利用刚才定义的函数是否为素数,若是输出"TRUE",否则输出"FALSE"。3.(文件名:h8.pas)将判断一个数是否为素数设计为一个函数,然后输入任意一个数,利用刚才定义的函数是否为素数,若是输出"TRUE",否则输出"FALSE"。 输入: 19 输出: TRUE 提示:判断一个数是否为素数的自定义函数可定义如下: function sushu(n:integer):boolean; var j,f:integer; begin f:=0; for j:=2 to round(sqrt(n)) do if n mod j=0 then f:=1; if f=0 then sushu:=TRUE else sushu:=FALSE end;
4.判断程序运行结果,不准用计算机算,只能用笔算。4.判断程序运行结果,不准用计算机算,只能用笔算。 program h9; var y:integer; function sum(x:integer):integer; begin x:=x*x+2; sum:=x*x+2; end; begin y:=1; writeln(y:5,sum(y):5); end.
5.判断程序运行结果,不准用计算机算,只能用笔算。5.判断程序运行结果,不准用计算机算,只能用笔算。 program h10; var x,y,k:integer; function ss(x,y:integer):integer; begin y:=x+y; x:=y-x; ss:=x*y; end; begin x:=20; y:=10; k:=ss(x,y); writeln(k); end.
6.判断程序运行结果,不准用计算机算,只能用笔算。6.判断程序运行结果,不准用计算机算,只能用笔算。 Program h11(input,output); CONST N=10; VAR S,I:INTEGER; FUNCTION CO(I1:INTEGER):INTEGER; VAR J1,S1:INTEGER; BEGIN S1:=N; FOR J1:=(N-1) DOWNTO (N-I1+1) DO S1:=S1*J1 DIV (N-J1+1); CO:=S1; END; BEGIN S:=N+1; FOR I:=2 TO N DO S:=S+CO(I); WRITELN('S=',S); END.