您现在的位置:小学生自学网>> 信息>> pascal语言>> 基础教程

pascal第十六讲:函数

作者: 来源: 发布时间:2009年05月12日 点击数:
 

PASCAL给我们提供了一些标准函数,我们不用了解这些函数如何求出来的,只管直接调用它们,挺方便的。如正弦函数,余弦函数,算术平方根......有了这些函数,我们觉得很省事。如:求SIN(1)+SIN(2)+...+SIN(100)=?这个程序我们可以这样编写:

例1

    PROGRAM  e1(input,output);

     VAR i:integer;

       s:real;

     BEGIN

       s:=0;

       for i:=1 to 100 do

        s:=s+sin(i);

       writeln('s=',s);

     END.

在这个程序里,我们直接用到了正弦函数,至于SIN(1),SIN(2)如何求出来的我们不需过问,只管直接用它的结果便是了。

我们来看看下面一个例子:求:1!+2!+3!+...+10!=?

如果要编写程序,我们看到求阶乘的操作要执行10次,只不过每次所求的数不同。我们想:不至于编写10遍求阶乘的程序吧。我们希望有一个求阶乘的函数,假设为JS(X),那么我们就可以这样求这道题了:

例2

 PROGRAM e1(input,output);

     VAR i:integer;

       s:real;

     BEGIN

       s:=0;

       for i:=1 to 10 do

        s:=s+js(i);

       writeln('s=',s);

     END.

现在的问题是:TURBO PASCAL没提供JS(X)这样一个标准函数,这个程序是通不过的。如果是PASCAL的标准函数,我们可以直接调用,如TRUNC(X),LN(X),SQRT(X)......而PASCAL提供给我们的可供直接调用的标准函数不多。没关系,我们编写自己的函数!

  • 函数的编写

自己编写一个函数,它的格式如下:

FUNCTION 函数名(形式参数表):函数类型;

VAR 函数的变量说明;

BEGIN

函数体

END;

我们来分析一下,一个函数的编写可分成三部份:一是函数首部,即第一个语句。它必须以FUNCTION开头,函数名是自己取的,取名的原则是便于记忆,和文件名的取名规则类似。形式参数(简称形参)表以标识符的形式给出,相当于函数中的自变量。参数可以有多个,也可以有多种类型。不同类型的参数之间用“;”隔开,同类型的参数如有多个,则用“,”隔开,在其后得加上说明。如:

FUNCTION A1(A,B,C:INTEGER;D,E,F:REAL):REAL;

在最后,函数属于哪种类型,还得表示出来。在本例中,该函数为实型。

第二部分是函数的变量说明部分,对在本函数中将要用到的变量作类型说明,这一点和以前学的变量一样。如果程序不用变量,则此部分也可省掉。

第三部分是函数体,本函数的功能实现就在于此,编写的语句就在里面。

例3 编写一求阶乘的函数。

我们给此函数取一名字就叫JS。

 fUNCTION js(n:integer):longint;

       var i:integer;

        s:longint;

       begin

        s:=1;

        for i:=1 to n do                        

         s:=s*i;

 js:=s;

end;

在本例中,函数名叫JS,只有一个INTEGER型的自变量N,函数JS属LONGINT型。在本函数中,要用到两个变量I,S,在VAR后已加以说明。在函数体中,是一个求阶乘的语句,但有一点要注意:虽然N的阶乘的值在S中,但最后必须将此值赋给函数JS,此时JS不带任何参数。在任何函数中,最后都要把最终结果赋给函数名,因为该函数的结果是靠函数名返回的。

在这里,函数的参数N是一个接口参数,说得更明确点是入口参数。如果我们调用函数:JS(3),那么在程序里所有有N的地方N被替代成3来计算。在这里,3就被称为值参。又如:SQRT(4),LN(5),这里的4,5叫值参。而SQRT(X),LN(Y)中的X,Y叫形参。

  • 函数的调用

自定义的函数在调用前要先说明,在主程序中的位置如下:

