过程和函数.docx
- 文档编号:26596199
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:12
- 大小:20.46KB
过程和函数.docx
《过程和函数.docx》由会员分享,可在线阅读,更多相关《过程和函数.docx(12页珍藏版)》请在冰豆网上搜索。
过程和函数
WebBrowser如何控制Frame下面的元素
PASCAL语言提供了大量的标准函数及标准过程供我们直接使用,但有时我们也会用到非标准的函数或过程,尤其是在做递归、回溯、搜索问题时,使用PASCAL语言的自定义函数、过程功能,与BASIC相比,能帮我们节省至少一半以上的时间。
同样一个搜索问题,用BASIC语言如果要2个小时编出程序,用PASCAL语言就可能不要1个小时。
主要作用在于使程序结构清晰,养成模块化解决问题的习惯。
当然也可以用在解决循环、递归方面的一些问题。
函数
PASCAL给我们提供了一些标准函数,我们不用了解这些函数如何求出来的,只管直接调用它们,挺方便的。
如正弦函数,余弦函数,算术平方根......有了这些函数,我们觉得很省事。
如:
求SIN
(1)+SIN
(2)+...+SIN(100)=?
这个程序我们可以这样编写:
例1
PROGRAM e1(input,output);
VARi:
integer;
s:
real;
BEGIN
s:
=0;
fori:
=1to100do
s:
=s+sin(i);
writeln('s=',s);
END.
在这个程序里,我们直接用到了正弦函数,至于SIN
(1),SIN
(2)如何求出来的我们不需过问,只管直接用它的结果便是了。
我们来看看下面一个例子:
求:
1!
+2!
+3!
+...+10!
=?
如果要编写程序,我们看到求阶乘的操作要执行10次,只不过每次所求的数不同。
我们想:
不至于编写10遍求阶乘的程序吧。
我们希望有一个求阶乘的函数,假设为JS(X),那么我们就可以这样求这道题了:
例2
PROGRAMe1(input,output);
VARi:
integer;
s:
real;
BEGIN
s:
=0;
fori:
=1to10do
s:
=s+js(i);
writeln('s=',s);
END.
现在的问题是:
TURBOPASCAL没提供JS(X)这样一个标准函数,这个程序是通不过的。
如果是PASCAL的标准函数,我们可以直接调用,如TRUNC(X),LN(X),SQRT(X)......而PASCAL提供给我们的可供直接调用的标准函数不多。
没关系,我们编写自己的函数!
∙函数的编写
自己编写一个函数,它的格式如下:
FUNCTION函数名(形式参数表):
函数类型;
VAR函数的变量说明;
BEGIN
函数体
END;
我们来分析一下,一个函数的编写可分成三部份:
一是函数首部,即第一个语句。
它必须以FUNCTION开头,函数名是自己取的,取名的原则是便于记忆,和文件名的取名规则类似。
形式参数(简称形参)表以标识符的形式给出,相当于函数中的自变量。
参数可以有多个,也可以有多种类型。
不同类型的参数之间用“;”隔开,同类型的参数如有多个,则用“,”隔开,在其后得加上说明。
如:
FUNCTIONA1(A,B,C:
INTEGER;D,E,F:
REAL):
REAL;
在最后,函数属于哪种类型,还得表示出来。
在本例中,该函数为实型。
第二部分是函数的变量说明部分,对在本函数中将要用到的变量作类型说明,这一点和以前学的变量一样。
如果程序不用变量,则此部分也可省掉。
第三部分是函数体,本函数的功能实现就在于此,编写的语句就在里面。
例3编写一求阶乘的函数。
我们给此函数取一名字就叫JS。
fUNCTIONjs(n:
integer):
longint;
vari:
integer;
s:
longint;
begin
s:
=1;
fori:
=1tondo
s:
=s*i;
js:
=s;
end;
在本例中,函数名叫JS,只有一个INTEGER型的自变量N,函数JS属LONGINT型。
在本函数中,要用到两个变量I,S,在VAR后已加以说明。
在函数体中,是一个求阶乘的语句,但有一点要注意:
虽然N的阶乘的值在S中,但最后必须将此值赋给函数JS,此时JS不带任何参数。
在任何函数中,最后都要把最终结果赋给函数名,因为该函数的结果是靠函数名返回的。
在这里,函数的参数N是一个接口参数,说得更明确点是入口参数。
如果我们调用函数:
JS(3),那么在程序里所有有N的地方N被替代成3来计算。
在这里,3就被称为值参。
又如:
SQRT(4),LN(5),这里的4,5叫值参。
而SQRT(X),LN(Y)中的X,Y叫形参。
∙函数的调用
自定义的函数在调用前要先说明,在主程序中的位置如下:
PROGRAM程序名(INPUT,OUTPUT);
VAR主程序变量说明;
FOUNCTION函数名(形参表):
函数类型;
VAR函数变量说明;
BEGIN
函数体
END;{FUNCTION}
BEGIN
主程序
END.{PROGRM}
在主程序中,我们把函数的全部说明放在主程序的变量说明和程序体之间,然后在主程序的执行部分就可以直接调用自定义函数了。
注意:
在函数的说明部分,我们要用形参,但在程序的执行部分调用自定义函数时,就得用值参了。
例4利用前面定义的阶乘函数,求5!
,9!
。
PROGRAMe59(input,outout);
VARa1,a2:
longint;
fUNCTIONjs(n:
integer):
longint;
vari:
integer;
s:
longint;
begin
s:
=1;
fori:
=1tondo
s:
=s*i;
js:
=s;
end;
BEGIN
a1:
=js(5);
a2:
=js(9);
writeln('5!
=',a1,'','9!
=',a2);
END.
在这个程序中,在主程序的BEGIN之前,我们对函数进行了一次说明,在后面的程序中都可以象标准函数那样直接调用自定义函数了。
在FUNCTION语句中,用的是形参N,在主程序调用中,调用函数是用的值参,如:
JS(5);程序执行到这儿会自动将5代入前面的FUNCTION函数中,用5取代所有的N,最终将结果赋值给JS。
所以在A1中一定是5!
,A2中是9!
。
另外,函数不能单独使用,一定要结合主程序才能运行。
如果是求1!
+2!
+3!
+...+10!
,则只需把主程序改成:
A1:
=0;
FORJ:
=10TO10DO
A1:
=A1+JS(J);
WRITELN(A1);
在例4中,主程序的变量A1,A2叫全程变量,它们除了主程序外,还可以在函数中出现;在函数说明中用到的变量I,S则是局部变量,只能在函数部分使用,一旦出了函数则失去意义;别外要注意:
全程变量和局部变量尽量不要同名。
例5任意输入10组三角形的三边,求其面积。
已知三角形的三边,是可以求出面积的。
我们可以定义一个已知三角形三边求其面积的函数,设为AREA(a1,a2,a3)。
PROGRAMe5(inmput,output);
VARa,b,c,s:
real;
i:
integer;
FUNCTION area(a1,a2,a3:
real):
real;
vars1,d:
real;
begin
d:
=(a1+a2+a3)/2;
s1:
=Sqrt(d*(d-a1)*(d-a2)*(d-a3));
area:
=s1;
end;
BEGIN
fori:
=1to10do
begin
writeln('inputa,b,c');
readln(a,b,c);
if (a+b<=c)or(a+c<=b)or(b+c<=a)
thenwriteln('dataerror!
')
elsewriteln('s=',area(a,b,c));
end;
END.
在函数说明中,如果形参的个数不止一个,那么在程序中调用函数的实参个数一定要与形参的个数一致,第一个实参对应第一个形参,第二个实参对应第二个形参......次序不能调。
例6定义一个函数CHECK(N,D),让它返回一个布尔值。
如果数字D在整数N的某位中出现则送回TRUE,否则送回FALSE。
例如:
CHECK(325719,3)=TRUE;
CHECK(77829,1)=FALSE;
PROGRAMe6(input,output);
VARa,b:
integer;
FUNCTIONcheck(n,d:
integer):
boolean;
varf:
boolean;
e:
integer;
begin
f:
=false;
while(n>0)and(notf)do
begin
e:
=nmod10;
n:
=ndiv10;
ife=dthenf:
=true;
end;
check:
=f;
end;
BEGIN
writeln('inputn,d');
read(a,b);
writeln(check(a,b));
END.
练习:
编写一个函数,返回布尔值判别输入三个字符是按序或无序排列。
程序中若输入abc则显示顺序排列,若输入cba则显示逆序排列,其他情况显示无序排列,当输入***程序结束。
过程
过程和函数一样,也是子程序。
一个过程对应一个需要完成的任务。
PASCAL中提供了不少标准过程,如:
READ,WRITE,GET,NEW,PUT......这些标准过程在程序中可以直接调用。
但仅仅这些标准过程还不能满足我们的需要,我们还要自己定义过程,就象函数一样。
但函数必须以值的形式返回,而过程不一定返回一个值,只是执行一个任务而已;函数只能返回一个值,而过程可以返回不止一个值。
所以函数不能取代过程。
2.2 过程的定义
过程定义的格式如下:
PROCEDURE 过程名(形式参数);
VAR 过程的变量说明;
BEGIN
过程体
END;
对该格式说明如下:
一个过程也分为三部分,1:
过程的首部。
过程必须以PROCEDURE开头,过程名的取名规则和函数名一样,括号里面是形式参数,如形参不止一种,则中间用“;”隔开,同类形参如不止一个,则中间用“,”隔开。
另:
有时侯过程不用加参数。
2:
过程的说明部分,用VAR开头,它只能对过程中的变量进行说明,同样是局部变量。
另:
如果过程不用变量,则可将说明部分省略。
3:
过程体。
它是过程的执行部分。
我们来定义一个打印由“*”组成的矩阵的过程,该矩阵四行五列。
例7
PROCEDUREprint;
vari,j:
integer;
begin
fori:
=1to4do
begin
forj:
=1to5do
write('*');
writeln;
end;
end;
该过程就没有参数,直接执行打印一个固定矩阵的任务,而且也没返回值。
例7 定义一个求N!
的过程。
PROCEDURE js(n:
integer);
vars:
longint;
i:
integer;
begin
s:
=1;
fori:
=1tondo
s:
=s*i;
writeln(n,'!
=',s);
end.
在该过程中,它的值的返回形式和函数不一样:
函数是由函数名返回,而过程不是由函数名返回的;在过程的首部不用对过程的类型进行说明。
2.3 过程的调用
自定义过程在程序调用之前要先说明,过程的说明就在主程序的执行语句之前。
其格式如下:
PROGRAM 程序名(INPUT,OUTPUT);
VAR 主程序的变量说明;
PROCEDURE 过程名(形式参数表功;
VAR 过程的变量说明;
BEGIN
过程体
END;
BEGIN
主程序体
END.
例8 任意输入10个三角形的三边,用过程把其面积求出。
我们把求一个已知三边的三角形的面积定义一个过程,对比一下和例5有什么不同。
PROGRAMe5(inmput,output);
VARa,b,c,s:
real;
i:
integer;
子程序中的参数
∙形参和实参
子程序调用(过程调用或函数调用)的执行顺序分为以下几步:
实参和形参结合——〉执行子程序——〉返回调用处继续执行
子程序说明的形式参数表对子程序体直接引用的变量进行说明,详细指明这些参数的类别、数据类型要求和参数的个数。
子程序被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求
TurboPascal子程序形参有四类:
1.值参数
形式参数表中前面没有var,后有类型的参数。
它类似过程和函数的局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。
在调用过程或应用函数时,值参数所对应的实际参数必须是表达式,而且它的值不能使文件类型或包括文件类型的值。
实参必须和形参赋值相容。
2.变量参数
形式参数表中前面有var后由类型的参数。
如果需要子程序向调用程序返回值时,应采用变量参数。
变量参数要求它的实参是和它同一类型的变量。
因为在子程序执行时,遇到对相应形参的引用式定值,就是对相应实参的引用式定值,即对形参的任何操作就是对实参本身的操作。
3.无类型变量参数
形式参数表中前面有var而后面没有类型的参数。
形参是无类型变量,对应的实参允许为任意类型的变量,但要在子程序中设置的强制类型转换(类型名(无类型变量参数名)),将无类型变量参数改变为相应类型。
4.子程序参数
用过程首部或函数首部作为形式参数。
∙标识符的作用域
1.全局变量和它的作用域
全局变量是指在程序开头的说明部分定义和说明的量。
它的作用域分为两种情况:
(1)在全局变量和局部变量不同名时,其作用域是整个程序。
(2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。
2.局部变量和它的作用域
凡是在子程序内部使用的变量,必须在子程序中加入说明。
这种在子程序内部说明的变量称为局部变量。
局部变量的作用域是其所在的子程序。
形式参数也只能在子程序中有效。
因此也属于局部变量。
局部变量的作用域分为两种情况:
(1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过琛。
(2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域不包含此过程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 过程 函数