过程与函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 输出两个数中最大值的过程
Var 过程中定义的形式参数 x:y :integer a,b,在实际引用过程 时,将被实际参数代替 procedure largest(a,b:integer); begin if a>b then writeln(a) else writeln(b); end. begin Readln(x,y); 实际引用时所用的参数x,y,是主 程序定义的变量 Lagest(x,y); End.
例:定义一个求三数中最大值的过程
procedure largest(f1,f2,f3:integer;var ir:integer); {计算和返回f1,f2,f3的最大值ir} var g:integer; procedure larger (n1,n2:integer;var r:integer); {largest的子过程,计算和返回n1,n2的最大值r} begin if n1>n2 then r:=n1 else r:=n2; end; {larger} begin larger (f1,f2,g); {求出f1,f2中的最大值g} larger (g,f3,ir); {求出g,f3中的最大值Ir,作为f1,f2,f3中的最大值返回} end; {largest}
Largest有四个类型为整型的形式参数:f1,f2,f3和Ir, 前三个参数f1,f2,f3为 调用者向被调用者传入的三个要求比较大小的整数,这三个参数仅用作传入数据, 不传出计算结果,因此称为值参;第四个参数Ir用来向调用者传送三数中的最大值, 这种用作传出计算结果的参数称为变量参数,由var标志。 Largest使用的子过程larger有三个类型为整型的形式参数:n1,n2和r, 前二个 参数n1,n2为过程Largest向它传入的二个要求比较大小的整数,属于值参;第三个 参数r用来向过程Largest传送n1和n2的最大值,属于变量参数。
2.函数调用 函数调用 一般形式: 一般形式: <函数名>(<实在参数表>) 函数名> 实在参数表> 解释:函数调用必须出现在表达式中。函数每次调用, 解释:函数调用必须出现在表达式中。函数每次调用,是将 每个实在参数的值赋给对应的形式参数,然后由函数完成规定 每个实在参数的值赋给对应的形式参数, 的处理,并回送处理结果。 的处理,并回送处理结果。 注意: 注意: 实在参数与形式参数的个数要相同,一一对应,类型上赋值 实在参数与形式参数的个数要相同,一一对应, 相容。 相容。 实在参数可以是表达式。 实在参数可以是表达式。 若没有形式参数,则 略去实在参数和括号。 若没有形式参数, 略去实在参数和括号。
begin writeln(‘Please input m,n:’); read(m,n); if (n>=0) and (n<m) and (m<8) then begin a:=fac(m); b:=fac(n); c:=fac(m-n); d:=a div (b*c); writeln(‘d=’,d) 在这个程序中,m,n,a,b,c,d在主程序的说明 end 部分被定义,称为全程变量,即在主程序和 eles writeln(‘Input error!’) 子程序中都可以被用到的变量。i,t在子程序 end.
Pascal子程序形参主要分类: 1.值参数 形式参数表中前面没有var,后有类型的参数。它类似过程和函数的局部变量,仅 为过程和函数的执行提供初值而不影响调用时实际参数的值。在调用过程或应用函数时, 值参数所对应的实际参数必须是表达式,而且它的值不能使文件类型或包括文件类型的 值。实参必须和形参赋值相容。 2.变量参数 形式参数表中前面有var后由类型的参数。如果需要子程序向调用程序返回值时, 应采用变量参数。变量参数要求它的实参是和它同一类型的变量。因为在子程序执行时, 遇到对相应形参的引用式定值,就是对相应实参的引用式定值,即对形参的任何操作就 是对实参本身的操作。
2.过程调用一般形式: 2.过程调用一般形式 过程调用一般形式: <过程名>(<实在参数表>) 过程名> 实在参数表> 解释:与数值形参对应的实在参数可以是表达式,与变量形参对应的实在参数必须是 解释:与数值形参对应的实在参数可以是表达式, 变量,而不能是一般的表达式。 变量,而不能是一般的表达式。
begin{主程序开始} write('Input a,b:'); repeat {输入0<a<b} { 0<a<b} readln(a,b); until (a>0)and(b>0)and(a<b); writeln('List of all perfect numbers:'); {从a到b逐个判断,是完全数则打印出来 for i:=a to b do if perfect(i) then writeln(i); end.
例:输出以下一个图形: * 分析:我们前面学习可用的二重循环打印出 ** 上图形, 现我们设置一个过程打印出N个连续 *** 的"*"号。 **** ***** ******
program ex7_2; var i:integer; procedure draw_a_line(n:integer); {该过程打印出连续n 个星号,并换行} var j:integer; begin for j:=1 to n do write('*'); writeln; end; begin for i:=1 to 6 do draw_a_line(i);{调用过程,第I行打印i个连续星号} end.
的说明部分被定义,成为局部变量,即只能 在被定义的子程序中使用的变量。K是函数 的形式参数,其类型为整型。函数名称为 fac,函数值返回的类型也为整型。
例:定义一个求三数中最大值的函数
function largest (f1,f2,f3:integer):integer; {计算和返回f1,f2,f3的最大值} var g:integer; function larger (n1,n2:integer):integer; { 计算和返回n1,n2的最大值} begin if n1>n2 then larger:=n1 else larger:=n2; end; {larger} begin largest:=larger(larger (f1,f2),f3); {计算和返回f1,f2,f3的最大值} end; {largest} largest的函数说明指明了largest函数和它的子函数larger的结果值类型都为 整数。子函数larger的结果值由赋值语句larger:=n1(或larger:=n2)确定; largest函数的结果值由赋值语句largest:=larger(larger (f1,f2),f3)确定。
例 说明一个求两个整数的最大公约数和最小公倍数的过程
Байду номын сангаас
Procedure mab(a,b:integer; var maxab,minab:integer); Var f:boolean; i:integer; Begin if a>b then begin t:=a;a:=b;b:=t; end; f:=true; i:=a; while f and i>0 do begin if (a mod i=0 ) and (b mod i=0) then begin maxab:=I; minab:=a*b div I; f:=false; end; i:=i-1; end; End;
例:编写一个求K!的函数,调用此函数计算: (0<n<m<8) m!
d=
Var m,n,a,b,c,d:integer;
n!(m n)!
function fac(k:integer):integer; var i,t:integer; begin t:=1; for i:=2 to k do t:=t*i; fac:=t end;
过程与函数的区别
实参与形参
子程序调用(过程调用或函数调用)的执行顺序分以下几步: 实参与形参结合─→执行子程序体─→返回调用处继续执行 子程序说明的形式参数表对过程或函数内的语句序列直接引用的变量进 行说明,详细指明这些参数的类别、数据类型要求和参数的个数。过 程或函数被调用时必须为它的每个形参提供一个实参,按参数的位置 顺序一一对应,每个实参必须满足对应形参的要求。
var i,a,b : integer;
function perfect(x:integer):boolean; var k,sum : integer; begin {累加x所有小于本身的因数} sum:=1; for k:=2 to x div 2 do if x mod k=0 then sum:=sum+k; {判断x是否是完全数} perfect:=x=sum; {将结果赋值给函数名} end;{end of perfect}
例: 求正整数A和B之间的完全数(A<B).
分析:所谓完全数是指它的小于该数本身的因子之和等于它本身,如6=1 +2+3,6即是一个完全数。因此我们可定义一个布尔型函数perfect(x),若 x是完全数,其值为TURE,否则为FALSE。整个程序算法如下: 1 for i:=A to B do 2 if perfect(i) then writeln(i);
子程序——过程与函数
提出函数与过程的理由
计算机程序设计和问题求解的最基本思想是: 计算机程序设计和问题求解的最基本思想是: 将一个大的复杂的问题分解成更小、 将一个大的复杂的问题分解成更小、更简单和更容 易处理的子问题。 Pascal语言提供了函数和过 易处理的子问题。在Pascal语言提供了函数和过 使得问题的分解和处理更加方便。 程,使得问题的分解和处理更加方便。 函数或过程: 函数或过程:将对应于一个子问题求精的语句写在 一起,作为一个单独的程序模块。 一起,作为一个单独的程序模块。通常通过子程序定 义抽象操作,实现程序的模块化。 义抽象操作,实现程序的模块化。
一、函数 1。定义 。 函数说明一般形式: 函数说明一般形式: FUNCTION <函数名>(<形式参数表>):<函数类型>; <函数名 函数名> 形式参数表>):<函数类型> <说明部分>; 说明部分> BEGIN <函数体> 函数体> END; END; 注意: 注意:(1)函数名由合法的标识符指出;参数表由形式参数名表和说明参数的类型标 函数名由合法的标识符指出; 识符组成;函数类型即结果类型,由类型标识符指明。 识符组成;函数类型即结果类型,由类型标识符指明。 (2)形式参数类似于数学函数中的自变量,为函数子程序提供初始量。在一个形式参 形式参数类似于数学函数中的自变量,为函数子程序提供初始量。 数表中,可以有多个参数。逗号用来分开同类型的各个参数名, 数表中,可以有多个参数。逗号用来分开同类型的各个参数名,分号用来分开不同类 型的参数。 型的参数。 例如:( :(x,y:real;m,n:integer) 例如:(x,y:real;m,n:integer) (3)说明部分对仅在函数中使用的量加以说明,可以包括函数所需要的常量、说明 说明部分对仅在函数中使用的量加以说明 可以包括函数所需要的常量、 在函数中使用的量加以说明, 类型、变量说明,也可以包括其他函数或过程说明,一般称之为局部变量 局部变量。 类型、变量说明,也可以包括其他函数或过程说明,一般称之为局部变量。函数也可 以没有说明。 以没有说明。 (4)函数体:(函数部分的程序体)其中至少要有一个给函数名赋值的语句,并以分号 函数体:(函数部分的程序体 其中至少要有一个给函数名赋值的语句, 函数部分的程序体) 结束函数体。 结束函数体。
二、过程
1。定义 。 过程说明一般形式: 过程说明一般形式: PROCEDURE <过程名>(<形式参数表>); 过程名> 形式参数表> <说明部分>; 说明部分> BEGIN <过程体> 过程体 END; END;
注意: 形式参数表有两种格式:数值形参和以 和以VAR开头的变量形参。 开头的变量形参 注意:(1)形式参数表有两种格式:数值形参和以VAR开头的变量形参。 (2)过程体中没有也不可以有给过程名赋值的语句,返回值由变量形参提 过程体中没有也不可以有给过程名赋值的语句, 供。