Pascal - 过程

过程是子程序,它们不返回单个值,而是允许获取一组结果。

定义过程

在 Pascal 中,过程是使用 procedure 关键字定义的。 过程定义的一般形式如下 −

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

Pascal 中的过程定义由过程的标头、局部声明主体组成。 过程标头由关键字procedure 和给定过程的名称组成。 以下是过程的所有部分 −

  • 参数 − 参数建立调用程序和过程标识符之间的链接,也称为形式参数。 过程中的参数规则与函数中的参数规则相同。

  • 局部声明 − 局部声明是指标签、常量、变量、函数和过程的声明,仅适用于过程体。

  • 程序主体 − 过程主体包含定义过程功能的语句集合。 它应始终包含在保留字 begin 和 end 之间。 它是完成所有计算的过程的一部分。

以下是名为 findMin() 的过程的源代码。 此过程采用 4 个参数 x、y、z 和 m,并将前三个变量中的最小值存储在名为 m 的变量中。 变量 m 通过引用传递(稍后我们将讨论通过引用传递参数) −

procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m := x
   else
      m := y;
   
   if z <m then
      m := z;
end; { end of procedure findMin }  

过程声明

过程声明告诉编译器过程名称以及如何调用该过程。 程序的实际主体可以单独定义。

过程声明具有以下语法 −

procedure name(argument(s): type1, argument(s): type 2, ... );

请注意,过程名称不与任何类型关联。 对于上面定义的过程findMin(),以下是声明 −

procedure findMin(x, y, z: integer; var m: integer);

调用过程

创建过程时,您需要定义该过程必须执行的操作。 要使用该过程,您必须调用该过程来执行定义的任务。 当程序调用过程时,程序控制权将转移到被调用的过程。 被调用的过程执行定义的任务,当到达其最后一个结束语句时,它将控制权返回给调用程序。

要调用过程,您只需传递所需的参数以及过程名称,如下所示 −

program exProcedure;
var
   a, b, c,  min: integer;
procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m:= x
   else
      m:= y;
   
   if z < m then
      m:= z;
end; { end of procedure findMin }  

begin
   writeln(' Enter three numbers: ');
   readln( a, b, c);
   findMin(a, b, c, min); (* Procedure call *)
   
   writeln(' Minimum: ', min);
end.

当上面的代码被编译并执行时,会产生以下结果 −

Enter three numbers:
89 45 67
Minimum: 45

递归子程序

我们已经看到一个程序或子程序可以调用另一个子程序。 当子程序调用自身时,称为递归调用,该过程称为递归。

为了说明这个概念,让我们计算一个数字的阶乘。 数字 n 的阶乘定义为 −

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

以下程序通过递归调用自身来计算给定数字的阶乘。

program exRecursion;
var
   num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)

begin
   if x=0 then
      fact := 1
   else
      fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}

begin
   writeln(' Enter a number: ');
   readln(num);
   f := fact(num);
   
   writeln(' Factorial ', num, ' is: ' , f);
end.

当上面的代码被编译并执行时,会产生以下结果 −

Enter a number:
5
Factorial 5 is: 120

下面是另一个示例,它使用递归函数为给定数字生成斐波那契数列

program recursiveFibonacci;
var
   i: integer;
function fibonacci(n: integer): integer;

begin
   if n=1 then
      fibonacci := 0
   
   else if n=2 then
      fibonacci := 1
   
   else
      fibonacci := fibonacci(n-1) + fibonacci(n-2);
end; 

begin
   for i:= 1 to 10 do
   
   write(fibonacci (i), '  ');
end.

当上面的代码被编译并执行时,会产生以下结果 −

0 1 1 2	3 5 8 13 21 34

子程序的参数

如果子程序(函数或过程)要使用参数,则它必须声明接受参数值的变量。 这些变量称为子程序的形式参数

形式参数的行为与子程序内的其他局部变量类似,在进入子程序时创建并在退出时销毁。

调用子程序时,有两种方法可以将参数传递给子程序 −

Sr.No 调用类型和说明
1 按值调用

此方法将参数的实际值复制到子程序的形式参数中。 在这种情况下,对子程序内的参数进行的更改不会影响参数。

2 通过引用调用

此方法将参数的地址复制到形式参数中。 在子程序内部,该地址用于访问调用中使用的实际参数。 这意味着对参数所做的更改会影响参数。

默认情况下,Pascal 使用按值调用来传递参数。 一般来说,这意味着子程序中的代码不能更改用于调用子程序的参数。 我们在"Pascal - 函数"一章中使用的示例程序使用按值调用调用名为 max() 的函数。

然而,此处提供的示例程序 (exProcedure) 使用通过引用调用来调用过程 findMin()。