Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
Chơng 7. Ngôn ngữ lập trình Pascal
I. GIớI THIệU
Pascal là tên của một trong các ngôn ngữ lập trình cấp cao thông dụng. Ngôn
ngữ lập trình Pascal đợc giáo s Niklaus Wirth ở trờng Đại học Kỹ thuật Zurich (Thụy
sĩ) thiết kế và công bố vào năm 1970. Niklaus Wirth đặt tên cho ngôn ngữ này là
Pascal để tởng nhớ đến nhà Toán học và Triết học Pháp ở thế kỷ 17 là Blaise Pascal,
ngời đã phát minh ra một máy tính cơ khí đơn giản đầu tiên của con ngời.
Ngôn ngữ Pascal đợc dùng hiện nay có nhiều điểm khác biệt với chuẩn Pascal
nguyên thủy của Giáo s Wirth. Tùy theo quốc gia hoặc công ty đã phát triển cho ra
đời các chơng trình biên dịch ngôn ngữ Pascal nh:
- ISO PASCAL (International Standards Organization) của Châu Âu
- ANSI PASCAL (American National Standards Institute) của Mỹ
- TURBO PASCAL của hãng BORLAND (Mỹ)
- IBM PASCAL của hãng Microsoft (Mỹ)
- v.v...
Đến nay, ngôn ngữ Pascal đã phát triển đến phiên bản Turbo Pascal Version 7.
Các diễn giải và ví dụ trong giáo trình này chủ yếu sử dụng chơng trình Turbo Pascal
5.5 - 7.0, hiện đang đợc sử dụng rộng rãi ở Việt Nam.
II. CáC PHầN Tử CƠ BảN CủA NGÔN NGữ PASCAL
II.1. Bộ ký tự
- Bộ 26 chữ Latin:
Chữ in : A, B, C,..., X, Y, Z
Chữ thờng : a, b, c,..., x, y, z
- Bộ chữ số thập phân : 0, 1, 2, 3,..., 8, 9
- Ký tự gạch nối dới : _
- Các ký hiệu toán học : +, -, *, /, =, <, >, (, ), [,}
II.2. Từ khóa
Là các từ riêng của Pascal, có ngữ nghĩa đã đợc xác định, không đợc dùng nó
vào các việc khác hoặc đặt tên mới trùng với các từ khóa.
- Từ khóa chung: PROGRAM, BEGIN, END, PROCEDURE, FUNCTION
Khi viết chơng trình ta nên đặt các danh hiệu sao cho chúng nói lên các ý
nghĩa của đối tợng mà chúng biểu thị. iều này giúp chúng ta viết chơng trình dễ dàng
và ngời khác cũng dễ hiểu nội dung chơng trình. interger
III. CấU TRúC MộT CHƯƠNG TRìNH PASCAL
Hình 6.1: Sơ đồ cấu trúc chơng trình Pascal
Ví dụ 6.3:
PROGRAM Hello; {Dòng tiêu đề}
USES Crt; {Lời gọi sử dụng các đơn vị chơng trình}
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
VAR Name: string; {Khai báo biến}
PROCEDURE Input; {Có thể có nhiều Procedure và Function}
Begin
ClrScr; {Lệnh xóa màn hình}
Write(' Hello ! What is your name ?... ');Readln(Name);
End;
BEGIN {Thân chơng trình chính}
Input;
Writeln (' Welcome to you, , Name');
Writeln (' Today, we study PASCAL PROGRAMMING... ');
Readln;
END.
Một chơng trình Pascal có các phần:
* Phần tiêu đề:
Phần này bắt đầu bằng từ khóa Program rồi tiếp đến là tên của chơng trình và
chấm dứt bằng dấu chấm phẩy (;)
Tên chơng trình phải đợc đặt theo đúng qui cách của danh hiệu tự đặt. Phần
tiêu đề có hay không cũng đợc.
* Phần khai báo dữ liệu:
Trớc khi sử dụng biến nào phải khai báo biến đó, nghĩa là xác định rõ xem
Trong Pascal các kiểu dữ liệu gồm các loại sau:
- Kiểu đơn giản (Simple type): bao gồm kiểu số nguyên (Integer), kiểu số thực
(Real), kiểu logic (Boolean), kiểu ký tự (Char).
- Kiểu có cấu trúc (Structure type): bao gồm mảng (Array), chuỗi (String), bản
ghi (Record), tập hợp (Set), tập tin (File).
- Kiểu chỉ điểm (pointer):
Trong chơng này, chúng ta chỉ xét các kiểu dữ liệu đơn giản.
IV.2. Kiểu số nguyên (Integer type)
IV.2.1. Kiểu số nguyên thuộc Z chứa trong Turbo Pascal
Đợc định nghĩa với các từ khóa sau:
Từ khoa Số byte Phạm vi
BYTE 1 0.. 255
SHORTINT 1 - 128.. 127
INTEGER 2 - 32768.. + 32767
WORD 2 0.. 65535
LONGINT 4 - 2147483648.. 2147483647
Var
I:byte;
s: integer;
.
S:=1;
For i:=1 to 8 do s:=S*i;
IV.2.2. Các phép toán số học đối với số nguyên
Ký hiệu
ý nghĩa
+ Cộng
- Trừ
* Nhân
/ Chia cho kết quả là số thực
DIV Chia lấy phần nguyên
Một dữ liệu thuộc kiểu BOOLEAN là một đại lợng đợc chứa trong 1 byte ở
Turbo Pascal và chỉ có thể nhận đợc một trong hai gía trị logic là TRUE (đúng) và
FALSE (sai).
Qui ớc: TRUE > FALSE
Các phép toán trên kiểu Boolean:
A B NOT A A AND B A OR B A XOR B
TRUE TRUE FALSE TRUE TRUE FALSE
TRUE FALSE FALSE FALSE TRUE TRUE
FALSE TRUE TRUE FALSE TRUE TRUE
FALSE FALSE TRUE FALSE FALSE FALSE
Nhận xét:
Phép AND (và) chỉ cho kết quả là TRUE khi cả 2 toán hạng là TRUE
Phép OR (hoặc) chỉ cho kết quả là FALSE khi cả 2 toán hạng là FALSE
Phép XOR (hoặc triệt tiêu) luôn cho kết quả là TRUE khi cả 2 toán hạng là khác
nhau và ngợc lại.
Các phép toán quan hệ cho kết quả kiểu Boolean:
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
Ký hiệu
ý nghĩa
< > khác nhau
= bằng nhau
> lớn hơn
< nhỏ hơn
> = lớn hơn hoặc bằng
< = nhỏ hơn hoặc bằng
IV.
5. Kiểu ký tự (Char type)
Tất cả các dữ liệu viết ở dạng chữ ký tự đợc khai báo bởi từ khóa CHAR.
Một ký tự đợc viết trong hai dấu nháy đơn ( ). ể tiện trao đổi thông tin cần phải
Sự truy xuất của biến nghĩa là đọc giá trị hay thay đổi giá trị của biến đợc thực
hiện thông qua tên biến.
Ví dụ 6.5: Readln (x);
Writeln (x);
x:= 9;
Biến là một cấu trúc ghi nhớ dữ liệu vì vậy nó phải tuân theo qui định của kiểu
dữ liệu: một biến phải thuộc một kiểu dữ liệu nhất định.
V.2.2. Cách khai báo
VAR
<Tên biến>: <Kiểu biến>;
Ví dụ 6.6: VAR
a: Real;
b, c: Integer;
TEN: String [20]
X: Boolean;
Chon: Char;
Cần khai báo các biến trớc khi sử dụng chúng trong chơng trình. Khai báo một
biến là khai báo sự tồn tại của biến đó và cho biết nó thuộc kiểu gì.
V.3. Kiểu (Type)
V.3.1. Định nghĩa
Ngoài các kiểu đã định sẵn, Pascal còn cho phép ta định nghĩa các kiểu dữ liệu
khác từ các kiểu căn bản theo qui tắc xây dựng của Pascal.
V.3.2. Cách khai báo
TYPE
<Tên kiểu> = <Mô tả xây dựng kiểu>;
Ví dụ 6.7:
TYPE
SoNguyen = Integer;
Diem = Real;
Tuoi = 1.. 100;
Qui tắc 1: Các phép toán nào có u tiên cao hơn sẽ đợc tính trớc.
Qui tắc 2: Trong các phép toán có cùng thứ tự u tiên thì sự tính toán sẽ đợc thực
hiện từ trái sang phải.
Qui tắc 3: Phần trong ngoặc từ trong ra ngoài đợc tính toán để trở thành một giá trị
đơn.
V.4.4. Kiểu của biểu thức
Là kiểu của kết quả sau khi tính biểu thức.
Ví dụ 6.11: Biểu thức sau đợc gọi là biểu thức Boolean:
not (('a'>'c') and ('c'>'C')) or ('B'='b') có giá trị TRUE
VI. CáC THủ TụC XUấT/NHậP
VI.1. Câu lệnh (statement)
VI.1.1. Trong một chơng trình Pascal, sau phần mô tả dữ liệu là phần mô tả các câu
lệnh. Các câu lệnh có nhiệm vụ xác định các công việc mà máy tính phải thực hiện để
xử lý các dữ liệu đã đợc mô tả và khai báo.
VI.1.2. Câu lệnh đợc chia thành câu lệnh đơn giản và câu lệnh có cấu trúc.
- Câu lệnh đơn giản
+ Vào dữ liệu : Read, Readln
+ Ra dữ liệu : Write, Writeln
+ Lệnh gán : :=
+ Lời gọi chơng trình con (gọi trực tiếp tên của chơng trình con)
+ Xử lý tập tin: RESET, REWRITE, ASSIGN...
- Câu lệnh có cấu trúc
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
+ Lệnh ghép: BEGIN.. END
+ Lệnh chọn : IF.. THEN.. ELSE
CASE.. OF.
+ Lệnh lặp : FOR.. TO.. DO
REPEAT.. UNTIL
WHILE.. DO
Một nhóm câu lệnh đơn đợc đặt giữa 2 chữ BEGIN và END sẽ tạo thành một
câu lệnh ghép.
Trong Pascal ta có thể đặt các lệnh ghép con trong các lệnh ghép lớn hơn bao
ngoài của nó và có thể hiểu tơng tự nh cấu trúc ngoặc đơn ( ) trong các biểu thức toán
học.
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
* Sơ đồ:
Hình 6.2: Sơ đồ cấu trúc BEGIN.. END;
ở hình minh họa trên ta dễ thấy các nhóm lệnh thành từng khối (block). Một
khối lệnh bắt đầu bằng BEGIN và chấm dứt ở END;. Trong một khối lệnh cũng có
thể có các khối lệnh con nằm trong nó. Một khối chơng trình thờng đợc dùng để
nhóm từ 2 lệnh trở lên để tạo thành một <Công việc> của các lệnh có cấu trúc, ta có
thể gặp khái niệm này trong nhiều ví dụ ở các phần sau.
VI.3. Cấu trúc rẽ nhánh
VI.3.1.Lệnh IF.. THEN.. và Lệnh IF.. THEN.. ELSE..
* Lu đồ diễn tả các lệnh và ý nghĩa cách viết:
Hình 6. 3: Lệnh IF <Điều kiện> THEN <Công việc>;
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
Hình 6. 4: Lệnh IF.. THEN.. ELSE..;
Chú ý:
- iều kiện là một biểu thức Boolean.
- Nếu <Công việc>sau THEN hoặc ELSE có nhiều hơn một lệnh thì ta
phải gói lại trong BEGIN.. END;
- Toàn bộ lệnh IF.. THEN.. ELSE xem nh 1 lệnh đơn.
Ví dụ 6.13: Tính căn bậc 2 của một số
PROGRAM Tinh_can_bac_hai;
GT
i
: Công việc i; Nếu có giá trị i (GT i) thì thi hành Công việc i
....................... ....................................
[ELSE Công việc 0;] Nếu không có giá trị nào thỏa thì thực hiện
Công việc 0
END; Kết thúc lệnh CASE
Ghi chú:
- Lệnh CASE.. OF có thể không có ELSE
- Biểu thức chọn là kiểu rời rạc nh Integer, Char, không chọn kiểu Real
- Nếu muốn ứng với nhiều giá trị khác nhau của biểu thức chọn vẫn thi hành
một lệnh thì giá trị đó có thể viết trên cùng một hàng cách nhau bởi dấu phẩy (,): Giá
trị k1, k2,..., kp: Lệnh k;
Ví dụ 6.14: PROGRAM Chon_mau;
VAR color: char;
BEGIN
write (' Chọn màu theo một trong 3 ký tự đầu là R / W / B ');
readln ( color);
CASE color OF
'R','r': write (' RED = màu đỏ ');
'W', 'w': write (' WHITE = màu trắng ');
'B', 'b': write (' BLUE = màu xanh dơng ');
END;
Readln;
END.
VI.4. Cấu trúc lặp
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
VI.4.1. Lệnh FOR
Cấu trúc FOR cho phép lặp lại nhiều lần một dãy lệnh. Số lần lặp lại dãy lệnh
Điều kiện trong cấu trúc lặp WHILE.. DO là một biểu thức logic kiểu Boolean chỉ
có 2 giá trị là úng (True) hoặc Sai (False)
Nếu điều kiện úng thì chơng trình sẽ chạy trong cấu trúc WHILE.. DO.
Sau mỗi lần lặp, chơng trình trở lại kiểm tra điều kiện. Tùy theo biểu thức logic
của điều kiện là úng hay Sai thì chơng trình sẽ thực hiện Công việc tơng ứng.
Nếu Sai thì chuyển xuống dới cấu trúc WHILE.. DO
Ví dụ 6.16: Chơng trình tính trung bình n số: x
1
+ x
2
+ x
3
+... + x
n
Program Trung_binh_Day_So;
VAR n, count: Integer;
x, sum, average: real;
BEGIN
count:= 1;
sum:= 0;
Write (' Nhập n = ');
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
readln (n);
WHILE count < n+1 DO
BEGIN
Write (' Nhập giá trị thứ', count,' của x = ' );
readln (x);
sum:= sum + x;
Write (' Nhập giá trị thứ', count, 'của x = ');
readln(x);
sum:= sum + x;
count:= count + 1;
UNTIL count > n;
Writeln (' Trung bình là =', sum/n: 8:2 );
Readln;
END.
Ghi chú:
So sánh 2 cách viết WHILE.. DO và REPEAT.. UNTIL ta thấy có sự khác biệt:
- Trong cấu trúc WHILE.. DO thì <iều kiện> đợc kiểm tra trớc, nếu thỏa <iều
kiện> thì mới thực hiện <Công việc>.
- Ngợc lại, trong cấu trúc REPEAT.. UNTIL thì <Công việc> sẽ đợc thực thi trớc
sau đó mới kiểm tra <iều kiện>, nếu không thỏa <iều kiện> thì tiếp tục thi hành
<Công việc> cho đến khi <iều kiện> là đúng.
Lệnh REPEAT.. UNTIL thờng đợc sử dụng trong lập trình, nhất là lúc ngời sử
dụng muốn tiếp tục bài toán ở trờng hợp thay đổi biến mà không phải trở về chơng
trình và nhấn tổ hợp phím Ctrl + F9 lại.
Ví dụ 6.18: Nhân 2 số a và b
PROGRAM Tich;
VAR a, b: integer;
CK: char;
BEGIN
REPEAT
Write (' Nhập số a = '); Readln (a);
Write (' Nhập số b = '); Readln (b);
Writeln (' Tích số của a x b là:', a*b: 10 );
Writeln (' Tiếp tục tính nữa không (CK) ? ');
Readln (CK);
UNTIL upcase(CK) = K; {hàm chuyển đổi ký tự trong biến}
THủ TụC NHậP ý NGHĩA
READ(x1, x2,..., xn) Nhập các biến x1, x2,..., xn theo hàng ngang
từ bàn phím (con trỏ không xuống hàng).
READLN(x1, x2,..., xn) Nhập các biến x1, x2,..., xn theo hàng dọc
từ bàn phím (mỗi lần nhập con trỏ xuống hàng).
READLN; Dừng chơng trình, đợi Enter mới tiếp tục.
ASSIGN(F, File_Name); Mở tập tin F có tên là File_Name
RESET(F); Chuẩn bị đọc tập tin
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
READ(F, x1, x2,..., xn); Đọc các giá trị trên tập tin F ra các biến x1, x2,..., xn
tơng ứng
CH:= ReadKey; Đọc một ký tự từ bàn phím vào biến ký tự CH
KEYPRESSED Một hàm có giá trị là TRUE nếu có một phím
đợc bấm và là FALSE nếu ngợc lại.
THủ TụC XUấT ý NGHĩA
WRITE(x1, x2,..., xn) Viết giá trị trong các biến x1, x2,..., xn ra màn hình
theo hàng ngang (con trỏ không xuống hàng).
WRITELN(x1, x2,..., xn) Viết giá trị trong các biến x1, x2,..., xn ra màn hình
theo hàng dọc (mỗi lần viết trị x có xuống hàng).
WRITELN; Xuống hàng
WRITELN(I: n); Viết ra giá trị của biến nguyên I vào n chỗ tính từ
phải sang trái. Nếu d chỗ (chữ số của I < n) sẽ để trống
WRITELN(R: n: m); Viết ra giá trị của biến thực R vào n chỗ, chỉ lấy
m số thập phân.
WRITELN( abc... ); Viết ra nguyên văn chuỗi ký tự abc...
WRITELN (LST, x1, x2,..., xn) Viết ra máy in các trị biến x1, x2,..., xn
ASSIGN(F, File_Name) Mở tập tin F có tên là File_Name
REWRITE(F); để chuẩn bị viết vào
WRITE (F, x1, x2,..., xn);Viết các giá trị x1, x2,..., xn vào tập tin F
cũng có điểm khác nhau. Hàm (function) trả lại một giá trị kết quả vô hớng thông qua
tên hàm và hàm đợc sử dụng trong biểu thức.
Ví dụ hàm chuẩn, nh hàm sin(x) mà chúng ta đã biết trong chơng trớc có thể đ-
ợc xem nh một chơng trình con kiểu function với tên là sin và tham số là x. Trong khi
đó, thủ tục (procedure) không trả lại kết quả thông qua tên của nó, do vậy, ta không
thể viết các thủ tục trong biểu thức. Các lệnh Writeln, Readln trong chơng trớc đợc
xem nh các thủ tục chuẩn.
Một chơng trình có chơng trình con tự thiết lập có 3 khối (block):
* Khối khai báo
* Khối chơng trình con
* Khối chơng trình chính
II. THủ TụC Và HàM
* Một số khái niệm biến:
Biến toàn cục (global variable): Còn đợc gọi là biến chung, là biến đợc
khai báo ở đầu chơng trình, nó đợc sử dụng bên trong chơng trình chính và cả bên
trong chơng trình con. Biến toàn cục sẽ tồn tại trong suốt quá trình thực hiện chơng
trình.
Biến cục bộ (local variable): Còn đợc gọi là biến riêng, là biến đợc khai
báo ở đầu chơng trình con, và nó chỉ đợc sử dụng bên trong thân chơng trình con
hoặc bên trong thân chơng trình con khác nằm bên trong nó (các chơng trình con
lồng nhau). Biến cục bộ chỉ tồn tại khi chơng trình con đang hoạt động, nghĩa là biến
cục bộ sẽ đợc cấp phát bộ nhớ khi chơng trình con đợc gọi để thi hành, và nó sẽ đợc
giải phóng ngay sau khi chơng trình con kết thúc.
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
Tham số thực (actual parameter) là một tham số mà nó có thể là một biến
toàn cục, một biểu thức hoặc một giá trị số (cũng có thể biến cục bộ khi sử dụng ch-
ơng trình con lồng nhau) mà ta dùng chúng khi truyền giá trị cho các tham số hình
thức tơng ứng của chơng trình con.
Tham số hình thức (formal parameter) là các biến đợc khai báo ngay sau
yn: char;
PROCEDURE maximum;
VAR max: integer;
BEGIN
IF a > b THEN max:= a ELSE max:= b;
IF c > max THEN max:= c;
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
Writeln (' Số lớn nhất là', max );
END;
BEGIN (* oạn chơng trình chính *)
yn:= Y;
WHILE ( upcase(yn) = Y ) DO
BEGIN
Writeln (' Nhập 3 số nguyên: ');
Readln (a, b, c );
maximum; (* --- Lời gọi thủ tục maximum --- *)
Write (' Tiếp tục nhập 3 số mới không (y/n) ? ');
Readln (yn);
END;
END.
Chú ý:
Trong chơng trình trên, thủ tục maximum đợc khai báo trớc khi nó đợc truy
xuất, các biến a, b, c đợc gọi nhập vào ở chơng trình chính và biến max đợc định
nghĩa bên trong thủ tục. iều này cho ta thấy, không phải lúc nào cũng cần thiết khai
báo biến ngay đầu chơng trình chính.
b. Cấu trúc của thủ tục có tham số
PROCEDURE < Tên thủ tục > (<danh sách tham số hình thức: kiểu
biến>);
{Các khai báo hằng, biến, kiểu cục bộ...}
Readln;
END.
Trong chơng trình trên m là các tham số hình thức của thủ tục giaithua.
Khi gọi thủ tục giaithua (n) thì tham số thực n đợc truyền tơng ứng cho tham
số hình thức m.
Ví dụ 7.3: Giải phơng trình ax2 + bx + c = 0, theo dạng chơng trình con lồng nhau:
PROGRAM Giai_PTB2;
VAR hsa, hsb, hsc:real; {các biến toàn cục}
PROCEDURE Ptb2(a,b,c:real); {a, b, c là các tham số hình thức của Ptb2}
Var delta:real; {biến cục bộ}
PROCEDURE Ptb1(a1,b1:real); {a,b là các tham số hình thức của Ptb1}
Begin
if a1=0 then
if b1=0 then
writeln('Phơng trình vô số nghiệm')
else
writeln('Phơng trình vô nghiệm')
else
writeln('Phơng trình có nghiệm =',-b1/a1:8:2);
End; {kết thúc thủ tục Ptb1}
Begin {bắt đầu thủ tục Ptb2}
(3) if a=0 then ptb1(b,c) {b, c là các tham số thực cho Ptb1}
(4) else
begin
delta:=sqr(b)-4*a*c;
if delta>0 then
begin
writeln('Nghiệm x1= ',(-b+sqrt(delta))/(2*a):8:2);
writeln('Nghiệm x2= ',(-b-sqrt(delta))/(2*a):8:2);
end
FUNCTION <Tên hàm> (<Tham số hình thức: kiểu biến>): <Kiểu kết
quả>;
{các khai báo hằng, biến, kiểu cụcbbộ...}
BEGIN
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]
Nguyễn Thanh Bình Khoa K33 Tin học, trờng ĐHSP Hà Nội 2 Điện thoại: 02113.505.909
{... các khai báo trong nội bộ hàm...}
END;
Trong đó:
- Tên hàm là tên tự đặt cần tuân thủ theo nguyên tắc đặt tên trong Pascal.
- Kiểu kết quả là một kiểu vô hớng, biểu diễn kết quả giá trị của hàm.
- Một hàm có thể có 1 hay nhiều tham số hình thức, khi có nhiều tham số hình
thức cùng một kiểu giá trị thì ta có thể viết chúng cách nhau bằng dấu phẩy (,). Trờng
hợp các tham số hình thức khác kiểu thì ta viết chúng cách nhau bằng dấu chấm phẩy
(;).
- Trong hàm có thể sử dụng các hằng, kiểu, biến đã đợc khai báo trong chơng
trình chính nhng ta có thể khai báo thêm các hằng, kiểu, biến dùng riêng trong nội bộ
hàm. Chú ý là phải có một biến trung gian có cùng kiểu kết quả của hàm để lu kết
quả của hàm trong quá trình tính toán để cuối cùng ta có 1 lệnh gán giá trị của biến
trung gian cho tên hàm.
Ví dụ 7.4: FUNCTION TINH (x, y: integer; z: real ): real;
Đây là một hàm số có tên là TINH với 3 tham số hình thức x, y, z. Kiểu của x
và y là kiểu số nguyên integer còn kiểu của z là kiểu số thực real. Hàm TINH sẽ cho
kết quả kiểu số thực real.
Ví dụ 7.5: Bài toán tính giai thừa (factorials)
PROGRAM giaithua;
VAR x: integer;
FUNCTION factorial (n: integer): integer;
VAR heso, tichso: integer;
BEGIN
nguyên}
Tiếp đến, dùng 2 kiểu dữ liệu mới định nghĩa Str25 và M10 để định kiểu cho
các tham số hình thức hoten và mang nh sau:
Procedure Xuat1(hoten: Str25);
Procedure Xuat2(mang: M10);
III. TRUYềN THAM Số CHO CHƯƠNG TRìNH CON
Khi truyền tham số trong Pascal, đòi hỏi phải có sự tơng ứng về tên của kiểu
dữ liệu của các tham số hình thức và tham số thực. Một số định nghĩa và qui tắc về
truyền tham số trong Pascal:
- Những tham số hình thức nằm sau từ khóa VAR gọi là tham số biến (variable
parameter). Với tham số biến, các tham số thực bắt buộc phải là biến chứ không đợc
là giá trị. Khi giá trị của tham số biến thay đổi thì nó sẽ làm thay đổi giá trị của tham
số thực tơng ứng và khi ra khỏi chơng trình con đó, tham số thực vẫn giữ giá trị đã
đợc thay đổi đó.
- Những tham số hình thức không đứng sau từ khóa VAR gọi là tham số trị
(value parameter), khi đó các tham số thực có thể là một biến, một biểu thức, một
hằng, hoặc một giá trị số. Các tham số trị nhận giá trị từ tham số thực khi truyền nh là
giá trị ban đầu, khi giá trị của tham số trị thay đổi thì nó sẽ không làm thay đổi giá trị
của tham số thực, nghĩa là giá trị của tham số thực sau khi thoát khỏi chơng trình con
vẫn luôn bằng với giá trị của tham số thực trớc khi truyền đến chơng trình con đó.
Do vậy một tham trị không bao giờ là kết quả tính toán của chơng trình con.
Một vài thí dụ về tham số biến:
Ví dụ 7.7: Viết chơng trình tính lập phơng.
PROGRAM Parameter1;
VAR num: integer; {num là biến toàn cục}
PROCEDURE LapPhuong(var a:integer); {a là một tham số biến}
Begin
a:=a*a*a;
End;
Mọi chi tiết xin liên hệ theo địa chỉ : Email: [email protected]