180 likes | 365 Views
函数的定义. function 函数名 ( 形式参数表 ) :类型标识符; [ 局部变量说明部分 ] begin 语句 ; …… 语句 end ;. 不带形参的函数. Function add2:integer; Var x,y,sum:integer; Begin readln(x,y); sum:=x+y; add2:=sum; End;. 带形参的函数例子. Function add1 (x,y:integer) :integer; Var sum:integer; Begin
E N D
函数的定义 • function 函数名(形式参数表):类型标识符; • [局部变量说明部分] • begin • 语句; • …… • 语句 • end;
不带形参的函数 • Function add2:integer; • Var x,y,sum:integer; • Begin • readln(x,y); • sum:=x+y; • add2:=sum; • End;
带形参的函数例子 • Function add1(x,y:integer):integer; • Var sum:integer; • Begin • sum:=x+y; • add1:=sum; • End;
函数的调用和执行 • Program e1; • Var x,y:integer; • Function add(i,j:integer):integer; • Begin • add:=i+j; • End; • Function mul(I,j:integer):integer; • Begin • mul:=i*j; • End; • Begin read(x,y); writeln(add(x,y)); writeln(mul(x,y)); end. i和j相加 两数相乘
二、过程 1、标准过程:如读语句read( );写语句write( )等 2、自定义过程一般定义形式:课本P81 procedure 过程标识符[(形式参数表)]; [变量说明部分] begin [语句部分] end; 过程首部 过程体 方括号内为可选部分 在过程首部的过程标识符之后若无可选部分, 称为无参过程;否则称为带参过程。 在过程说明中的说明部分可以对过程内使用的常量、变量、行号、类型、过程 和函数进行说明,但它们的作用范围(辖域)只能在过程内,离开过程后,其 所占的内存释放。另外,过程可以通过(形式参数表)与主程序交换信息,即 调用时可以使用不同数据替换这些参数。 过程与程序有相同的块结构形式。
lowterm(n,d); lowterm(n,n/d); lowterm(n+d); procedure fiveline; var i:integer; begin for i:=1 to 5 do writeln end; procedure nlines(n:integer); var i:integer; begin for i:=1 to n do writeln end; 无参过程,输出5个空行 带参过程,输出n个空行 过程调用 过程名[(实在参数表)] 实在参数若有,是用逗号隔开的变量或表达式,他们必须 与形式参数顺序一一对应,个数相同,类型一致,而实参的名 字与形参取名无关 如:procedure lowterm(var n,d:integer); 第二个实参是实型,而对应的形参是整型 实参只有一个
过程调用是一个独立的语句,当执行到该语句时,则将实参中的信息传送过程调用是一个独立的语句,当执行到该语句时,则将实参中的信息传送 给相应的形参(若有的话),然后转去执行过程说明中的语句,执行完毕 后返回到调用位置 例3:定义一个打印由“*”组成的三角形的过程,然后,在主程序中输入行数,并调用该过程输出三角形。 * ** *** **** ***** ******
Procedure sjx(x:integer); Var I,j:integer; Begin for I:=1 to x do begin for j:=1 to I do write(‘*’); writeln; end; End; Var a:integer; Begin read(a); sjx(a); End.
练习1:分别用函数和过程计算S=1/7!+1/9!+1/13! Procedure f(n:integer;var fac:real); var i:integer;k:longint; begin k:=1; for i:=2 to n do k:=k*i; fac:=1/k end; Function f(n:integer):real; var i:integer;k:longint; begin k:=1; for i:=2 to n do k:=k*i; f:=1/k end; Var s:real; begin s:=f(7)+f(9)+f(13); writeln(s) end. Var s1,s2,s3:real; begin f(7,s1); f(9,s2); f(13,s3); s1:=s1+s2+s3; writeln(s1) end.
三、参数传递 例: var x:real;i:integer; procedure change(y:real); begin …… end; 只有change(x)正确 形参有4种:值参数、变量参数、过程参数、函数参数 形式参数表中前无var,后有类型的参数 形式参数表中前有var后有类型的参数 change(sin(x)+0.5); change(1.0); change(x); change(i); 若将过程首部改为:procedure(var y:real);
形参是值参:过程或函数被调用时,系统为每个值参开辟临时形参是值参:过程或函数被调用时,系统为每个值参开辟临时 存储单元,然后将对应实参的值赋给值参。由于值参与实参是 不同的存储单元,所以过程体中对值参的改变不会影响实参, 数据的传送是单向的,当流程返回到调用程序时,值参所占的 存储单元被释放。 形参是变量参数:进入过程体前,系统将实参的存储地址传送 给形参,过程体执行期间,对变量参数的操作就是对相应实参 的操作,从而达到调用函数与被调函数之间互相传送数据的目 的。 参考课本P84-P86
例 Program transmit; var a,b:integer; procedure p(var x:integer;y:integer); begin x:=x+5; y:=y+5; writeln(‘x=‘,x,’y=‘,y) end; begin a:=3;b:=3; p(a,b); p(a,b); writeln(‘a=‘,a,’b=‘,b) end. x=8y=8 x=13y=8 a=13 b=3 阅读课本例6-9P86
Program example; var x,y:integer; procedure change; var x:integer; begin x:=2;y:=2; writeln(x,y) end; begin x:=1;y:=1; writeln(x,y); change; writeln(x,y) end. 四、标识符的作用域 在主程序中说明的常量、类型、变量、过程名等标识符,它们 的作用域是整个程序,故称为全程量。而在过程或函数中说明 的常量、类型、变量、参数以及嵌套在其内的过程名等标识符, 作用域是说明它的过程或函数分程序之内,在之外不能使用, 这些标识符成为局部量。 如果在过程或函数中局部量与全程量(或非局部量)同名,则 阻碍了过程或函数对同名全程量(或非局部量)的访问。 全局量与局部量分析 结果 11 22 12
outer1 inner nest outer2 五、嵌套 一个函数或过程可能要求调用另一个函数或过程, 我们称这种调用为函数与过程的嵌套 调用原则(函数同过程): Program nest; procedure outer1; procedure inner(z:real); begin …... end;{inner} begin …… end;{outer1} procedure outer2; begin …… end; begin{主程序} …… end. 1、外层的主程序或过程可以调用相邻 内层的过程,但不允许隔层调用 2、内层可以调用外层过程 3、同一层的过程可以相互调用,但要 遵守“向前说明”的原则
过程和函数的区别 • 过程和函数都为子程序,但也有区别: • 1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。2、函数中一般不用变量形参,用函数名直接返回函数值;而过程如有返回值,则必须用变量形参返回。3、过程无类型,不能给过程名赋值;函数有类型,最终要将函数值传送给函数名。4、函数在定义时一定要进行函数的类型说明,过程则不进行过程的类型说明。5、调用方式不同。函数的调用出现在表达式中,过程调用,由独立的过程调用语句来完成。6、过程一般会被设计成求若干个运算结果,完成一系列的数据处理,或与计算无关的各种操作;而函数往往只为了求得一个函数值。
1、设计一个过程,计算圆的面积。在主程序中输入一个半径值,然后调用该过程,并输出圆的面积。1、设计一个过程,计算圆的面积。在主程序中输入一个半径值,然后调用该过程,并输出圆的面积。 • const pi=3.1415926; • var r,s:real; • procedure yuan(x:real;var y:real); • begin • y:=pi*x*x; • end; • begin • readln(r); • yuan(r,s); • writeln('s=',s:6:2); • end.
作业 • 编写一个函数,根据参数指定的n,计算出函数值x,计算公式如下: