標籤:
第五章、函數與過程程式設計
一、函數(包括標準函數和自訂函數)
1、函數的定義
格式:FUNCTION 函數名(<形參表>):傳回值類型;
VAR
<變數說明>
BEGIN
<函數體>
END
[注]:1、形參表每個參數都寫明其類型;
2、有且只有一個傳回值,並且要將傳回值賦值給函數名。
[例]:求五邊形的面積
function area(a,b,c:real):real;
var
p:real;
begin
p:=(a+b+c)/2;
area:=sqrt(p*(p-a)*(p-b)*(p-c);
end;
2、函數的調用
1)、函數的調用必然出現在運算式中(等號的右邊),不能以單獨地在語句出現
2)、調用時,將每個實參傳遞給對應的形參
program ml_area(input,output);
var
l1,l2,l3,l4,l5,l6,l7,s:real;
function area(a,b,c:real):real;
var
p:real;
begin
p:=(a+b+c)/2;
area:=sqrt(p*(p-a)*(p-b)*(p-c);
end;
begin
write(‘input‘);
readln(l1,l2,l3,l4,l5,l6,l7);
s:=area(l1,l2,l6)+area(l2,l6,l7)+……;
writeln(‘s=‘,s:10:3);
end.
二、過程
格式:PROCEDURE<過程名>(<形式參數表>)
VAR
<說明部分>
BEGIN
<過程體>
END;
[例1]某過程的形參表為(var a,b:real;c,d:integer;var e:char);
主程式中有如下變數說明:x,y:real; m:integer; next:char;
則以下實參表中合法的有:(1、2、3)
1、(x,y,m+3,70,next)
2、(y,x,m,m,next)
3、(y,x,35,m DIV 10,next)
4、(m,x,30,10,next)
5、(x,y,m,10)
6、(35,0,y,m,10,next)
7、(x,y,m,m/10,next)
8、(A,B,30,10,next)
[例2]求程式輸出的結果。
program ex(input,output);
var
x,y,z:integer;
procedure s(x:integer; var y:integer);
var
z:integer
begin
x:=5; y:=6; z:=7;
end;
begin
x:=1; y:=2; z:=3;
s(x,y);
writeln(x,y,z);
end.
輸出結果:1 6 3
[例3]:求五個數中的最大值。
program max_in_5(input,output);
var
n1,n2,n3,n4,n5:integer;
procedure lagest_in_three(a,b,c:integer;var e:integer)
begin
e:=a;
if b>e then
e:=b;
if c>e then
e:=c;
end;
begin
write(‘……‘);
readln(n1,n2,n3,n4,n5);
lagest(n1,n2,n3,n1);
lagest(n1,n4,n5,n1);
write(n1);
end.
三、嵌套
[例]:計算、
program Cmn(input,output);
function fax(x:integer):integer:
var
i:integer;
begin
fac:=1;
for i:=1 to x do
fac:=fac*i;
end;
function c(a,b:integer):real;
begin
c:=fac(a)/fac(b)*fac(a-b)
end;
begin
writeln(‘c(9,3)=‘,c(9,3));
writeln(‘c(8,5=‘,c(8,5));
end.
四、遞迴
函數或程序呼叫它本身,稱為遞迴。
[例1]、用遞迴計算n! {=m!/n!(m-n)!}
program fac_n(input,output);
var
n:integer;
function fac(n:integer):integer;
begin
if n=1 then fac:=1
else fac:=n*fac(n-1);
end;
[例2]、用遞迴計算
1)、function power(a,b:integer):integer;
begin
if b=1 then power:=a
else power:=a*power(a,b-1);
end;
2)、procedure power(a,b:integer;var c:integer);
begin
if b=1 then c:=a
else power(a,b-1,c);
c:=a*c;
end;
[例3]、輸入一串字串(以‘.’結束)按逆順輸出
program revers(input,output);
procedure rever;
var
c:char;
begin
read(c);
if c<>‘.‘ then rever;
write(c);
end;
begin
rever;
end.
五、標識符的範圍
1、全域變數和局部變數
1)、全域變數:在主程式中被說明,範圍:整個程式;
2)、局部變數:在子程式中被說明,範圍:主程式及其下級的程式。
2、子程式(function、precedure)的範圍
一個子程式可以調用它的下一級了程式,或可以調用在它之前定義的同級子程式。
[例]寫出程式啟動並執行結果。
program range(input,output);
var
x,y:integer;
procedure p1;
var
x,z:integer;
begin
x:=10; y:=y+1; z:=10;
writeln(x,y,z);
end;
begin
x:=1; y:=1;
writeln(x,y);
p1;
writeln(x,y,z);
end.
結果為:
(x y z)
1 1
10 2 10
1 2 (error)
3、在子程式中被改變值的變數可以回傳的兩種方法:
a、變數參數 procedure(var 變數名);
b、在上一級程式定義了的,且在下一級程式未被重新定義的。
[注]如果主程式的變數在子程式被重新定義,在子程式中主程式的變數被穩藏,在主程式中子程式的變數無效。
Delphi基本之pascal文法(第五章.函數與過程程式設計)