1 / 28

函数与过程

函数与过程. 东城区第八小学 李计绸. 函数. ( 1 )标准函数: 在第二章中,我们已经接触过一些 Free Pascal 提供一些内部标准函数,供编程时调用,象求 |X| 可调用 ABS ( X ),求可调用 SQRT(49) 等等。实际上,这些函数是一些包含在 Free Pascal 系统中供用户调用的程序模块,分别命名为: ABS,SQRT… 等。因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。如: ABS(X) SQRT(12+X) 等等。 ( 2 )自定义函数

nodin
Télécharger la présentation

函数与过程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 函数与过程 东城区第八小学 李计绸

  2. 函数 • (1)标准函数: • 在第二章中,我们已经接触过一些Free Pascal提供一些内部标准函数,供编程时调用,象求|X|可调用ABS(X),求可调用SQRT(49)等等。实际上,这些函数是一些包含在Free Pascal系统中供用户调用的程序模块,分别命名为:ABS,SQRT…等。因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。如:ABS(X) SQRT(12+X)等等。 • (2)自定义函数 • 系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和数量毕竟有限,不可能包含用户的所有需要。在实际问题中,经常会遇到诸如求N!这一类的运算,系统中则没有提供相应的函数可供调用。为此,Free Pascal允许用户自行定义一些函数,我们称之为自定义函数。这种自定义函数一经定义,就可象内部函数一样,通过函数名调用它。但要注意:这些函数必须在程序中定义,也只能在本程序中使用。

  3. 自定义函数的定义格式 • Free Pascal自定义函数用FUNCTION语句开始,每个自定义函数均由函数的首部和函数体组成。 • 定义格式如下: Function 函数名(形参表):函数类型; {函数首部} 说明部分; Begin {函数体} 语句块; 函数名:=表达式; {必须有,函数运算结果通过函数名带出函数体} End;

  4. 函数首部 (1)函数首部以保留字Function开头,其后的函数名必须与保留字之间有一个以上的空格。 (2)函数名是对用户定义的一个函数的标识,用于存放调用后的函数值。函数名与标识符的构成规则相同。在同一程序中,所定义的函数名,不能用作变量数组或过程名。 (3)圆括号中的形参表是用逗号隔开的一个或多个形参名。形参名由用户自己决定,所有形参都必须同时说明类型,不同类型的说明之间用分号隔开。 例如: Function EX01(X,Y:Real; m,n:integer):real; 形参即函数的自变量,其初值来源于函数的调用。只有在程序执行过程中调用了函数,形参才有可能得到具体的值并参与运算,求得函数值。可见形参表相当于变量说明,但应特别注意:此处只能使用类型标识符,而不能直接使用类型。

  5. 若函数没有自变量,则形参表可以缺省,称为无参函数。此时函数的定义形式为:若函数没有自变量,则形参表可以缺省,称为无参函数。此时函数的定义形式为: Function 函数名:函数类型; {函数首部} (4)函数的类型也就是函数值的类型,它由函数首部来说明,所求得的函数值通过函数名传送回调用程序。由此可见函数的作用一般是为了求得一个值。

  6. 函数体 函数体也由说明与执行部分组成。 (1)说明部分用来对函数体内所用的类型、常量、变量等进行说明,这些量只在本函数内有效,与函数体外的同名量无关。 (2)函数体的执行部分以BEGIN开始,以END结束(其后紧跟一个分号)。中间为语句块但至少要有一条赋值语句。即: 函数名:=表达式; 该操作把表达式的值赋给函数名,然后把这个值通过函数名返回调用它的程序中去。

  7. 功能 自定义函数定义了一个求值的模块,当一个语句中使用了这个函数时,这个模块才被调用执行。

  8. 例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函数,就演示了函数结构。

  9. 四、函数的调用 函数一经定义,就可以在同一程序中与函数值类型兼容的表达式中多次被调用。其调用形式如下: 变量:=函数名(实在参数表); 函数调用的说明: (1)自定义函数中的形参称为形式参数,由于它不是实际存在的变量,所以又称虚拟变量。例如:前面所举例子中的X即为形式参数。 它们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,存放实在参数的值。

  10. 所谓实在参数是在调用函数时所用的自变量,只是在调用函数时,才将实在参数的值传送到相应于形参的临时的内存单元中去。所谓实在参数是在调用函数时所用的自变量,只是在调用函数时,才将实在参数的值传送到相应于形参的临时的内存单元中去。 形参实质上是实参的一个“替身”和“代办”,实参在程序中可以千变万化,但“代办”只有一个,从而保证了一个子程序可被多次调用。通常,将这种数值传送称为“参数传值”。 在调用函数时,实在参数将值赋给形式参数。因而,必须注意实在参数的个数、类型应该与形式参数一一对应,并且必须要有确定的值。 (2)函数调用的步骤为:计算实参的值,传送给对应的形参;然后执行函数体;最后将函数值返回到调用处。 (3)函数说明是静态的,不具备执行的含义。也就是说,如果一个函数说明之后未被调用,则该函数永远不会被执行。

  11. 练习一 1.(文件名:h1.pas)将求两个整数的差设计为一个函数,然后求任意两个整数的差。 测试数据: 输入: 98778 8788 输出: 89990

  12. 2.(文件名:h2.pas)将求三角形的面积设计为一个函数,然后求任意底和高的三角形的面积。保留二位小数。2.(文件名:h2.pas)将求三角形的面积设计为一个函数,然后求任意底和高的三角形的面积。保留二位小数。 测试数据: 输入: 10.2 2.5 输出: 12.75

  13. 3.(文件名:h3.pas)利用标准函数,对输入的一个长度不小于8的字符串,分别输出它的长度、第2个字符和第5个字符,不同的输出结果之间间隔一个字符.3.(文件名:h3.pas)利用标准函数,对输入的一个长度不小于8的字符串,分别输出它的长度、第2个字符和第5个字符,不同的输出结果之间间隔一个字符. 提示:用到的函数有length、copy 测试数据: 输入: asdf3536sdf 输出: 11 s 3

  14. 4.(文件名:h4.pas)输入两个字符串,判断第一个字符串在第二个字符串中的起始位置。两个字符串位于两行。4.(文件名:h4.pas)输入两个字符串,判断第一个字符串在第二个字符串中的起始位置。两个字符串位于两行。 提示:用到的函数有pos 测试数据: 输入: abcd asdfabcdsdffsf 输出:一行,起始位置 5

  15. 5.(文件名为h5.pas)编一程序,将摄氏温度换为华氏温度。公式为:5.(文件名为h5.pas)编一程序,将摄氏温度换为华氏温度。公式为: 其中f为华氏温度,c是摄氏温度。将上述公式编为一个函数,要求输入摄氏温度,输出华氏温度,(保留两位小数).

  16. 自定义函数应用举例 例2:先编写一个自定义函数用以求X2-5X+4,然后再通过主程序调用此函数,分别求 Y1=32-5*3+4; Y2=(A+5)2-5*(A+5)+4

  17. 程序如下: 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

  18. 例3:现设计一个函数完成乘方运算。当然可以用power函数来实现。例3:现设计一个函数完成乘方运算。当然可以用power函数来实现。 分析:根据数学知识乘方运算的定义是: ,而当n<0时,

  19. 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

  20. 例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))所得到数的个位就是所求的数字。

  21. 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

  22. 例5:求出正整数N~M之间的完全数(N<M)。 分析:所谓完全数是指它的因子之和等于它本身的数,如:6=1+2+3。为了判定完全数,可以定义一个布尔函数,若是完全数,其值为TRUE,否则为FALSE。

  23. 程序如下: 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。

  24. 练习二 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

  25. 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;

  26. 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.

  27. 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.

  28. 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.

More Related