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

PASCAL第十七讲:过程

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

过程
过程和函数一样,也是子程序。一个过程对应一个需要完成的任务。PASCAL中提供了不少标准过程,如:READ,WRITE,GET,NEW,PUT......这些标准过程在程序中可以直接调用。但仅仅这些标准过程还不能满足我们的需要,我们还要自己定义过程,就象函数一样。但函数必须以值的形式返回,而过程不一定返回一个值,只是执行一个任务而已;函数只能返回一个值,而过程可以返回不止一个值。所以函数不能取代过程。

 

2.2  过程的定义

    过程定义的格式如下:

    PROCEDURE  过程名(形式参数);

      VAR  过程的变量说明;

       BEGIN

        过程体

       END;

     对该格式说明如下:

   一个过程也分为三部分,1:过程的首部。过程必须以PROCEDURE开头,过程名的取名规则和函数名一样,括号里面是形式参数,如形参不止一种,则中间用“;”隔开,同类形参如不止一个,则中间用“,”隔开。另:有时侯过程不用加参数。2:过程的说明部分,用VAR开头,它只能对过程中的变量进行说明,同样是局部变量。另:如果过程不用变量,则可将说明部分省略。3:过程体。它是过程的执行部分。

      我们来定义一个打印由“*”组成的矩阵的过程,该矩阵四行五列。

      例7

              PROCEDURE print;

                 var i,j:integer;

                 begin

                  for i:=1 to 4 do

                    begin

                     for j:=1 to 5 do

                       write('*');

                       writeln;

                     end;

                  end;

    该过程就没有参数,直接执行打印一个固定矩阵的任务,而且也没返回值。

例7            定义一个求N!的过程。

            PROCEDURE  js(n:integer);

             var s:longint;

                 i:integer;

              begin

                s:=1;

                for i:=1 to n do

                 s:=s*i;

                writeln(n,'!=',s);

              end.

 

   在该过程中,它的值的返回形式和函数不一样:函数是由函数名返回,而过程不是由函数名返回的;在过程的首部不用对过程的类型进行说明。

      

    2.3  过程的调用

        自定义过程在程序调用之前要先说明,过程的说明就在主程序的执行语句之前。其格式如下:

        PROGRAM  程序名(INPUT,OUTPUT);

          VAR  主程序的变量说明;

          

            PROCEDURE  过程名(形式参数表功;

                VAR  过程的变量说明;

                 BEGIN

                  过程体

                  END;

 

             BEGIN

                主程序体

             END.

 

例8    任意输入10个三角形的三边,用过程把其面积求出。

我们把求一个已知三边的三角形的面积定义一个过程,对比一下和例5有什么不同。

                  PROGRAM e5(inmput,output);

                     VAR a,b,c,s:real;

                         i:integer;

 

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

                          var s1,d:real;

                          begin

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

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

                           writeln('s=',s1);

                           end;

 

                       BEGIN

                         for i:=1 to 10 do

                         begin

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

                         readln(a,b,c);

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

                                then writeln('data error!')

                                else area(a,b,c);

                         end;

                       END.

 我们看到:过程的调用和函数不同。函数不能作为独立的一个语句使用,而过程可以。函数的值是由函数名返回的,而过程不能。

  现在我们提出一个要求:用过程求出1!+2!+3!+...+10!=?
  求N!的问题我们在例7已写出来,但阶乘的结果是在过程里用WRITE语句输出的,不能用累加语句把结果求出来。那么,怎样用过程将类似的问题求出来?这就得用到变量参数。

 

2.4  变量参数
   在过程定义的语句中,有个参数表,在参数表中,除了前面我们已用的值参,还有变量参数。变量参数的作用是:它可以作为过程的出口参数。我们可以把过程中求出的结果用变量参数输出到过程外,在过程外面可以调用该参数,因此,该参数是全局变量。其格式上的区别是在变量参数前加上VAR即可。

那么我们现在来求1!+2!+3!+...+10!=?

例9

            PROGRAM  e9(input,output);

              VAR j:integer;

                  s,m:longint;

 

              PROCEDURE js(n:integer;var m:longint);

                var i:integer;

                begin

                  m:=1;

                  for i:=1 to n do

                    m:=m*i;

                end;

 

              BEGIN

                s:=0;

                for j:=1 to 10 do

                  begin

                    js(j,m);

                    s:=s+m;

                  end;

                writeln('s=',s);

             END.

 

      在本例中。我们看到,过程JS中用到了变量参数M,在过程中定义为LONGINT类型;而在主程序的变量说明中也得对变量参数M说明为同种类型LONGINGT。于是,在过程中和主程序中都可以用该变量了。我们在调用这类过程时,在括号中要写上所有的参数,但用不着写上参数的类型和VAR了。

练习
1、某部队举行一次军事演习,A、B两队约好在同一时间从相距100公里的各自驻地出发相向运动。A队的速度为10公里/小时,B队的速度为8公里/小时。一通讯员骑马从A地同时出发为行进中的两队传递消息,速度为60公里/小时。每遇一队立即折回驶向另一队,当两队距离小于0.5公里时,停下来不再传递消息。求此时通讯员跑了多少趟(从一队到另一队为一趟)?

2、已知二个合数A=18和B=96,键入N个[10,400]之间的自然数,求这N个数中所有合数与A、B的最大公约数。