资源简介 (共17张PPT)函数定义的一般格式: FUNCTION <函数名> (<形式参数表>):<函数类型>;{函数首部} <变量说明部分>;BEGIN<函数体>END;注意:函数体中至少应包括一个给函数名赋值的语句 <函数名> := <表达式> 函数调用的一般格式: <函数名>(实在参数表)例1:编程找出任意输入五个整数中的最大整数。解:设输入的五个整数为n1、n2、n3、n4、n5,为了便于处理,引入一个中间变量t1,按如下步骤处理:①令t1=n1;②将t1与n2比较,将两者中较大的数放入t1;③将t1与n3比较,将两者中较大的数放入t1;④将t1与n4比较,将两者中较大的数放入t1;⑤将t1与n5比较,将两者中较大的数放入t1;⑥经过以上5步处理后,t1即为5个数中最大者。从上面规划的步骤看来,从步骤②到步骤⑤需处理的目标是相同的,因此我们可以设计一段子程序Max(x1,x2),以找出x1和x2中最大的值并返回。Program Exam1_a;Var n1,n2,n3,n4,n5,t1 : integer;Function max(x1,x2 : integer) : integer;BeginIf x1>x2then max := x1else max := x2;End;Beginwrite(‘Input 5 numbers :’);readln(n1,n2,n3,n4,n5);t1 := n1;t1 := max(t1,n2);t1 := max(t1,n3);t1 := max(t1,n4);t1 := max(t1,n5);writeln(‘Max number : ’,t1);End.方法二:求三个数中的最大数,定义一个专门求三个数中最大数的函数(Max)。第一次用这个函数求出n1,n2,n3三个数中的最大数t1;第二次调用这个函数求出t1与n4,n5三个数中的最大数,也就是前三个数的最大数(已在t1中)和后面二个数再求一次,就得到五个数的最大数。Program Exam1_b;Var n1,n2,n3,n4,n5,t1: integer;Function max(x1,x2,x3: integer): integer; {自定义函数Max}Var xx: integer; {函数内部变量说明}Begin {函数体}if x1>x2then xx:=x1else xx:=x2;if x3>xx then xx:=x3;max:=xxEnd;Begin {主程序}write('Input 5 numbers:');readln(n1,n2,n3,n4,n5); {输入五个数}t1:=max(n1,n2,n3); {用函数求n1, n2, n3的最大数}t1:=max(n4,n5,t1); {用函数求n4, n5, t1 的最大数}writeln('Max number :', t1);End.例2:编写一个求组合数 的函数,计算公式为 (0Cnmm!n! (m-n)!Program Exam2;Var m,n,cmn : integer;Function fac(k : integer) : integer;Var i, t : integer;Begint:=1;for i:=2 to k dot:=t * i;fac:=t;End;Beginwrite(‘Please input m,n:’);read (m,n);if (n>=0) and (nthen begincmn:= fac(m) div (fac(n)*fac(m-n));writeln(‘ c( ’,m, ‘,’,n, ‘)=’, cmn )endelse writeln(‘Input error!’)End.过程定义的一般格式: PROCEDURE <过程名> (<形式参数表>); {过程首部}<变量说明部分>;BEGIN<过程体>;END;注意:过程的结果由参数送回,可以包括多个过程调用的一般格式: <过程名>(实在参数表)例3:输入三个不同的整数,按由小到大排序 。Program exam3;Var a,b,c: integer;Procedure swap (VAR x,y:integer); {自定义过程 }Var t:integer;Begin {过程体}t:=x; x:=y; y:=t {交换两个变量的值}End;Begin {主程序}write(‘input a,b,c=’);readln(a,b,c);if a>b then swap (a,b); {调用自定义过程}if a>c then swap (a,c);if b>c fhen swap (b,c);writeln (a:6, b:6, c:6);End.形式参数的说明:1、对于值参数,调用时将实在参数的值传给形式参数,然后参加运算,形式参数的值不会影响对应实在参数的值。2、对于变量参数,在调用时将实在参数的地址传给形式参数,对形式参数的运算就是对于实在参数的运算。利用变量参数可以送回过程运算的结果。例4 写出下列两个程序的运行结果。program ex1; program ex2; var a,b:integer; var a,b:integer; procedure swap(x,y:integer); procedure swap(Var x,y:integer) ; var t:integer; var t:integer; begin begin t:=x;x:=y;y:=t; t:=x;x:=y;y:=t; end; end; begin begin a:=1;b:=2; a:=1;b:=2; writeln(a:3,b:3); writeln(a:3,b:3); swap(a,b); swap(a,b); writeln(a:3,b:3); writeln(a:3,b:3); end. end.1 2 1 21 2 2 1分析该程序,写出运行结果Program ex3;Var x,y: integer;Procedure change ;Var x:integer;Beginx:=2;y:=2;writeln(x,y)End;Beginx:=1; y:=1;writeln(x,y);change;writeln (x,y)End.x u1 12 21 2变量的作用域:1、局部量:在子程序内部作用的变量 ,局部变量的作用域就是其所在的子程序。2、全局量:主程序的说明部分中说明的量。全程量的作用域分两种情况: ①当全程量和局部量不同名时,其作用域是整个程序范围(自定义起直到主程序结束)。 ②当全程量和局部量同名时,全程量的作用域不包含局部量的作用域。分析该程序,写出运行结果Program ex4;Var x,u: integer;Procedure change (x:integer; VAR y:integer);Beginx:=x+1;y:=y+1;writeln(x,y)End;Beginx:=1; u:=1;writeln(x,u);change(x,u);writeln (x,u)End.x u1 12 21 2分析该程序,写出运行结果Program ex5;Var x,y: integer;Procedure swap (x, y:integer);Var temp:integer;Begintemp:=x;x:=y;y:=temp;writeln(x,y)End;Beginx:=1; y:=2;writeln(x,y);swap(x,y);writeln (x,y)End.x y1 22 21 2本次作业:P1225.25.35.75.19(共25张PPT)本次作业:P1225.25.35.75.195.2 定义一函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。例如digit(15327,4)=5Program ex52(input,output);Var n,k,dig : integer;Function digit( n,k : integer) : integer;Beginrepeatdigit:=n mod 10;n:=n div 10;k:=k-1until k=0End;Beginwrite(‘Please input n,k :’);read (n,k);dig:=digit(n,k);writeln(‘digit(’, n, ‘,’, k, ‘)=’, dig);End.5.2 定义一函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。例如digit(15327,4)=5Program ex52(input,output);Var n,k,dig : integer;Function digit( n,k : integer) : integer;var i:integer;Beginfor i:=1 to k dobegindigit:=n mod 10;n:=n div 10endEnd;Beginwrite(‘Please input n,k :’);read (n,k);dig:=digit(n,k);writeln(‘digit(’, n, ‘,’, k, ‘)=’, dig);End.5.3 定义一函数check(n,d),它回送一个布尔值。如果数字d在整数n的某位中出现,则回送true(真),否则回送false(假)。例如check(3256,2)=true。Program ex53(input,output);Var n,d,c : integer;Function check( n,d : integer) : integer;Beginrepeatm:=n mod 10;n:=n div 10until (m=d) or (n=0);check:=m=dEnd;Beginwrite(‘Please input n,d :’);read (n,d);c:=check(n,k);writeln(‘digit(’, n, ‘,’, k, ‘)=’, dig);End.5.7 输入a,b,c,计算m。已知max(a,b,c)m =max(a+b,b,c) × max(a,b,b+c)求三个数的最大数max(x,y,z)定义成函数和过程。Program ex571(input,output); {函数}Var a,b,c,m : real;Function max( a,b,c : real) : real;Var ma:real;Beginma:=a;if b>ma then ma:=b;if c>ma then ma:=c;max:=maEnd;Beginwrite(‘Please input a,b,c :’);read (a,b,c);m:=max(a,b,c)/(max(a+b,b,c)*max(a,b,b+c));writeln(‘ m=’, m:5:2);End.5.7 输入a,b,c,计算m。已知max(a,b,c)m =max(a+b,b,c) × max(a,b,b+c)求三个数的最大数max(x,y,z)定义成函数和过程。Program ex572(input,output); {过程}Var a,b,c,m,m1,m2,m3 : real;Procedure max( a,b,c : real; var ma:real);Beginma:=a;if b>ma then ma:=b;if c>ma then ma:=cEnd;Beginwrite(‘Please input a,b,c :’);read (a,b,c);max(a,b,c,m1); max(a+b,b,c,m2); max(a,b,b+c,m3);m:=m1/(m2*m3);writeln(‘ m=’, m:5:2);End.函数定义的一般格式: FUNCTION <函数名> (<形式参数表>):<函数类型>;{函数首部} <变量说明部分>;BEGIN<函数体>END;注意:函数体中至少应包括一个给函数名赋值的语句 <函数名> := <表达式> 函数调用的一般格式: <函数名>(实在参数表)过程定义的一般格式: PROCEDURE <过程名> (<形式参数表>); {过程首部}<变量说明部分>;BEGIN<过程体>;END;注意:过程的结果由参数送回,可以包括多个过程调用的一般格式: <过程名>(实在参数表)形式参数的说明:1、对于值参数,调用时将实在参数的值传给形式参数,然后参加运算,形式参数的值不会影响对应实在参数的值。2、对于变量参数,调用时将实在参数的地址传给形式参数,对形式参数的运算就是对于实在参数的运算。利用变量参数可以送回过程运算的结果。例: 写出下列两个程序的运行结果。program ex1; program ex2; var a,b:integer; var a,b:integer; procedure swap(x,y:integer); procedure swap(Var x,y:integer) ; var t:integer; var t:integer; begin begin t:=x;x:=y;y:=t; t:=x;x:=y;y:=t; end; end; begin begin a:=1;b:=2; a:=1;b:=2; writeln(a:3,b:3); writeln(a:3,b:3); swap(a,b); swap(a,b); writeln(a:3,b:3); writeln(a:3,b:3); end. end.1 2 1 21 2 2 1变量的作用域:1、全程变量:在主程序中说明的变量。全程量可以在主程序及主程序内的所有子程序中使用,除非它们在子程序中又重新被说明。分两种情况:①全程量与局部量不同名时,其作用域是整个程序。②全程量与局部量同名时,在定义局部量的子程序内,局部量起作用;在其它地方全程量起作用。 2、局部变量:在子程序中说明的变量,局部量只在说明它们的子程序内起作用。形式参数也属于局部量。分析该程序,写出运行结果Program example1;Var x,y: integer;Procedure change ;Var x:integer;Beginx:=2; y:=2;writeln(x,y)End;Beginx:=1; y:=1;writeln(x,y);change;writeln (x,y)End.x y1 12 21 2分析该程序,写出运行结果Program example2;Var x,y,z: integer;Procedure t (x:integer);Var y:integer;Beginy:=10;x:=x+y;z:=z-x;writeln(‘x=’,x, ‘y=’,y, ‘z=’,z)End;Beginx:=10; y:=20; z:=30;t (x);writeln (‘x=’, x, ‘y=’, y, ‘z=’, z)End.x=20 y=10 z=10x=10 y=20 z=10递归函数或过程调用它本身,称为递归。直接递归:函数或过程a调用a本身间接递归:函数或过程a调用函数或过程b,b又调用a递归是一个反复执行直到递归终止的过程。设计思想:假定第n-1步已经成功的前提下进行的。例1:用递归计算n!。1 n=0n! =n × (n-1)! n>0用递归求n!Program digui1(input,output);Var n: integer; y:real;Function fac( n : integer) : real;Beginif n=0 {边界条件}then fac:=1else fac:=n*fac(n-1)End;Beginwrite(‘Please input n=’);read (n);y:=fac(n);writeln( n, ‘!=’, y:6:0 );End.fac(3)第1次调用n=33*fac(2)第2次调用n=22*fac(1)第3次调用n=11*fac(0)第4次调用n=0返回值1返回值1返回值2返回值6if n=0 {边界条件}then fac:=1else fac:=n*fac(n-1)例2:求m与n的最大公约数。(辗转相除法)Program digui2(input,output);Var m,n,g : integer;Function gys( a,b : integer) : integer;Var r:integer;Beginr:=a mod b;if r=0then gys:=belse gys:=gys(b,r)End;Beginwrite(‘Please input m,n :’);read (m,n);g:=gys(m,n)writeln(‘gys(’, m, ‘,’, n, ‘)=’, g);End.例3:汉诺塔游戏。有A、B、C三根细柱,A柱上有n个从小到大的圆盘,小盘放在大盘上面,要求将这N个圆盘移到C柱上,在移动过程中,可以借助B柱,每次只能移动一个圆盘,在任何一根细柱上都不允许出现大盘压住小盘的情况,请编写一个程序显示移动步骤。源柱中间柱目标柱ABC源柱中间柱目标柱ABC分析:原问题可以分成3个子问题:(1)将A柱最上面的n-1个圆盘借助C柱移到B柱。(2)将A柱剩下的一个圆盘移到C柱。(3)将B柱的n-1个圆盘借助A柱移到C柱。Program hanoi(input,output);Var n : integer;Procedure move( n,a,b,c : integer);Beginif n=1then writeln(a, ‘ ’, c)else beginmove(n-1,a,c,b);writeln(a, ‘ ’, c);move(n-1,b,a,c)endEnd;Beginwrite(‘n=’);read (n);writeln(‘move steps:’);move(n,1,2,3)End.源柱中间柱目标柱ABC过程move(n,a,b,c)if n=1then writeln(a, ‘ ’, c)else beginmove(n-1,a,c,b);writeln(a, ‘ ’, c);move(n-1,b,a,c)end调用move(n,a,b,c)move(3,1,2,3)move(3,1,2,3)move(2,1,3,2)1 3move(2,2,1,3)move(1,1,2,3)1 2move(1,3,1,2)n=11 3n=13 2… …Program hanoi(input,output);Var n : integer;Procedure move( n : integer; a,b,c : char);Beginif n>0then beginmove(n-1,a,c,b);writeln(a, ‘ ’, c);move(n-1,b,a,c)endEnd;Beginwrite(‘n=’);read (n);writeln(‘move steps:’);move(n, ‘A’, ‘B’, ‘C’)End.源柱中间柱目标柱ABC5.19 写出下列程序的输出结果Program ex519(input,output);Var a,b,c,d: integer;Procedure P (a:integer;VAR b:integer) ;Var c:integer;Begina:=a+1; b:=b+1;c:=2; d:=d+1;writeln(‘m’,a,b,c,d);if a < 3then P(a,b);writeln(‘n’,a,b,c,d)End;Begina:=1; b:=1; c:=1; d:=1;writeln(‘x’,a,b,c,d);P(a,b);writeln (‘y’,a,b,c,d)End.a b c dx 1 1 1 1m 2 2 2 2m 3 3 2 3n 3 3 2 3n 2 3 2 3y 1 3 1 3本次作业:P1235.125.135.165.19 展开更多...... 收起↑ 资源列表 函数与过程1.ppt 函数与过程2.ppt