- 帕斯卡教程
- 帕斯卡 - 主页
- 帕斯卡 - 概述
- Pascal - 环境设置
- 帕斯卡 - 程序结构
- Pascal - 基本语法
- Pascal - 数据类型
- Pascal - 变量类型
- 帕斯卡 - 常数
- 帕斯卡 - 运算符
- 帕斯卡 - 决策
- 帕斯卡 - 循环
- 帕斯卡 - 函数
- 帕斯卡 - 程序
- 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
子程序的参数
如果子程序(函数或过程)要使用参数,则它必须声明接受参数值的变量。这些变量称为子程序的形式参数。
形式参数的Behave与子程序内的其他局部变量类似,在进入子程序时创建并在退出时销毁。
调用子程序时,有两种方法可以将参数传递给子程序 -
先生编号 | 呼叫类型和描述 |
---|---|
1 |
按值调用
该方法将参数的实际值复制到子程序的形式参数中。在这种情况下,对子程序内的参数进行的更改不会对参数产生影响。 |
2 |
通过参考调用
此方法将参数的地址复制到形式参数中。在子程序内部,该地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响参数。 |
默认情况下,Pascal 使用按值调用来传递参数。一般来说,这意味着子程序中的代码不能更改用于调用子程序的参数。我们在“Pascal - 函数”一章中使用的示例程序使用call by value调用名为 max() 的函数。
然而,此处提供的示例程序 ( exProcedure ) 使用引用调用来调用过程 findMin() 。