Kiểu dữ liệu của tham số trong hàm và thủ tục thì không hạn chế.
Nhưng nếu là kiểu chuỗi (trừ kiểu String) hay kiểu tự xây dựng thì phải
được định nghĩa trước bằng từ khóa Type.
Ví dụ, khai báo sau là sai:
Function F( x : array[1.10] of Real) : Integer ;
Function F( St : String[20]) : Char ;
19 trang |
Chia sẻ: maiphuongdc | Lượt xem: 15530 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Pascal - Hàm (function), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
HÀM (Function)
12.2.1. Các đặc trưng của hàm:
Các yếu tố đặc trưng cho một hàm gồm có:
Tên hàm
Kiểu dữ liệu của các tham số
Kiểu dữ liệu của gía trị hàm
Ví dụ :
Hàm Sqrt(x): cho căn hai của x. Tên hàm là Sqrt, tham số x là nguyên
hay thực còn gía trị hàm kiểu thực, ví dụ Sqrt(4)=2.0.
Hàm Chr(k): cho ký tự có mã là k. Tên hàm là Chr, tham số k kiểu
nguyên còn gía trị hàm kiểu ký tự, ví dụ Chr(65)=‘A’.
Hàm Odd(k): cho True hay False tùy theo k là lẻ hay chẵn. Tên hàm là
Odd, tham số k kiểu nguyên và gía trị hàm kiểu lôgic? ví dụ Odd(4)=False.
Hàm Copy( St, k, n): cho chuỗi con gồm n ký tự của St tính từ vị trí k.
Tên hàm là Copy, có ba tham số là St kiểu chuỗi, k và n kiểu nguyên, và gía
trị hàm kiểu chuỗi? ví dụ Copy(‘ABCD’, 2, 3) = ‘BCD’.
Hàm Readkey : không có tham số, gía trị hàm kiểu ký tự, hàm nhận một
ký tự được gõ từ bàn phím.
Tóm lại, hàm có thể không có tham số hoặc có một đến nhiều tham số,
nhưng hàm luôn trả về một gía trị duy nhất.
Các tham số luôn luôn phải để trong cặp nháy đơn ( ), nếu có nhiều tham
số thì chúng phải phân cách nhau bằng dấu phẩy. Mỗi khi gọi hàm (call) ta
phải cho các tham số các gía trị cụ thể phù hợp với kiểu dữ liệu của tham số.
Ví dụ:
For k:=1 to 10 do S := S+ Sqrt(k);
y:= 3* Sqr(2) - Sin(pi/4) ;
Write( Chr(65) );
Cần phân biệt hai trạng thái của các tham số: trạng thái dùng để mô tả
hàm và trạng thái để gọi hàm. Khi khai báo hàm, các tham số chỉ mang tính
tượng trưng, nên gọi là tham số hình thức, còn khi gọi hàm, các tham số phải
là các biến hay các gía trị cụ thể nên gọi là các tham số thực sự.
Ví dụ, khi viết Sqrt(x) thì x là tham số hình thức, nó đại diện cho một gía
trị nào đó. Còn khi gọi hàm y:=Sqrt(4); thì 4 là tham số thực sự.
12.2.2. Khai báo hàm tự viết:
Tất cả các hàm có sẵn trong Turbo Pascal gọi là các hàm chuẩn, chúng có
thể được sử dụng mà không cần phải khai báo. Tuy nhiên số lượng các hàm
chuẩn thường không đáp ứng được yêu cầu đa dạng của người sử dụng, cho
nên khi thảo chương, ta thường phải tự xây dựng thêm các hàm mới.
Các hàm tự viết cần phải được khai báo, theo cú pháp sau:
Function Tênhàm(tênthamsố: kiểuthamsố : kiểugíatrị ;
{ Các khai báo dùng trong hàm }
Const ...
Type ...
Var ...
Begin
{Các lệnh của hàm}
End;
Tên hàm và tên tham số phải được đặt theo đúng quy tắc của một tên.
Thông thường tên hàm nên đặt sao cho gợi nhớ gía trị mà nó chứa. Tên tham
số ở mức khai báo này chỉ mang tính tượng trưng nên mới gọi là tham số
hình thức.
Nếu có nhiều tham số hình thức thuộc cùng một kiểu dữ liệu thì chúng
được viết phân cách nhau bằng dấu phẩy, ví dụ:
Function F(x, y : Integer) :Real;
ở đây hai tham số x và y cùng kiểu Integer.
Nếu các tham số có kiểu dữ liệu khác nhau thì phải khai báo riêng ra và
dùng dấu chấm phẩy để phân cách, ví dụ:
Function F( x: Integer ; y: Real): Real;
ở đây tham số x có kiểu Integer, còn tham số y có kiểu Real.
Như đã nói, hàm là một chương trình con nên nó cũng có đầ? đủ các thành
phần như một chương trình bình thường, tức là cũng có thể có khai báo hằng
(Const), khai báo kiểu dữ liệu mới (Type) và khai báo biến (Var). Thân của
hàm là các lệnh được đặt giữa hai từ khóa Begin và End , kết thúc bằng dấu
chấm phẩy ";" chứ không phải là dấu chấm.
Chú ý Trong hàm không có khai báo sử dụng thư viện chuẩn (Uses).
12.2.3. Cấu trúc chương trình Pascal có hàm tự viết:
Một chương trình có chứa hàm tự viết gọi là chương trình chính, còn hàm
gọi là chương trình con. Khai báo hàm tự viết phải được để sau phần khai
báo biến VAR và trước BEGIN của thân chương trình chính.
Tóm lại cấu trúc của một chương trình có chứa hàm tự viết là như sau:
PROGRAM TênCtchính;
Uses ... { khai báo dùng thư viện chuẩn}
Const ... { khai báo hằng}
Type .... { khai báo kiểu dữ liệu mới}
Var .... { khai báo biến của ctrình chính}
Function Tênhàm(tênthamsố: kiểuthamso? : kiểugíatrị;
{ Các khai báo Const, Type, Var dùng trong hàm }
Begin
{Các lệnh của hàm}
End;
BEGIN
{ Các lệnh của chương trình chính}
END.
12.2.4. Kiểu dữ liệu của tham số và gía trị hàm:
Kiểu dữ liệu của kết qủa của hàm không the?là mảng (array), bản ghi
(record), tập hợp (set) hay tập tin (file).
Khai báo hàm như dưới đây là sai:
Function F( x: Integer) : array[1..10] of Real;
Kiểu dữ liệu của kết qủa của hàm có thể là các kiểu đơn giản, chuỗi,
hay con trỏ. Nếu là kiểu liệt kê, đoạn con hay chuỗi (trừ kiểu String) thì phải
định nghĩa trước thông qua từ khóa Type.
Ví dụ, các khai báo như sau là sai:
Function F( x: Real) : String[20];
Function F( x: Real) : 1..31;
Mà phải định nghĩa kiểu trước :
Type
Str20= String[20];
Ngay = 1..31;
rồi mới khai báo:
Function F( x: Real) : Str20;
Function F( x: Real) : Ngay;
Tuy nhiên, với kiểu String thì khai báo sau là đúng:
Function F( x: Real) : String;
Kiểu dữ liệu của tham số trong hàm và thủ tục thì không hạn chế.
Nhưng nếu là kiểu chuỗi (trừ kiểu String) hay kiểu tự xây dựng thì phải
được định nghĩa trước bằng từ khóa Type.
Ví dụ, khai báo sau là sai:
Function F( x : array[1..10] of Real) : Integer ;
Function F( St : String[20]) : Char ;
Mà phải định nghĩa kiểu trước :
Type
Kmang =Array[1..10] of Real;
Kstr20= String[20];
rồi mới khai báo:
Function F( x : Kmang) : Integer ;
Function F( St : Kstr20) : Char ;
Tuy nhiên, với kiểu String thì khai báo sau là đúng:
Function F( St : String) : Boolean ;
12.2.5. Các ví dụ :
Ví dụ 12.1: Nhập dãy các số thực x1, x2, ..., xn, tính tổng :
Phân tích: Giả sử đã có hàm Canba(z) tính căn bậc ba của z, tức là :
khi đó, tổng S được tính như sau:
S:=0;
For i:=1 to N do S:=S + Canba( x[i] );
Ở đây hàm Canba được tính N lần ứng với các tham số thực sư?là các gía
trị x[i], i=1,..., N.
Vấn đề còn lại là phải viết hàm tính căn ba của z. Hàm này có tên là
Canba, tham số z kiểu thực, và gía trị hàm cũng kiểu thực, nó được xây dựng
như sau:
FUNCTION Canba( z: Real) :Real;
{ Hàm tính căn bậc ba của z}
Var
F: Real;
Begin
If z=0 then F:= 0;
If z>0 then F:= exp( 1/3*Ln(z) );
If z<0 then F:= - exp( 1/3*Ln(-z) );
Canba:=F ;
End;
Ðặt đoạn khai báo hàm trên đây vào ngay trước phần thân của chương
trình chính, ta được chương trình đầy đủ sau đây:
PROGRAM VID12_1;
Var
x : Array[1..20] of Real;
S : Real;
N, i : integer;
FUNCTION Canba( z: Real) :Real;
{ Hàm tính căn bậc ba của z}
Var
F: Real;
Begin
If z=0 then F:= 0;
If z>0 then F:= exp( 1/3*Ln(z) );
If z<0 then F:= - exp( 1/3*Ln(-z) );
Canba:=F ;
End;
BEGIN { vào chương trình chính}
Repeat
Write(‘ nhap N: ‘);
Readln(N);
Until ( N>0) and ( N<21);
S:=0;
For i:=1 to N do
begin
Write(‘nhap x[‘, i, ‘]:’);
Readln(x[i]);
S:=S + Canba( x[i] );
end;
Writeln(‘ S= ‘, S:8:2);
Readln;
END.
Chạy
Chép tập tin nguồn
Ví dụ 12.2: Nhập chuỗi St, đổi tất cả các ký tự của chuỗi thành chữ
thường, chẳng hạn St=‘ABcdE2’ thì đổi thành ‘abcde2’.
Giả sử đã có hàm Chuthuong(ch) đổi ký tự ch từ chữ hoa ra chữ thường,
ví dụ Chuthuong(‘A’)=‘a’, khi đó để đổi tất cả các ký tự của chuỗi St ra chữ
thường ta dùng lệnh:
For i:=1 to Length(St) do St[i]:= Chuthuong(St[i]);
Như vậy, ta phải viết hàm Chuthuong(ch) có tham số ch kiểu ký tự và gía
trị hàm cũng kiểu ký tự, và đặt khai báo hàm này vào ngay trước phần thân
của chương trình chính, như sau:
PROGRAM VIDU12_2;
Var
St : String;
N, i : integer;
FUNCTION Chuthuong( ch: Char):Char;
{ Hàm đổi chữ hoa ra chữ thường}
Var
C: Char;
Begin
If ( ch>=‘A’ ) and ( ch<=‘Z’) then C:=Chr( ord(ch)+32 )
else
C:=ch;
Chuthuong:=C;
End;
BEGIN { vào chương trình chính}
Write(‘ Nhập chuỗi chữ hoa St : ‘);
Readln(St);
N:=Length(St);
For i:=1 to N do St[i]:=Chuthuong( St[i] );
Writeln(‘ St = ‘, St);
Readln;
END.
Chạy
Chép tập tin nguồn
Ví dụ 12.3: Nhập số N nguyên dương và số thực x bất kỳ, tính:
Ta viết :
Vậy việc tính S được quy về việc tính các số hạng Ui rồi thực hiện phép
cộng dồn Ui vào S.
Ðể tính Ui ta nhận thấy tử số (x+i)i có dạng tổng quát là zk còn mẫu số (2i-
1)! có dạng tổng quát là k! . Thành ra, nếu đã có hai hàm :
* Hàm Lt(z, k) tính zk, tức là Lt(z, k)=zk
* Hàm Gt(k) tính k!, tức là Gt(k)=k!
thì việc tính S được thực hiện bằng các lệnh:
S:= Lt(Pi, 2)/4;
For i:=1 to N do S :=S + Lt(x+i, i)/Gt(2*i -1);
Trong lệnh gán đầu tiên, hàm Lt(z, k) được tính ứng với các tham số thật
là z=Pi và k=2.
Trong lệnh For, tại mỗi bước lặp ta có i là một số xác định, và hàm Lt(z,
k) được tính ứng với các tham số thật là z=x+i và k=i. Tương tự, hàm Gt(k)
được tính ứng với k=2*i-1.
Dưới đây là chương trình cụ thể :
PROGRAM VIDU12_3;
Var
S, x : Real;
N, i : Integer ;
Function Lt(z : Real ; k: Byte) : Real ;
{ hàm tính Lt=zk }
Var
j : Byte;
Q: Real;
Begin
Q:=1;
For j:=1 to k do Q:=Q*z;
Lt:=Q;
End;
Function Gt( k: Byte) : Real;
{ hàm tính Gt= k!}
Var
i : Byte;
Q: Real;
Begin
Q:=1;
For i:=1 to k do Q:=Q* i;
Gt:=Q;
End;
BEGIN { Chương trình chính }
Repeat
Write(‘ Nhập N và x :’);
Readln(N, x);
Until ( N>0);
S:= Lt(Pi, 2)/4;
For i:=1 to N do S:= S + Lt(x+i, i)/Gt(2*i -1);
Writeln(‘S= ‘, S:10:4);
Readln;
END.
Chạy
Chép tập tin nguồn
12.2.6. Các chú ý khi viết hàm:
Ta chọn chương trình con là hàm khi cần nhận lại một gía trị duy nhất
thông qua tên hàm, nhờ đó có thể dùng tên hàm trong các biểu thức. Ví dụ,
vì Gt(4) là một gía trị nên ta có thể viết :
k:= Gt(4) - 1 ;
Write( ‘ Giai thừa của 4 là ‘, Gt(4) );
Vì tên hàm chứa gía trị hàm nên trong thân của hàm phải có ít nhất
một lệnh gán :
TênHàm:= Biểuthức ;
Thông thường ta dùng một biến trung gian để tính gía trị hàm , xong xuôi
mới gán biến trung gian đó cho tên hàm trước khi kết thúc hàm. Ở ví dụ
12.1, trong hàm Canba ta dùng biến F để tính gía trị hàm, sau cùng mới gán
Canba:=F; trước khi kết thúc hàm.
Về phong cách lập trình, trong hàm nên tránh dùng các lệnh nhập hay in
dữ liệu (Readln, Write). Các tham số hình thức chính là các dữ liệu phục vụ
cho các tính toán trong hàm, chúng sẽ có gía trị cụ thể khi gọi hàm. Việc
nhập dữ liệu hay in kết qủa thường để trong thân chương trình chính.
Các file đính kèm theo tài liệu này:
- ham_2394.pdf