函数与过程

文档属性

名称 函数与过程
格式 rar
文件大小 30.8KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2010-10-17 23:11:00

文档简介

(共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;
Begin
If x1>x2
then max := x1
else max := x2;
End;
Begin
write(‘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>x2
then xx:=x1
else xx:=x2;
if x3>xx then xx:=x3;
max:=xx
End;
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:编写一个求组合数 的函数,计算公式
为 (0C
n
m
m!
n! (m-n)!
Program Exam2;
Var m,n,cmn : integer;
Function fac(k : integer) : integer;
Var i, t : integer;
Begin
t:=1;
for i:=2 to k do
t:=t * i;
fac:=t;
End;
Begin
write(‘Please input m,n:’);
read (m,n);
if (n>=0) and (nthen begin
cmn:= fac(m) div (fac(n)*fac(m-n));
writeln(‘ c( ’,m, ‘,’,n, ‘)=’, cmn )
end
else 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 2
1 2 2 1
分析该程序,写出运行结果
Program ex3;
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.
x u
1 1
2 2
1 2
变量的作用域:
1、局部量:在子程序内部作用的变量 ,局部变量的作用域就是其所在的子程序。
2、全局量:主程序的说明部分中说明的量。全程量的作用域分两种情况:   ①当全程量和局部量不同名时,其作用域是整个程序范围(自定义起直到主程序结束)。   ②当全程量和局部量同名时,全程量的作用域不包含局部量的作用域。
分析该程序,写出运行结果
Program ex4;
Var x,u: integer;
Procedure change (x:integer; VAR y:integer);
Begin
x:=x+1;
y:=y+1;
writeln(x,y)
End;
Begin
x:=1; u:=1;
writeln(x,u);
change(x,u);
writeln (x,u)
End.
x u
1 1
2 2
1 2
分析该程序,写出运行结果
Program ex5;
Var x,y: integer;
Procedure swap (x, y:integer);
Var temp:integer;
Begin
temp:=x;
x:=y;
y:=temp;
writeln(x,y)
End;
Begin
x:=1; y:=2;
writeln(x,y);
swap(x,y);
writeln (x,y)
End.
x y
1 2
2 2
1 2
本次作业:P122
5.2
5.3
5.7
5.19(共25张PPT)
本次作业:P122
5.2
5.3
5.7
5.19
5.2 定义一函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。例如digit(15327,4)=5
Program ex52(input,output);
Var n,k,dig : integer;
Function digit( n,k : integer) : integer;
Begin
repeat
digit:=n mod 10;
n:=n div 10;
k:=k-1
until k=0
End;
Begin
write(‘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)=5
Program ex52(input,output);
Var n,k,dig : integer;
Function digit( n,k : integer) : integer;
var i:integer;
Begin
for i:=1 to k do
begin
digit:=n mod 10;
n:=n div 10
end
End;
Begin
write(‘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;
Begin
repeat
m:=n mod 10;
n:=n div 10
until (m=d) or (n=0);
check:=m=d
End;
Begin
write(‘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;
Begin
ma:=a;
if b>ma then ma:=b;
if c>ma then ma:=c;
max:=ma
End;
Begin
write(‘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);
Begin
ma:=a;
if b>ma then ma:=b;
if c>ma then ma:=c
End;
Begin
write(‘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 2
1 2 2 1
变量的作用域:
1、全程变量:在主程序中说明的变量。全程量可以在主程序及主程序内的所有子程序中使用,除非它们在子程序中又重新被说明。分两种情况:
①全程量与局部量不同名时,其作用域是整个程序。
②全程量与局部量同名时,在定义局部量的子程序内,局部量起作用;在其它地方全程量起作用。
  
2、局部变量:在子程序中说明的变量,局部量只在说明它们的子程序内起作用。形式参数也属于局部量。
分析该程序,写出运行结果
Program example1;
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.
x y
1 1
2 2
1 2
分析该程序,写出运行结果
Program example2;
Var x,y,z: integer;
Procedure t (x:integer);
Var y:integer;
Begin
y:=10;
x:=x+y;
z:=z-x;
writeln(‘x=’,x, ‘y=’,y, ‘z=’,z)
End;
Begin
x:=10; y:=20; z:=30;
t (x);
writeln (‘x=’, x, ‘y=’, y, ‘z=’, z)
End.
x=20 y=10 z=10
x=10 y=20 z=10
递归
函数或过程调用它本身,称为递归。
直接递归:函数或过程a调用a本身
间接递归:函数或过程a调用函数或过程b,b又调用a
递归是一个反复执行直到递归终止的过程。
设计思想:假定第n-1步已经成功的前提下进行的。
例1:用递归计算n!。
1 n=0
n! =
n × (n-1)! n>0
用递归求n!
Program digui1(input,output);
Var n: integer; y:real;
Function fac( n : integer) : real;
Begin
if n=0 {边界条件}
then fac:=1
else fac:=n*fac(n-1)
End;
Begin
write(‘Please input n=’);
read (n);
y:=fac(n);
writeln( n, ‘!=’, y:6:0 );
End.
fac(3)
第1次调用
n=3
3*fac(2)
第2次调用
n=2
2*fac(1)
第3次调用
n=1
1*fac(0)
第4次调用
n=0
返回值1
返回值1
返回值2
返回值6
if n=0 {边界条件}
then fac:=1
else 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;
Begin
r:=a mod b;
if r=0
then gys:=b
else gys:=gys(b,r)
End;
Begin
write(‘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柱,每次只能移动一个圆盘,在任何一根细柱上都不允许出现大盘压住小盘的情况,请编写一个程序显示移动步骤。
源柱
中间柱
目标柱
A
B
C
源柱
中间柱
目标柱
A
B
C
分析:原问题可以分成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);
Begin
if n=1
then writeln(a, ‘ ’, c)
else begin
move(n-1,a,c,b);
writeln(a, ‘ ’, c);
move(n-1,b,a,c)
end
End;
Begin
write(‘n=’);
read (n);
writeln(‘move steps:’);
move(n,1,2,3)
End.
源柱
中间柱
目标柱
A
B
C
过程move(n,a,b,c)
if n=1
then writeln(a, ‘ ’, c)
else begin
move(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 3
move(2,2,1,3)
move(1,1,2,3)
1 2
move(1,3,1,2)
n=1
1 3
n=1
3 2
… …
Program hanoi(input,output);
Var n : integer;
Procedure move( n : integer; a,b,c : char);
Begin
if n>0
then begin
move(n-1,a,c,b);
writeln(a, ‘ ’, c);
move(n-1,b,a,c)
end
End;
Begin
write(‘n=’);
read (n);
writeln(‘move steps:’);
move(n, ‘A’, ‘B’, ‘C’)
End.
源柱
中间柱
目标柱
A
B
C
5.19 写出下列程序的输出结果
Program ex519(input,output);
Var a,b,c,d: integer;
Procedure P (a:integer;VAR b:integer) ;
Var c:integer;
Begin
a:=a+1; b:=b+1;
c:=2; d:=d+1;
writeln(‘m’,a,b,c,d);
if a < 3
then P(a,b);
writeln(‘n’,a,b,c,d)
End;
Begin
a:=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 d
x 1 1 1 1
m 2 2 2 2
m 3 3 2 3
n 3 3 2 3
n 2 3 2 3
y 1 3 1 3
本次作业:P123
5.12
5.13
5.16
5.19
同课章节目录