2.1.8.4 過程和函數(shù)的語句部分
過程或函數(shù)的語句部分由begin開始,end結(jié)束。函數(shù)需要一個返回值?梢詫⒎祷刂蒂x給函數(shù)名稱,也可以將返回值賦給Result變量。下面的例程將返回值賦給函數(shù)名稱:
function CalculateInterest(Principal,InterestRate: Double):Double;
begin
CalculateInterest := Principal * InterestRate;
end;
將返回值賦給Result變量也是可以的,則上面的程序改為:
Result := Principal*InterestRate;
下面是這個函數(shù)的調(diào)用方法:
InterestEarned :=CalculateInterest(2000,0.012);
在Implementation后面的過程和函數(shù),可以且只能被此庫單元的事件處理過程使用。要讓過程和函數(shù)可以被其他的程序庫單元使用,則需要將過程或函數(shù)的標(biāo)題部分放在庫單元中的interface部分,而把含標(biāo)題的整個過程或函數(shù)放在庫單元的inplementation部分,并在要訪問這個過程或函數(shù)的庫單元的uses子句中加入說明這個過程或函數(shù)的庫單元名稱。
2.1.8.5 函數(shù)的遞歸調(diào)用
在Object Pascal中,過程或函數(shù)必須先說明再調(diào)用。上文的NoValue函數(shù)必須在使用它的事件處理過程之前說明和執(zhí)行,否則程序會報告一個未知標(biāo)識符的錯誤。
以上規(guī)則在遞歸調(diào)用時是例外情況。所謂遞歸調(diào)用,是指函數(shù)A調(diào)用函數(shù)B,而函數(shù)B又調(diào)用函數(shù)A的情況。在遞歸調(diào)用中,函數(shù)要進(jìn)行前置,即在函數(shù)或過程的標(biāo)題部分最后加上保留字forword。下文的例程是一個遞歸調(diào)用的典型例子:
…
implementation
var
alpha:Integer;
procedure Test2(var A:Integer):forword;
{Test2被說明為前置過程}
procedure Test1(var A:Integer);
begin
A :=A-1;
if A>0 then
test2(A); {經(jīng)前置說明,調(diào)用未執(zhí)行的過程Test2}
writeln(A);
end;
procedure Test2(var A:Integer);{經(jīng)前置說明的Test2的執(zhí)行部分}
begin
A :=A div 2;
if A>0 rhen
test1(A); {在Test2中調(diào)用已執(zhí)行的過程Test1}
end;
procedure TForm1.Button1Click(Sender:TObject);
begin
Alpha := 15; {給Alpha賦初值}
Test1(Alpha); { 第一次調(diào)用Test1,遞歸開始}
end;
按鈕的OnClick事件處理過程給Alpha賦初值,并實(shí)現(xiàn)先減1再除2的循環(huán)遞歸調(diào)用,直到Alpha小于0為止。
2.1.8.6 過程和函數(shù)的參數(shù)
當(dāng)您的程序代碼在調(diào)用一個過程或函數(shù)時,通常用參數(shù)傳遞數(shù)據(jù)到被調(diào)用的過程或函數(shù)中。最常用的參數(shù)有數(shù)值參數(shù)、變量參數(shù)和常量參數(shù)三種。
由被調(diào)用過程或函數(shù)定義的參數(shù)為形參,而由調(diào)用過程或函數(shù)指明的參數(shù)叫實(shí)參。在NoValue函數(shù)中,說明函數(shù)體中的AnEditBox是形參,而調(diào)用時在if NoValue(Edit1)…中,Edit1是實(shí)參。
數(shù)值參數(shù)在運(yùn)行過程中只改變其形參的值,不改變其實(shí)參的值,即參數(shù)的值不能傳遞到過程的外面。試看下面的例程:
procedure Calculate(CalNo:Integer);
begin
CalNo := CalNo*10;
end;
用以下例程調(diào)用Calculate函數(shù):
…
Number := StrToInt(Edit1.Text);
Calculate(Number);
Edit2.Text := IntToStr(Number);
…
Number接受由編輯框1輸入的數(shù)值,經(jīng)Calculate過程運(yùn)算。它是一個數(shù)值型實(shí)參。在進(jìn)入Calculate函數(shù)后,會把Number實(shí)參拷貝給形參CalNo,在過程中CalNo增大十倍,但并未傳遞出來,因此Number值并未改變,在編輯框2中顯示仍然是編輯框1中的輸入值。形參和實(shí)參占用不同的內(nèi)存地址,在過程或函數(shù)被調(diào)用時,將實(shí)參的值復(fù)制到形參占用的內(nèi)存中。因此出了過程或函數(shù)后,形參和實(shí)參的數(shù)值是不同的,但實(shí)參的值并不發(fā)生變化。
如果您想改變傳入的參數(shù)值,就需要使用變量參數(shù),即在被調(diào)用程序的參數(shù)表中的形參前加上保留字var。例如:
procedure Calculate(var CalNo : Integer);
則CalNo并不在內(nèi)存中占據(jù)一個位置,而是指向?qū)崊umber。當(dāng)一個變參被傳遞時,任何對形參所作的改變會反映到實(shí)參中。這是因為兩個參數(shù)指向同一個地址。將上一個例程中過程頭的形參CalNo前面加上var,再以同樣的程序調(diào)用它,則在第二個編輯框中會顯示計算的結(jié)果,把第一個編輯框中的數(shù)值放大十倍。這時形參CalNo和實(shí)參Number的值都是Nnmber初始值的10倍。
如果當(dāng)過程或函數(shù)執(zhí)行是要求不改變形參的值,最保險的辦法是使用常量參數(shù)。在參數(shù)表的參數(shù)名稱前加上保留字const可以使一個形參成為常量參數(shù)。使用常量參數(shù)代替數(shù)值參數(shù)可以保護(hù)您的參數(shù),使您在不想改變參數(shù)值時不會意外地將新的值賦給這個參數(shù)。
相關(guān)推薦:2010年9月計算機(jī)等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |