第二节 过程
过程和函数一样,也是子程序。一个过程对应一个需要完成的任务。PASCAL中提供了不少 标准过程,如:READ,WRITE,GET,NEW,PUT......这些标准过程在程序中可以直接调 用。但仅仅这些标准过程还不能满足我们的需要,我们还要自己定义过程,就象函数一样。但函 数必须以值的形式返回,而过程不一定返回一个值,只是执行一个任务而已;函数只能返回一个 值,而过程可以返回不止一个值。所以函数不能取代过程。
2.1 过程的定义
过程定义的格式如下:
PROCEDURE 过程名(形式参数);
V AR 过程的变量说明;
BEGIN
过程体
END;
对该格式说明如下:一个过程也分为三部分:
1:过程的首部。过程必须以 PROCEDURE 开头,过程名的取名规则和函数名一样,括号
” 里面是形式参数,如形参不止一种,则中间用“;
”隔开,同类形参如不止一个,则中间用“, 隔开。另:有时侯过程不用加参数。
2:过程的说明部分,用 V AR 开头,它只能对过程中的变量进行说明,同样是局部变量。另: 如果过程不用变量,则可将说明部分省略。
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;
该过程就没有参数,直接执行打印一个固定矩阵的任务,而且也没返回值。
例 1、定义一个求 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、定义过程 fa 求N!。
var x:integer ; t:real ;
procedure fa(n:integer);
var k:integer;
begin
t:=1;
for k:=2 to n do
t:=t*k;
end;
begin
read(x) ;
fa(x);
writeln( x:5 , t:8) ;
end.
这里通过全程变量 T,将过程中计算结果传递到 T 变量中。Fa(x)仅仅作为程序中的一条命 令被执行。
2.2 过程的调用
过程名(<;实参表>);
自定义过程在程序调用之前要先说明, 过程的说明就在主程序的执行语句之前。 其格式如下: PROGRAM 程序名(INPUT,OUTPUT);
V AR 主程序的变量说明;
PROCEDURE 过程名(形式参数表);
V AR 过程的变量说明;
BEGIN
过程体
END;
BEGIN
主程序体 {过程调用的地方}
END.
例 3、任意输入 10 个三角形的三边,用过程把其面积求出。
我们把求一个已知三边的三角形的面积定义一个过程,对比一下和例 5 有什么不同。
V AR 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*(da1)*(da2)*(da3));
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!的问题我们在例 1 已写出来,但阶乘的结果是在过程里用WRITE 语句输出的,不能 用累加语句把结果求出来。那么,怎样用过程将类似的问题求出来?这就得用到变量形参。
2.3 变量形参
在过程定义的语句中,有个参数表, 在参数表中,除了前面我们已用的形参,还有变量形参。 变量形参的作用是:它可以作为过程的出口参数。我们可以把过程中求出的结果用变量形参输出 到过程外,在过程外面可以调用该参数。其格式上的区别是在变量形参前加上 V AR 即可。
那么我们现在来求 1!+2!+3!+...+10!=?pascal语言难学吗
例 4、
V AR 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。于是,在过程中和主程 序中都可以用该变量了。
。
例 5、任意输入一个整数,将它变成字符串输出。如:输入数 34567,打印出字符“34567” 要求用过程的方法实现。
var i,k:integer; s:string;
PROCEDURE n_c(n:integer;var s:string);
var l:inTeger;
begin
l:=abs(n); s:=’’;
repeat
s:=chr((l mod 10) +ord(’0’))+s; l:=l div 10;
until l=0;
if n <0 then s:=’’+s;
end;
BEGIN
for i:=1 to 10 do
begin
writeln(’input k’); readln(k);
n_c(k,s); writeln(’the string is:’,s);
end;
END.
2.4 值形参与变量形参
(1)值形参:在函数或过程定义中,没有加 V AR 说明的参数,在调用函数或过程时,调 用程序将实参的值直接传递给形参,起着赋值作用。
(2)变量形参:在函数或过程定义中,加有 V AR 说明的参数,在调用函数或过程时,调 用程序将实参的变量地址传递给变量形参,因此当过程或函数处理中,改变变量形参的值,则实 参的变量值也随之改变。(共享同一个存储单元)
例如下列程序中的参数传递:
V ar x,n:integer;
procedure chan(x:integer;var y:integer);
begin
x:=x+5; y:=y+5;
writeln(’x=’ ,x, ’y=’ ,y); {语句②}
end;
BEGIN {主程序}
x:=10; n:=10;
writeln(’x=’ ,x, ’n=’ ,n); {语句①}
chan(x,n);
writeln(’x=’ ,x, ’n=’ ,n); {语句③}
END.
运行结果:
x=10 n=10 {语句①的结果}
x=15 y=15 {语句②的结果}
x=10 n=15 {语句③的结果}
过程 chan 中定义了值形参 x 和变量形参 y。在调用过程时,值形参 x 接受实参的值 10,然 后将它加 5,但是值形参值的改变并不影响主程序中实参的值(数值传递),所以返回主程序后, 输出实参 x 的值仍为10,可见,实参 x和值形参 x是两个不同的变量。
y 为变量形参,对于变量形参的操作实际上就是对相应实参 n 的操作(共享存储地址)。y 的初值为 10,调用过程后,值为 15,返回主程序时,值 15 被带回主程序,故 n也为 15。
例 6、将实数 x 拆分为整数部分 n和小数部分 p。
var a1,a2,d1,d2:real; z1,z2:integer;
procedure fen(x:real;var n:integer;var p:real);
begin
n:=trunc(x);{n是整数部分}
p:=xn; {p是小数部分}
end;
begin {主程序}
write(’input a1,a2: ’);readln(a1,a2);
fen(a1,z1,d1); writeln(a1:8:3,z1:8,d1:8:3);
fen(a2,z2,d2); writeln(a2:8:3,z2:8,d2:8:3);
end.
运行结果:
input a1,a2:12.87 345.769
12.87 12 0.870
345.769 345 0.769
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论