函数和过程

来源:互联网 发布:js事件驱动模型 编辑:程序博客网 时间:2024/05/14 04:04
PASCAL 给我们提供了一些标准函数,我们不用了解这些函数如何求出来的,只管直接调用它们,挺
方便的。如正弦函数,余弦函数,算术平方根......有了这些函数,我们觉得很省事。
但是对于求下面式子:
1!+2!+3!+...+10!=?

2^7+3^8+4^9=?

函数的编写:

FUNCTION 函数名(形式参数表):函数类型;
VAR 函数的变量说明;
BEGIN
函数体
END;

一个函数的编写可分成三部份:

一是函数首部,即第一个语句。它必须以FUNCTION开头,函数名是自己取的,取名的原则是便于记忆,和文件名的取名规则类似。形式参数(简称形参)表以标识符的形式给出,相当于函数中的自变量。参数可以有多个,也可以有多种类型。不同类型的参数之间用“;”隔开,同类型的参数如有多个,则用“,”隔开,在其后得加上说明。如:
FUNCTION A1(A,B,C:INTEGER;D,E,F:REAL):REAL;
在最后,函数属于哪种类型,还得表示出来。在本例中,该函数为实型。

二是函数的变量说明部分,对在本函数中将要用到的变量作类型说明,这一点和以前学的变量一样。如果程序不用变量,则此部分也可省掉。

三是函数体,本函数的功能实现就在于此,编写的语句就在里面。


编写一求阶乘的函数

FUNCTION js(n:integer):longint;
var i:integer;
s:longint;
begin
s:=1;
for i:=1 to n do
s:=s*i;
js:=s;
end;

函数的调用

PROGRAM 程序名(INPUT,OUTPUT);
VAR 主程序变量说明;


FOUNCTION 函数名(形参表):函数类型;
VAR 函数变量说明;
BEGIN
  函数体
END;{FUNCTION}


BEGIN
  主程序
END .{PROGRM}


在主程序中,我们把函数的全部说明放在主程序的变量说明和程序体之间,然后在主程序的执行部分就可以直接调用自定义函数了。注意:在函数的说明部分,要用形参,但在程序的执行部分调用自定义函数时,就得用实参了。

定义的阶乘函数,求5!,9!

program functionsample;
var a1,a2:longint;
function js(n:integer):longint;
var i:integer;s:longint;
begin
s:=1;
for i:=1 to n do
s:=s*i;
js:=s;
end;
begin
a1:=js(5);
a2:=js(9);
writeln(’5!=’,a1,’ ’,’9!=’,a2);
end.


在FUNCTION语句中,用的是形参N,在主程序调用中,调用函数是用的实参,如:JS(5);

在函数说明中用到的变量I,S则是局部变量,只能在函数部分使用,一旦出了函数则失去意义

函数不能单独使用,一定要结合主程序才能运行。


过程

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

过程的定义

PROCEDURE 过程名(形式参数);
VAR 过程的变量说明;
BEGIN
过程体
END;


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

过程的调用

program 程序名;
var 主程序的变量说明;
procedure 过程名(形式参数表);
var 过程的变量说明;
begin
  过程体
end;
begin
  主程序体
end.


定义一个打印由“*”组成的矩阵的过程,该矩阵四行五列。
procedure print;
var i,j:integer;
begin
for i:=1 to 4 do
begin
for j:=1 to 5 do write(’*’);
writeln;
end;
end;


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

定义过程fa求N!‘program exp7_5 ;
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;


函数与过程的区别

1、函数不能作为独立的一个语句使用,而过程可以。


2、函数的值是由函数名返回的,而过程不能

变量形参

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

求1!+2!+3!+...+n!

program e9;
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。于是,在过程中和主程序中都可以用该变量了。


形参与变量形参

(1)形参:在函数或过程定义中,没有加VAR 说明的参数,在调用函数或过程时,调用程序将实参的值直接传递给形参,起着赋值作用。
(2)变量形参:在函数或过程定义中,加有VAR 说明的参数,在调用函数或过程时,调用程序将实参的变量地址传递给变量形参,因此当过程或函数处理中,改变变量形参的值,则实参的变量值也随之改变。(共享同一个存储单元)


测试

program p7_13(input,output);
Var  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.


过程chan中定义了形参x和变量形参y。在调用过程时,形参x接受实参的值10,然后将它加5,但是形参值的改变并不影响主程序中实参的值(数值传递),所以返回主程序后,输出实参x 的值仍为10,可见,实参x和形参x是两个不同的变量。y为变量形参,对于变量形参的操作实际上就是对相应实参n的操作(共享存储地址)。y的初值为10,调用过程后,值为15,返回主程序时,值15被带回主程序,故n也为15。

定义一个过程,实现将实数x拆分为整数部分n和小数部分p,在主程序输出。


小结形参和变量形参

①形参传值:为形参分配存贮单元,将实参的值赋给形参,过程体内对形参的操作不影响实参的值。一旦过程体执行完毕,系统将收回形参所占用的存贮单元,形参的值也就不复存在。
②变量形参传地址:将实参的地址传给对应的变量形参,即变量形参与实参共享实参的地址,因此对变量形参的操作就是对实参的操作。一旦过程体执行完毕,系统将收回变量形参所占用的存贮单元,但运算结果已保留在对应的实参中。

变量及其作用域

全程变量:主程序中被说明的变量。
局部变量:在过程或函数中被说明的变量。
在程序中,局部变量、全程变量进行存取的适用范围是不一样的,即作用域不一样。
局部变量的作用域是它们所在的子程序。因形式参数也只在子程序中有效,因此也属于局部变量。
对于局部变量的作用域可以这样理解:当局部变量所在子程序被调用时,局部变量才被分配有效的存储单元;当返回调用程序时,局部变量所占的存储单元就被释放。
全程变量的作用域分为两种情况:
①在全程变量和局部变量不同名时,其作用域是整个程序。
②在全程变量和局部变量同名时,局部变量屏蔽了全程变量。


Program p7_10(input,output);
var
m:integer; {m为全程变量}
procedure test2;
var m:integer; {定义m为局部变量}
begin
m:=100;
end;
begin {主程序}
m:=5;
writeln(’Before the test2 call,the m is:’,m);{输出过程调用前的m值}
test2; {调用过程test2}
writeln(’After the test2 call,the m is:’,m); {输出过程调用后的m值}
end.


函数和过程的区别

1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。
2、函数中一般不用变量形参,用函数名直接返回函数值;而过程如有返回值,则必须用变量形参返回。
3、过程无类型,不能给过程名赋值;函数有类型,最终要将函数值传送给函数名。
4、函数在定义时一定要进行函数的类型说明,过程则不进行过程的类型说明。
5、调用方式不同。函数的调用出现在表达式中,过程调用,由独立的过程调用语句来完成。
6、过程一般会被设计成求若干个运算结果,完成一系列的数据处理,或与计算无关的各种操作;而函数往往只为了求得一个函数值。


具体教程:http://download.csdn.net/download/boyxiejunboy/8913279(不用积分哦)

0 0
原创粉丝点击