PROGRAM 程序名(INPUT,OUTPUT);

VAR 主程序变量说明;

FOUNCTION 函数名(形参表):函数类型;

VAR 函数变量说明;

BEGIN

函数体

END;{FUNCTION}

BEGIN

主程序

END .{PROGRM}

在主程序中,我们把函数的全部说明放在主程序的变量说明和程序体之间,然后在主程序的执行部分就可以直接调用自定义函数了。注意:在函数的说明部分,我们要用形参,但在程序的执行部分调用自定义函数时,就得用值参了。

例4 利用前面定义的阶乘函数,求5!,9!。

PROGRAM e59(input,outout);

      VAR a1,a2:longint;

     fUNCTION js(n:integer):longint;

      var i:integer;

        s:longint;

      begin

       s:=1;

       for i:=1 to n do

        s:=s*i;

       js:=s;

      end;

     BEGIN

       a1:=js(5);

       a2:=js(9);

       writeln('5!=',a1,' ','9!=',a2);

     END.

在这个程序中,在主程序的BEGIN之前,我们对函数进行了一次说明,在后面的程序中都可以象标准函数那样直接调用自定义函数了。在FUNCTION语句中,用的是形参N,在主程序调用中,调用函数是用的值参,如:JS(5);程序执行到这儿会自动将5代入前面的FUNCTION函数中,用5 取代所有的N,最终将结果赋值给JS。所以在A1中一定是5!,A2中是9!。另外,函数不能单独使用,一定要结合主程序才能运行。

如果是求1!+2!+3!+...+10!,则只需把主程序改成:

A1:=0;

FOR J:=1 TO 10 DO

A1:=A1+JS(J);

WRITELN(A1);

 

在例4中,主程序的变量A1,A2叫全程变量,它们除了主程序外,还可以在函数中出现;在函数说明中用到的变量I,S则是局部变量,只能在函数部分使用,一旦出了函数则失去意义;别外要注意:全程变量和局部变量尽量不要同名。

例5 任意输入10组三角形的三边,求其面积。

已知三角形的三边,是可以求出面积的。我们可以定义一个已知三角形三边求其面积的函数,设为AREA(a1,a2,a3)。

 

    PROGRAM e5(inmput,output);

      VAR a,b,c,s:real;

        i:integer;

      FUNCTION  area(a1,a2,a3:real):real;

       var s1,d:real;

       begin

       d:=(a1+a2+a3)/2;

       s1:=Sqrt(d*(d-a1)*(d-a2)*(d-a3));

       area:=s1;

       end;

 

       BEGIN

       for i:=1 to 10 do

        begin

         writeln('input a,b,c');

         readln(a,b,c);

         if  (a+b<=c) or (a+c<=b) or(b+c<=a)

          then writeln('data error!')

           else writeln('s=',area(a,b,c));

        end;

      END.

在函数说明中,如果形参的个数不止一个,那么在程序中调用函数的实参个数一定要与形参的个数一致,第一个实参对应第一个形参,第二个实参对应第二个形参......次序不能调。

例6 定义一个函数CHECK(N,D),让它返回一个布尔值。如果数字D在整数N的某位中出现则送回TRUE,否则送回FALSE。

例如:CHECK(325719,3)=TRUE;

CHECK(77829,1)=FALSE;

          PROGRAM e6(input,output);

           VAR a,b:integer;

 

            FUNCTION check(n,d:integer):boolean;

            var f:boolean;

             e:integer;

            begin

             f:=false;

             while (n>0) and (not f) do

               begin

                e:=n mod 10;

                n:=n div 10;

                if e=d then f:=true;

             end;

             check:=f;

            end;

 

           BEGIN

           writeln('input n,d');

           read(a,b);

           writeln(check(a,b));

         END.

练习编写一个函数,返回布尔值判别输入三个字符是按序或无序排列。程序中若输入abc则显示顺序排列,若输入cba则显示逆序排列,其他情况显示无序排列,当输入***程序结束。