- Pascal 教程
- Pascal - 首页
- Pascal - 概述
- Pascal - 环境设置
- Pascal - 程序结构
- Pascal - 基本语法
- Pascal - 数据类型
- Pascal - 变量类型
- Pascal - 常量
- Pascal - 运算符
- Pascal - 决策
- Pascal - 循环
- Pascal - 函数
- Pascal - 过程
- Pascal - 变量作用域
- Pascal - 字符串
- Pascal - 布尔值
- Pascal - 数组
- Pascal - 指针
- Pascal - 记录
- Pascal - 变体
- Pascal - 集合
- Pascal - 文件处理
- Pascal - 内存
- Pascal - 单元
- Pascal - 日期和时间
- Pascal - 对象
- Pascal - 类
- 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);
调用过程
在创建过程时,您会给出过程必须执行的操作的定义。要使用该过程,您必须调用该过程来执行定义的任务。当程序调用过程时,程序控制将转移到被调用过程。被调用的过程执行定义的任务,当到达其最后一个end语句时,它将控制返回给调用程序。
要调用过程,您只需将所需的参数与过程名称一起传递,如下所示:
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
子程序的参数
如果子程序(函数或过程)要使用参数,它必须声明接受参数值的变量。这些变量称为子程序的形式参数。
形式参数在子程序内部的行为类似于其他局部变量,并在进入子程序时创建,并在退出时销毁。
调用子程序时,参数可以通过两种方式传递给子程序:
| 序号 | 调用类型和描述 |
|---|---|
| 1 |
按值调用
此方法将参数的实际值复制到子程序的形式参数中。在这种情况下,对子程序内参数所做的更改不会影响参数。 |
| 2 |
按引用调用
此方法将参数的地址复制到形式参数中。在子程序内部,该地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响参数。 |
默认情况下,Pascal 使用按值调用传递参数。一般来说,这意味着子程序内的代码无法更改用于调用子程序的参数。“Pascal - 函数”一章中使用的示例程序使用按值调用调用名为max()的函数。
而此处提供的示例程序(exProcedure)使用按引用调用调用过程findMin()。