function sum(n:integer):longint; //设定一个求阶乘的函数 var i:integer;s:longint; begin s:=1;
for i:=1 to n do s:=s*i; sum:=s; end; begin
read(a,b,c); //输入a,b,c的值
s:=sum(a)+sum(b)+sum(c); //三次调用求阶乘函数 writeln(s); //输出结果 end.
例5-2 任意输入3组三角形的三边,求其面积和。运算结果保留两位小数。 已知三角形的三边a,b,c,求三角形面积S的公式为: P=(a/+b+c)/2,S=sqrt(p*(p-a)*(p-b)*(p-c))。 【样例输入】 2 3 4 3 4 5 5 6 7
【样例输出】 23.60
【参考程序】 program aa; var
i:integer;
a,b,c,s,p:real;
function area(a,b,c:real):real; //设置一个求三角形面积的函数 begin
p:=(a+b+c)/2;
area:=sqrt(p*(p-a)*(p-b)*(p-c)); end; begin s:=0;
for i:=1 to 3 do begin
read(a,b,c);
s:=s+area(a,b,c); //调用自定义函数area end;
writeln(s:0:2); //输出结果 end.
例5-3 求从键盘任意输入三个自然数的最大约数。 【样例输入】100 20 50 【样例输出】10 【参考程序】 program aa;
var a,b,c,k:integer;
function gy(a,b:integer):integer; //求最大公约数函数 var r:integer; begin
r:=a mod b;
while r<>0 do //用辗转相除判余法求最大公约数
36 / 53
begin a:=b; b:=r;
r:=a mod b; end; gy:=b; end; begin
read(a,b,c);
k:=gy(a,b); //调用函数gy,求a,b的最大公约数k
k:=gy(k,c); //调用函数gy,求k,c的最大公约数赋值为k,从而得到a,b,c三个数的最大公约数
writeln(k); end.
例5-4 设计一个函数qs(n,k),它能将自然数N的从右边开始的第K位上的数字取出来。
例如:qs (13579,2)=7 qs (2468,4)=2
调用此函数,求出3次输入后,得到的第K位上的数字之和。 【样例输入】 133756 2 534534534 6 98809 3
【样例输出】 18
【参考程序】 program aa;
var n,k,i,s:longint;
function qs(n,k:longint):longint; //设定一个求从右边数第k位上数字的函数
var i:longint; begin
for i:=1 to k-1 do n:=n div 10; qs:=n mod 10; end;
begin s:=0;
for i:=1 to 3 do begin
read(n,k);
s:=s+qs(n,k); //调用qs函数,并将求得的n右边第k位数字累加到s中
end;
writeln(s); end.
例5-5 求出正整数N~M之间的完全数(N 【样例输出】 6 28 【参考程序】 program aa; 37 / 53 var n,m,i:integer; function wqs(n:integer):boolean; //设定一个判断n是否为完全数的函数 var s,i:integer; begin s:=1; for i:=2 to n div 2 do if n mod i=0 then s:=s+i; if n=s then wqs:=true else wqs:=false; end; begin read(n,m); for i:=n to m do //用穷举法找出n-m之间的所有完全数 if wqs(i) then writeln(i); end. 第二节 自定义过程 一、自定义过程格式 Procedure 过程名(形式参数表); 说明部分; BEGIN 过程体(语句块) END; 二、说明 1.过程首部以保留字Procedure 开头,过程名与函数名的使用规则相同,同时过程名不能代表任何数据,因此不必说明类型。 2.过程的形式参数表中的参数之间用逗号分隔,过程和函数一样也可以不带形参,此时,只是在主程序调用它时,执行指定的操作。它的参数分为值形参与变量形参。 如下例:Procedure FAC(A,B:real; C:integer; var x,y:reaL); 其中:A,B,C称为值形参,它们与在函数中介绍的形参相同;x,y称为变量形参,在它们的前面冠有保留字Var; 3.过程体包括说明和执行两部分,在过程体内使用的有关常量、变量等必须在过程体的说明部分内加以说明或定义,并且只有在过程体执行期间有效,当退出过程体后,为这些量分配的存储单元被释放,还有在过程体内不能给过程名赋值,因为过程名不能代表任何数据。 4.过程调用的一般形式是: 过程名(实在参数表); 例5-6 利用自定义过程求任意两个整数的乘积。 【样例输入】5 10 【样例输出】50 【参考程序】 program lkj; var a,b,c:longint; procedure sum(a,b:longint;var c:longint); //将求两个整数乘积的程序段设为一个过程 begin c:=a*b; end; begin readln(a,b); sum(a,b,c); //调用sum过程求a+b的乘积 38 / 53 writeln(c); end. 例5-7 编写程序,求:S=2!+4!+6!+8! 【输出结果】41066 【参考程序】 program aa; var i:integer; b,s:longint; procedure jc(n:integer; var t:longint); //求x的阶乘,t为变量形参,并将x的阶乘带出过程体 var j:integer; begin t:=1; for j:=1 to n do t:=t*j; end; begin s:=0; for i:=2 to 8 do if not odd(i) then //若i是偶数,则求它的阶乘,并将阶乘b累加到s中 begin jc(i,b); s:=s+b; end; writeln(s); end. 例5-8 小明在家举行了一个生日聚会,共来了M位同学,为了活跃气氛,小明要选N位同学表演一个小游戏,请问有多少种选择方法。 m!n【分析】这是数学中的组合运算,可用下列公式计算Cm,其中M,N?n!*(m?n)!由键盘输入。 【样例输入】10 7 【样例输出】120 【参考程序】 program aa; var L,m,n:integer; a,b,c:real; x:longint; procedure jc(k:integer); //设定一个求k阶乘的函数,阶乘通过x带出过程体 var i:integer; f:longint; begin f:=1; for i:=1 to k do f:=f*i; x:=f; end; begin read(m,n); if m=n then L:=1 else L:=m-n; //若m-n的值为0,则将L设为1,否则L=m-n jc(m);a:=x; //将m的阶乘赋值为a jc(n);b:=x; //将n的阶乘赋值为b jc(L);c:=x; //将L的阶乘赋值为c c:=a/(b*c); //求出运算结果 writeln(c:0:0) end. 39 / 53 例5-9 将辗转相除判余法求两个数最大公约数的程序段设定为一个过程,编程求任意两个整数的最大公约数。 【样例输入】12 8 【样例输出】4 【参考程序】 Program aaa; Var a,b,s:integer; procedure ee(var x,y,z:integer); begin z:=x mod y; while z<>0 do begin x:=y; y:=z; z:=x mod y; end; z:=y; end; begin readln(a,b); ee(a,b,s); writeln(s); end. 通过上面的例题,我们可以看到过程与函数有下列主要区别: (1)过程的首部与函数的首部不同。 (2)函数通常是为了求一个函数值,而过程可以得到若干个运算结果,也可用来完成一系列的数据处理,或用来完成与计算无关的各种操作。 (3)调用方式不同,函数的调用出现在表达式中,而过程调用是一个独立的语句。 第三节 参数和作用域 一、局部量、全程量与作用域 在子程序内部说明的变量,称之为局部变量。在主程序开头说明部分中加以定义与说明的量,称为全程量。在不同的说明语句部分所说明的变量,在程序中对此变量进行存取的适用范围是不同的,我们将其适用的范围称之为作用域。局部变量的作用域为所在子程序,由于形式参数只在所在子程序中有效,因此也属于局部变量。 例5-10 program aa; var a,b:integer; procedure add(c:integer); //c为值形参、局部量,作用域在本程序,它的改变不会影响实在参数a的值 begin c:=c+10; b:=b+10; //b为全程量,在过程中发生改变,退出后仍然是改变的 writeln('c=',c,' ','b=',b); end; begin a:=5; b:=10; add(a); //a为实在参数,它将值传送给值形参c writeln('a=',a,' ','b=',b); end. 【输出结果】 c=15 b=20 a=5 b=20 在这里,a,b是全局量,c是局部量。 二、值参数与变量参数 40 / 53