第四章 函数与过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章函数与过程
程序中往往需要把主要任务分成若干个子任务,每个子任务只负责一个专门的基本工作。每个子任务就是一个独立的子程序。Turbo Pascal可以把函数和过程作为子程序调用。
第一节函数
Pascal允许用户在程序中自己说明定义所需要的函数并在程序中调用这些函数。
[例4.1]编程找出由键盘任意输入五个整数中的最大整数。
解:设输入的五个整数为n1、n2、n3、n4、n5,为了便于处理,引入一个中间变量t1,按如下步骤处理:
①令t1=n1;
②将t1与n2比较,将两者中较大的数放入t1;
③将t1与n3比较,将两者中较大的数放入t1;
=4\*GB3④将t1与n4比较,将两者中较大的数放入t1;
=5\*GB3⑤将t1与n5比较,将两者中较大的数放入t1;
=6\*GB3⑥经过以上5步处理后,t1即为5个数中最大者。
从上面规划的步骤看来,从步骤②到步骤=5\*GB3⑤需处理的目标是相同的,因此我们可以设计一段子程序Max(x1,x2),以找出x1和x2中最大的值并返回。
Pascal程序:
Program Exam41_a;
Var n1,n2,n3,n4,n5,t1:integer;
Function max(x1,x2:integer):integer;
Begin
If x1>x2then Max:=x1
Else Max:=x2;
End;
Begin
Write(‘Input5numbers:‘);
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中)和后面二个数再求一次,就得到五个数的最大数。因此,需要两次使用“求三个数中的最大数”,步骤如下:
①调用函数Max(n1,n2,n3),求出n1,n2,n3中的最大者t1;
②调用函数Max(t1,n4,n5),求出t1,n4,n5中的最大者t2;
③输出最大数t2。
Program Exam41_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:=X1
else XX:=X2;
if X3>XX then XX:=X3;
Max:=XX
end;
Begin{主程序}
Write('Input5numb:');
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);
Readln
End.
主程序中两次调用自定义函数。自定义函数的一般格式为:
function函数名(形式参数表):类型;{函数首部}
局部变量说明部分;
begin
语句系列;{函数体}
end;
函数中的形式参数接受调用函数时所传入的值,用来参与函数中的运算。
[例4.2]求任意输入的五个自然数的最大公约数。
解:⑴自定义一个专门求两自然数的最大公约数的函数GCD;
⑵调用自定义函数,第一次求前两个数的最大公约数;从第二次开始,用每次求得的最大公约数与下一个数再求两个数最大公约数,直到最后。本题共四次“求两个数的最大公约数”,设输入的五个自然数分别是
a1,a2,a3,a4,a5,采用如下步骤:
①求a1,a2两个数的最大公约数→存入a1;
②求a1,a3两个数的最大公约数→存入a1;
③求a1,a4两个数的最大公约数→存入a1;
④求a1,a5两个数的最大公约数→存入a1;
⑤输出a1,此时的a1已是五个数的最大公约数。
Pascal程序:
Program Exam42;
Var a1,a2,a3,a4,a5:integder;
function GCD(x,y:integer):integer;{自定义函数}
Var n:integer;
begin
While x mod y<>0do
begin
n:=x;x:=y;y:=n mod y
end;
GCD:=y
end;
Begin{主程序}
Write('input5Numper:');
readln(a1,a2,a3,a4,a5);{输入五个数}
Write('(',a1,',',a2,',',a3,',',a4,',',a5,')=');
a1:=GCD(a1,a2);{调用函数GCD}
a1:=GCD(a1,a3);
a1:=GCD(a1,a4);
a1:=GCD(a1,a5);
Writeln(a1);
readln
End.
函数的结果是一个具体的值,在函数体中必须将所得到的运算结果赋给函数名;主程序通过调用函数得到函数的运算结果。调用函数的一般格式为:
函数名(实在参数表)
调用函数时,函数名后面圆括号内的参数必须有确定的值,称为实在参数。调用时即把这些实际值传送给函数形参表中的相应形参变量。函数不是单独的语句,只能作为运算赋值或出现在表达式中。
习题4.1
1.数学上把从1开始的连续自然数相乘叫做阶乘。例如把1*2*3*4*5称作5的阶乘,记为5!。编写一个求n!的函数,调用此函数求:D=
2.求从键盘输入的五个自然数的最小公倍数。
3.哥德巴赫猜想的命题之一是:大于6的偶数等于两个素数之和。编程将6~100所有偶数表示成两个素数之和。
4.如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13。试求出所有二位绝对素数。