Một chương trình Pascal có thể có một số hoặc tất cả các khai báo dữ liệu sau: CONST : khai báo hằng * Phần khai báo chương trình con: Phần này mô tả một nhóm lệnh được đặt tên chung là
Trang 1PASCAL giúp sinh viên viết chương trình có cấu trúc sáng sủa, rõ ràng, dễhiểu và dễ đọc.
PASCAL là ngôn ngữ có cấu trúc mạnh mẽ cả về dữ liệu lẫn chương trình vàlệnh
II/ CÁC PHẦN TỬ CƠ BẢN CỦA PASCAL
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
PROGRAM, BEGIN, END, PROCEDURE, FUNCTION
- Từ khóa để khai báo:
CONST, VAR, TYPE, ARRAY, STRING, RECORD, SET, FILE, LABEL
- Từ khóa của lệnh lựa chọn:
IF THEN ELSE, CASE OF
- Từ khóa của lệnh lặp:
FOR TO DO, FOR DOWNTO DO, WHILE DO,
REPEAT UNTIL
Trang 2- Từ khóa điều khiển:
WITH, GOTO, EXIT, HALT
Reset, Rewrite
4 Danh hiệu tự đặt
Trong Pascal để đặt tên cho các biến, hằng, kiểu, chương trình con ta dùng
các danh hiệu (identifier) Danh hiệu của Pascal được bắt đầu bằng một chữ cái,
sau đó có thể là các chữ cái, chữ số hay là dấu nối, không được có khoảng trắng
và độ dài tối đa cho phép là 127
Ví dụ 2.1: Sau đây là các danh hiệu: x; S1; Delta; PT_bac_2
Pascal không phân biệt chữ thường và chữ hoa trong một danh hiệu
Trang 3III/ CẤU TRÚC MỘT CHƯƠNG TRÌNH PASCAL
Hình 1: Sơ đồ cấu trúc chương trình Pascal
Ví dụ 3.1:
PROGRAM Hello; { Dòng tiêu đề }
USES Crt; { Lời gọi sử dụng các đơn vị chương trình }
VAR Name : string; { Khai báo biến }
PROCEDURE Input; { Có thể có nhiều Procedure và Function }
Trang 4Tê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õ xembiến đó thuộc kiểu dữ liệu nào Một chương trình Pascal có thể có một số hoặc tất
cả các khai báo dữ liệu sau:
CONST : khai báo hằng
* Phần khai báo chương trình con:
Phần này mô tả một nhóm lệnh được đặt tên chung là một chương trình con đểkhi thân chương trình chính gọi đến thì cả nhóm lệnh đó được thi hành
Phần này có thể có hoặc không tùy theo nhu cầu
* Phần thân chương trình:
Phần thân chương trình là phần quan trọng nhất và bắt buộc phải có, phầnnày luôn nằm giữa 2 từ khoá là BEGIN và END Ở giữa là lệnh mà các chươngtrình chính cần thực hiện Sau từ khóa END là dấu chấm (.) để báo kết thúcchương trình
Ví dụ 3.2: Viết chương trình để tính diện tích hình tròn khi biết độ dài bán
kinh và tính diện tích hình vuông khi biết độ dài cạnh
PROGRAM THIDU4; (* Dòng tiêu đề *)
VAR
R, A, Dien_Tich: Real; (* Khai báo ba biến thực *)
BEGIN
Trang 5Write(' Bán kính R = ');
READLN(R); (* Đọc giá trị của R *)
Dien_Tich := PI*R*R; (* Tính diện tích hình tròn *)
Diện tích hình vuông = 6.5536000000E+00
IV/ CÁC KIỂU DỮ LIỆU CƠ SỞ: INTEGER, REAL, BOOLEAN, CHAR
1 Khái niệm
Dữ liệu (data) là tất cả những gì mà máy tính phải xử lý
Theo Niklaus Wirth:
CHƯƠNG TRÌNH = THUẬT TOÁN + CẤU TRÚC DỮ LIỆU Một kiểu dữ liệu (data type) là một qui định về hình dạng, cấu trúc và giá trịcủa dữ liệu cũng như cách biểu diễn và cách xử lý dữ liệu
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ảnghi (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
Trang 62 Kiểu số nguyên (Integer type)
a) 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:
PRED (n) n - 1 ODD (n) TRUE nếu n lẻ và FALSE nếu n chẵn
3 Kiểu số thực (Real type)
Ở Turbo Pascal, kiểu số thực thuộc tập hợp R chứa trong 6 bytes, được địnhnghĩa với từ khóa REAL: R =([2.9 x 10-39 , 1.7 x 1038 ]
Hay viết theo dạng số khoa học: R = ( [2.9E-39, 1.7E38]
Số thực có thể viết theo kiểu có dấu chấm thập phân bình thường hoặc viếttheo kiểu thập phân có phần mũ và phần định trị
Các phép toán số học cơ bản +, -, * , /dĩ nhiên được sử dụng trong kiểu real Bảng dưới đây là các hàm số học cho kiểu số thực:
ABS (x) |x| : lấy giá trị tuyệt đối của số x
SQR (x) x2 : lấy bình phương trị số x
SQRT(x) : lấy căn bậc 2 của trị số x
SIN(x) sin (x) : lấy sin của x
COS (x) cos (x) : lấy cos của x
ARCTAN (x) arctang (x)
Trang 7LN (x) ln x : lấy logarit nepe của trị x (e ( 2.71828)
TRUNC (x) lấy phần nguyên lớn nhất không vượt quá trị số x
ROUND (x) làm tròn giá trị của x, lấy số nguyên gần x nhất
4 Kiểu logic (Boolean)
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:
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:
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ầnphải sắp xếp, đánh số các ký tự, mỗi cách sắp xếp như vậy gọi là bảng mã Bảng
mã thông dụng hiện nay là bảng mã ASCII (xem lại chương 3)
Ðể thực hiện các phép toán số học và so sánh, ta dựa vào giá trị số thứ tự
mã ASCII của từng ký tự, chẳng hạn: 'A' < 'a' vì số thứ tự mã ASCII tương ứng là
65 và 97
Trong Turbo Pascal mỗi ký tự được chứa trong 1 byte
Các hàm chuẩn liên quan đến kiểu ký tự:
Trang 8KÝ HIỆU Ý NGHĨA
ORD(x) Cho số thứ tự của ký tự x trong bảng mã
CHR(n) hay #n Cho ký tự có số thứ tự là n
PRED(x) Cho ký tự đứng trước x
SUCC(x) Cho ký tự đứng sau x
V/CÁC KHAI BÁO HẰNG, BIẾN, KIỂU, BIỂU THỨC,
1 Hằng (constant)
a) Ðịnh nghĩa:
Hằng là một đại lượng có giá trị không đổi trong quá trình chạy chương trình
Ta dùng tên hằng để chương trình được rõ ràng và dễ sửa đổi
có thể được biến đổi trong thời gian sử dụng biến
Sự truy xuất của biến nghĩa là đọc giá trị hay thay đổi giá trị của biến đượcthực hiện thông qua tên biến
Ví dụ 5.2: 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ủakiểu dữ liệu : một biến phải thuộc một kiểu dữ liệu nhất định
b) Cách khai báo
VAR
<Tên biến> : <Kiểu biến> ;
Trang 9Ví dụ 5.3: 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áomộ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ì
Tuoi = 1 100 ; Color = (Red, Blue, Green) ; Thu = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ;
Và khi đã khai báo kiểu gì thì ta có quyền sử dụng để khai báo biến như ở ví
dụ sau:
Ví dụ 5.5: VAR
i, j : SoNguyen ; Dtb : Diem ;
T : tuoi ; Mau : Color ; Ngay_hoc : Thu;
4 Biểu thức (Expression)
Trang 101 Biểu thức trong ngoặc đơn ( )
c) Qui ước tính thứ tự ưu tiên
Khi tính một biểu thức có 3 qui tắc về thứ tự ưu tiên như sau:
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
d) 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ụ 5.8: 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
1 Câu lệnh (statement)
a) Ý nghĩa
Trang 11Trong một chương trình Pascal, sau phần mô tả dữ liệu là phần mô tả cáccâ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ựchiện để xử lý các dữ liệu đã được mô tả và khai báo
b) Phân loại câu lệnh:
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
+ 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
Trang 12x, y : Real ;
p, q : Boolean ; thì ta có thể có các phép gán sau :
- Lưu trữ các giá trị khác nhau vào một ô nhớ tại những thời điểm khác nhau
- Một quá trình tính toán có thể coi như là một quá trình làm thay đổi giá trịcủa một (hay một số) ô nhớ nào đó, cho đến khi đạt được giá trị cần tìm
* Sơ đồ:
Trang 13Hình 6.1: 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ộtkhố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
3 Cấu trúc rẽ nhánh
a) Lệnh IF THEN và Lệnh IF THEN ELSE
* Lưu đồ diễn tả các lệnh và ý nghĩa cách viết:
Hình 6 2: Lệnh IF <Ðiều kiện> THEN <Công việc>;
Trang 14
Hình 6 3: 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.2: Tính căn bậc 2 của một số
PROGRAM Tinh_can_bac_hai ;
VAR
a : Real ; BEGIN
Write ( Nhập số a = ) ; Readln(a) ;
IF a < 0 THEN
Write (' a : 10 : 2 , là số âm nên không lấy căn được !!! ') ELSE
Trang 15Writeln (' Căn số bậc 2 của , a : 2 : 2 , la , SQRT(a) :10 : 3 '); Writeln (' Nhấn ENTER để thoát ') ;
Readln; {Dừng màn hình để xem kết quả}
END
Ghi chú:
Trong chương trình trên, a ta thấy có dạng a :m :n với ý nghĩa m là số địnhkhoảng mà phần nguyên của a sẽ chiếm chỗ và n là khoảng cho số trị phần thậpphân của a
CASE <Biểu thức > OF Xét giá trị của biểu thức chọn
GT1 : Công việc 1 ; Nếu có giá trị 1 (GT1) thì thi hành Công việc 1
GTi : 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;
Ghi chú:
Trang 16- 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ànhmộ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 ;
Readln;
END
4 Cấu trúc lặp
a) 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
đã biết trước Phát biểu FOR có 2 dạng:
Trang 17* Lưu đồ:
Hình 6 5: Lưu đồ phát biểu FOR TO DO
Chú ý: Trị đầu, trị cuối là các biến hoặc hằng và biến đếm phải là kiểu rời rạc
Trang 18Hình 6 6: Lưu đồ cấu trúc WHILE DO
- 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ứclogic 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
Trang 19Ví dụ 6.5: Chương trình tính trung bình n số: x1 + x2 + x3 + + xn
Program Trung_binh_Day_So ;
VAR n, count : Integer ;
x, sum, average : real ; BEGIN
count := 1 ; sum := 0 ; Write (' Nhập n = ') ; readln (n) ;
average := sum/n ; Writeln (' Trung bình là =' , average : 10 : 3 ) ; Writeln (' Nhấn Enter để thoát ' ) ;
Readln ; END
c) Lệnh REPEAT UNTIL
Câu lệnh REPEAT UNTIL dùng trong các trường hợp khi biến điều khiển không
có kiểu rời rạc và đặc biệt trong các trường hợp số lần lặp không biết trước
Hình 6.8: Lưu đồ cấu trúc của REPEAT UNTIL
* Ý nghĩa câu lệnh:
Trang 20Nếu điều kiện logic là Sai (False) thì lặp lại lệnh cho đến khi điều kiện Ðúngthì mới thoát ra khỏi cấu trúc REPEAT UNTIL
Nếu có nhiều câu lệnh thì mỗi lệnh ngăn cách nhau bằng dấu chấm phẩy(;)Công việc của REPEAT và UNTIL không nhất thiết phải dùng lệnh ghép đểnhóm từ 2 lệnh đơn trở lên thành công việc
Hình 6.9: Sơ đồ cú pháp REPEAT UNTIL
Ví dụ 6.6: Với bài toán trung bình cộng một dãy số ở ví dụ trước có thể viết
theo cấu trúc REPEAT UNTIL như sau:
Writeln (' Trung bình là =' , sum/n : 8 :2 ) ; Readln ;
END
Trang 21Ghi 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ựcthi 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ụcthi 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úcngườ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ảitrở về chương trình và nhấn tổ hợp phím Ctrl + F9 lại
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} {CK thành ký tự in hoa}
END
Trang 22CHƯƠNG II CHƯƠNG TRÌNH CON VÀ ÐƠN VỊ CHƯƠNG TRÌNH
I/ KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON
Khi lập trình, chúng ta thường có những đoạn chương trình hay phép tính lặplại nhiều lần Nếu mỗi lần lặp lại, ta phải viết những đoạn lệnh như nhau thìchương trình của chúng ta trở nên dài dòng, rối rắm và mất thời gian vô ích Ðểgiải quyết những trường hợp như vậy, Pascal cho phép chúng ta tạo ra cácmodule, mỗi module mang một đoạn chương trình gọi là chương trình con(subroutine hay subprogram) Mỗi chương trình con sẽ mang một cái tên khácnhau Một module chỉ cần viết một lần và sau đó chúng ta có thể truy xuất nónhiều lần, bất kỳ nơi nào trong chương trình chính Khi cần thiết, chúng ta chỉviệc gọi tên chương trình con đó ra để thi hành lệnh
Nhờ sử dụng chương trình con, chương trình có thể tiết kiệm được ô nhớ.Ðồng thời, ta có thể kiểm tra tính logic trong tiến trình lập trình cho máy tính điện
tử, có thể nhanh chóng loại bỏ những sai sót khi cần hiệu chỉnh hay cải tiếnchương trình Ðây là khái niệm cơ bản trong ý tưởng lập chương trình có cấu trúc.Một quá trình tính cũng có thể có nhiều chương trình con lồng ghép vào nhau Trong Pascal, chương trình con được viết dưới dạng thủ tục (procedure) vàhàm (function) Cấu trúc của 2 kiểu chương trình con này thì tương tự với nhau,mặc dầu cách truy xuất của chúng có khác nhau và cách trao đổi thông tin trongmỗi kiểu 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ó, dovậy, ta không thể viết các thủ tục trong biểu thức Các lệnh Writeln, Readln trongchươ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
1 Một số khái niệm biến:
Trang 23- Biến toàn cục (global variable): Còn được gọi là biến chung, là biến đượckhai 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ựchiệ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 khaibáo ở đầu chương trình con, và nó chỉ được sử dụng bên trong thân chương trìnhcon hoặc bên trong thân chương trình con khác nằm bên trong nó (các chươngtrì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
- Tham số thực (actual parameter) là một tham số mà nó có thể là một biếntoà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ụngchươ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
Tên chương trình con, nó dùng để nhận giá trị của các tham số thực truyền đến.
Tham số hình thức cũng là một biến cục bộ, ta có thể xem nó như là các đối sốcủa hàm toán học
2 Lời gọi chương trình con (thủ tục và hàm):
Ðể chương rrình con được thi hành, ta phải có lời gọi đến chương trình con,lời gọi chương trình con thông qua tên chương trình con và danh sách các tham
số tương ứng (nếu có) Các qui tắc của lời gọi chương trình con:
- Trong thân chương trình chính hoặc thân chương trình con, ta chỉ có thểgọi tới các chương trình con trực thuộc nó
- Trong chương trình con, ta có thể gọi các chương trình con ngang cấp đãđược thiết lập trước đó
a) Thủ tục (Procedure):
Thủ tục là một đoạn cấu trúc chương trình được chứa bên trong chươngtrình Pascal như là một chương trình con Thủ tục được đặt tên và có thể chứadanh sách tham số hình thức (formal parameters) Các tham số này phải được đặttrong dấu ngoặc đơn ( ) Ta có thể truy xuất thủ tục bằng cách gọi tên của thủ tục.Chương trình sẽ tự động truy xuất thủ tục đúng tên đã gọi và thực hiện các lệnhchứa trong thủ tục đó Sau khi thực hiện thủ tục xong, chương trình sẽ trở lại ngaylập tức sau vị trí câu lệnh gọi thủ tục đó
Có 2 loại thủ tục:
Trang 24IF a > b THEN max := a ELSE max := b;
IF c > max THEN max := 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) ? ');
Trang 25đượ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ũngcần thiết khai báo biến ngay đầu chương trình chính
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ộ } BEGIN
{ các lệnh trong nội bộ thủ tục } END ;
Khi viết một thủ tục, nếu có các tham số cần thiết, ta phải khai báo nó (kiểu,
số lượng, tính chất, .) Các tham số này gọi là tham số hình thức (formalparameters)
Một thủ tục có thể có 1 hoặc nhiều tham số hình thức Khi các tham số hìnhthức có cùng một kiểu thì ta viết chúng cách nhau bởi dấu phẩy (,) Trường hợpcác kiểu của chúng khác nhau hoặc giữa khai báo tham số truyền bằng tham biến
và truyền bằng tham trị (sẽ học ở phần sau ) thì ta phải viết cách nhau bằng dấuchấm phẩy (;)
Ví dụ 2.2: Tính giai thừa của một số
PROGRAM Tinh_Giai_thua ;
VAR
n : integer ; gt : real ; {các biến chung}
PROCEDURE giaithua (m : integer );
VAR i : integer ; {i là biến riêng}
BEGIN
gt := 1 ; FOR i := 1 TO m DO gt := gt * i ; END ;
BEGIN (* Thân chương trình chính *)
Write('Nhập số nguyên n (0 <= n < 33) = ') ; Readln (n) ;
If n>=0 then Begin
giaithua (n) ; Writeln ('Giai thừa của , n, là :' , gt: 10 : 0) ; End
Else Writeln(' Không tính giai thừa của một số âm! ') ;
Trang 26Readln;
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 chotham số hình thức m
Ví dụ 2.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
Trang 27Ở ví dụ trên, thì thủ tục Ptb2 và thủ tục Ptb1 được gọi là thủ tục lồng nhau
Ở dòng (4), ta thấy hsa, hsb, hsc lại được hiểu là các tham số thực, chúng truyềngiá trị biến cho các tham số hình thức a, b, c tương ứng trong thủ tục Ptb2
Nếu ta lại xét đến thủ tục con của thủ tục Ptb2 là Ptb1 thì các tham số a, b, cnày (chính xác là b và c) lại là tham số thực đối với Ptb1, với b và c được truyềntương ứng cho các tham số hình thức a, b của thủ tục Ptb1
Như vậy ta nhận thấy rằng, vấn đề xác định được đâu là biến toàn cục, đâu
là biến cục bộ, đâu là tham số thực và đâu là tham số hình thức (tham số biến vàtham số trị) là ứng bước nào mà chương trình đang thực hiện? Ðây là phần thenchốt để nắm được cách vận hành và kết quả của chương trình xử lý
Sơ đồ minh họa cách vận hành và quản lý biến của chương trình:
b) Hàm (Function) :
Trang 28Hàm là một chương trình con cho ta 1 giá trị kiểu vô hướng Hàm tương tựnhư thủ tục nhưng trả về một giá trị thông qua tên hàm và lời gọi hàm tham giatrong biểu thức
Cấu trúc một hàm tự đặt gồm:
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
{ 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ằngdấ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 trongchương trình chính nhưng ta có thể khai báo thêm các hằng, kiểu, biến dùng riêngtrong 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ủahàm để lưu kết quả của hàm trong quá trình tính toán để cuối cùng ta có 1 lệnhgán giá trị của biến trung gian cho tên hàm
Ví dụ 2.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ụ 2.5: Bài toán tính giai thừa (factorials)
Trang 29FOR heso := 2 TO n DO
tichso := tichso * heso ; factorial := tichso;
END ; END ;
BEGIN
Write (' Nhập vào một số nguyên dương x = '); Readln (x) ; Writeln (' Với x = , x , thì giai thừa sẽ là : x ! = ' , factorial(x)) Readln;
Ví dụ 2.6: Procedure Xuat1(hoten : string[25]);
Procedure Xuat2(mang: array[1 10] of integer); Hai chương trình con Xuat1 và Xuat2 đều bị lỗi ở phần khai báo kiểu dữ liệucho hai tham số hình thức là hoten và mang
Ðể khắc phục lỗi này, ta sẽ khai báo gián tiếp một kiểu dữ liệu str25 và M10thông qua từ khóa TYPE như sau:
TYPE
Str25=string[25]; {Str25 là một kiểu chuỗi có độ dài 25}
M10=Array[1 10] of integer; {M10 là một kiểu dữ kiệu mảng có 10 phần tử nguyên} Tiếp đến, dùng 2 kiểu dữ liệu mới định nghĩa Str25 và M10 để định kiểu chocác tham số hình thức hoten và mang như sau:
Procedure Xuat1(hoten : Str25);
Procedure Xuat2(mang: M10);
Trang 30III/ 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ủakiể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à quitắ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ếnchứ 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ộthằng, hoặc một giá trị số Các tham số trị nhận giá trị từ tham số thực khi truyềnnhư 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ỏichươ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 đếnchương trình con đó Do vậy một tham trị không bao giờ là kết quả tính toán củachương trình con
Một vài thí dụ về tham số biến:
Ví dụ 3.1: 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}
Trang 31PROCEDURE thamso (x : integer ; VAR y : integer ) ; BEGIN { x: là tham số trị , còn y là tham số biến}
x := x + 1 ;
y := y + 1 ; Writeln (‘Trong procedure thamso, ‘) ; Writeln (' Hai số của bạn là a = , x : 3, và b = , y : 3 ) ; END ;
END
PHẦN ĐỌC THÊM
IV/ TÍNH ÐỆ QUI CỦA CHƯƠNG TRÌNH CON
Một chương trình con mà trong quá trình thiết lập, nó sẽ gọi chính bản thân
nó thì chương trình con có tính đệ qui (recursion)
Ví dụ 4.1: Bài toán tính giai thừa (factorials) theo cách đệ qui Bài toánnày có phần chương trình chính giống như đã có ở ví dụ trước:
PROGRAM Giaithua ; (*Tính giai thừa của số n theo phương pháp đệ qui *) VAR x : integer ;
FUNCTION factorial (n : integer) : longint ;
BEGIN
IF n <= 1 THEN factorial := 1 {điều kiện neo}
ELSE factorial := n * factorial (n -1);
END ; BEGIN
Write (' Nhập vào một số nguyên dương x = ');
Readln (x) ;
Trang 32Writeln ; Writeln (' Kết quả ',x,'! = , factorial(x));
định nghĩa theo lối đệ qui
- Có một số thuật toán đệ qui sử dụng cho các bài toán đơn giản có thể đượcthay thế bằng một thuật toán khác không tự gọi chúng, sự thay thế đó được gọi là
khử đệ qui
- Trong một số bài toán ta có thể giải theo 2 cách: thuật toán lặp (xemchương trước) và thuật toán đệ qui Thông thường, cách giải theo thuật toán lặp(WHILE DO) thì tốt hơn so với thuật toán đệ qui vì đệ qui đòi hỏi thêm bộ nhớ vàthời gian Khi đó các thanh ghi được sử dụng cho lưu trữ và khi quay trở về phảikhôi phục lại trạng thái cũ trong mỗi lần gọi đến chương trình con Mức độ phứctạp có thể gia tăng khi trong chương trình con theo thuật toán đệ qui có chứanhững chương trình con khác Vì vậy, khi dùng đệ qui ta cần thận trọng, nhất làthuật toán này thường không cho ta thấy rõ trực tiếp toàn bộ quá trình giải các
bước Nói chung, chỉ khi naò không thể dùng thuật toán lặp ta mới nên sử dụng
thuật toán đệ qui
Trang 33V/ ÐƠN VỊ CHƯƠNG TRÌNH (UNIT)
1 Khái niệm:
Lập trình một bài toán lớn rất phức tạp và vất vả nếu nó phải sử dụng nhiềuthuật toán lập đi lập lại Việc tạo ra nhiều mẫu chương trình con nhằm giảm nhẹcông việc của một lập trình viên (programmer) Tuy nhiên, mỗi chương trình conchỉ có ứng dụng được trong chính chương trình chứa nó mà thôi Ðể khỏi mấtthời gian để viết lại chúng, người ta biến mỗi chương trình con thành các moduleđộc lập, được biên dịch sẵn và lưu trữ trên đĩa như một thư viện Khi cần ta cứviệc gọi các module này ra mà không cần phải viết lại chúng Mỗi module như vậyđược gọi là một đơn vị chương trình, hay gọi tắt là UNIT
Khái niệm Unit đã được vào sử dụng từ chương trình Pascal version 4.0 trở
đi Có hai loại Unit là các Unit chuẩn do Turbo Pascal tạo sẵn và các Unit tự tạo
do người lập trình tự viết ra
2 Các Unit chuẩn
a) Một số Unit chuẩn trong Turbo Pascal 5.5 trở đi
* Unit SYSTEM : gồm các hằng, biến, kiểu, hàm, thủ tục trong version 3.0
* Unit CRT : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
chế độ Text của version 5.5
* Unit PRINTER : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
chế độ in ấn
* Unit GRAPH : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
chế độ đồ thị của version 5.5
* Unit TURBO3 : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
chế độ Text của version 3.0
* Unit GRAPH3 : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
chế độ đồ thị của version 3.0
* Unit DOS : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến hệ điều
hành MS-DOS
* Unit OVERLAY : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
việc truy xuất đĩa phủ lấp khi chạy chương trình
Các Unit trên được lưu trữ trong tập tin TURBO.TPL của Turbo Pascal
Chúng ta có thể sử dụng chương trình TPUMOVER.EXE để lấy ra hoặc đưa vàomột hay nhiều Unit nhằm tiết kiệm bộ nhớ hay tăng cường tiện ích sử dụng
b) Cách gọi Unit
Trang 34Muốn sử dụng UNIT thì trong đầu chương trình ta phải khai báo Unit theo cúpháp sau:
USES <Tên Unit> [ { , <Tên Unit> } ] ;
* InsLine : thủ tục xen vào một hàng ở vị trí con trỏ màn hình
* DelLine : thủ tục xóa bỏ một hàng ở vị trí con trỏ màn hình
* GotoXY(XPos, Ypos): đưa con trỏ màn hình về vị trí có tọa độ Xpos và Ypos X có giá trị từ 1 - 80, và Y có giá trị từ 1 - 25
* Delay(time): tạo thời gian trễ tính theo milisecond Time là một số nguyên
dùng để làm chậm chương trình cho ta kịp quan sát dữ liệu
* Sound(F) : thủ tục tạo ra âm thanh với tần số F (hz) F là số nguyên
* NoSound : thủ tục tắt âm thanh
* LowVideo và NormVideo: thủ tục màn hình, khi gọi LowVideo thì mọi ký
tự viết ra màn hình có độ sáng yếu dần đi cho đến khi nhận thủ tục NormVideo mới về độ sáng bình thường
* TextBackGround (color): thủ tục chọn màu nền, color cho ở bảng (từ 1-7)
* KeyPressed: hàm cho giá trị kiểu kết quả Boolean, cho giá trị là True
nếu có một phím được bấm
* TextColor (color): thủ tục chọn màu chữ, color lấy ở bảng
Trang 35
Các hằng số màu của CRT unit
Hằng số color Màu hiển thị Giá trị
Black Blue Green Cyan Red Magenta Brown LightGray DarkGray LightBlue LightGreen LightCyan LightRed LightMagenta Yellow
White
Ðen Xanh da trời Xanh lá cây Xanh lơ
Ðỏ Tím Nâu Xám nhạt Xám đậm Xanh da trời nhạt Xanh là cây nhạt Xanh lơ nhạt
Ðỏ nhạt Tím nhạt Vàng Trắng
TextColor(Red + Blink) ;
* ReadKey: hàm có kiểu kết quả là Char, khi nhấn các phím chức năng trênbàn phím thì có kết quả là 1 ký tự mã ASCII Nếu ký tự đầu tiên do ReadKey trả
Trang 36về bằng ASCII 0 thì ký tự kế theo sẽ chỉ định phím như ở bảng dưới Các phímHome, phím mũi tên, luôn tạo nên một ký tự đi theo ASCII 0 Các phím chứcnăng từ F1 đến F10 sinh ra một trong 4 ký tự tùy theo ta dùng với tổ hợp phím Alt,Ctrl hay Shift hay dùng một mình
Các phím chức năng đặc biệt
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 Home PageUp
¬ → End ↓ PageDn
Ins Del
\ (92) ] (93)
VI/ UNIT TỰ TẠO
Trang 371 Một số bước để tạo ra Unit
Ðể tạo ra một Unit của mình cần đi qua các bước sau:
Bước 1 : Tạo ra một file Unit có phần mở rộng là PAS với bố cục sau:
UNIT <Tên Unit> ; (* Chú ý : Tên Unit phải trùng với tên File *)
INTERFACE (* Chú ý : Phần giao diện với bên ngoài, không có dấu ; ở đây *) [Uses <danh sách các unit>]; {Khai báo các unit dùng trong chương trình }
[Khai báo các hằng, kiểu, biến dùng chung] ;
[Khai báo các thủ tục, hàm (tên, danh sách tham số của thủ tục và hàm] ; IMPLEMENTATION (* Cài đặt các hàm, thủ tục của Unit, không có dấu ; ở đây *)
[Các khai báo kiểu, hằng, biến cục bộ ];
[Nội dung cài đặt các thủ tục, hàm của unit ];
[BEGIN] (* Phần khởi tạo : Initialization Part *)
[Các lệnh khởi tạo ];
END (* Dù có BEGIN để khởi tạo hay không, ở đây vẫn có END *)
Bước 2 : Dịch file này lên đĩa theo trình tự sau:
i Gõ Alt - C để vào Menu COMPILE
ii Ði đến mục Destination và nhấn Enter để chương trình tự động đổi
Memory thành Disk iii Gõ C (hoặc F9) để biên dịch chương trình tạo nên một file .TPU
iv Khi dịch xong gõ một phím bất kỳ Sau đó ta có thể lập lại bước 1 và
2 để chuyển Destination từ Disk sang Memory
2 Ví dụ
Ví dụ 6.1: Tạo một UNIT tính Cộng, Trừ, Nhân, Chia cho học sinh tiểu học
Tên file Unit là TTIEUHOC.PAS với nội dung sau:
UNIT TTieuHoc ; {Phần đầu : Chương trình Toán Tiểu học }
PROCEDURE Cong (Var So1, So2, So3 : Real) ;
PROCEDURE Tru (Var So1, So2, So3 : Real) ;
PROCEDURE Nhan (Var So1, So2, So3 : Real) ;
PROCEDURE Chia (Var So1, So2, So3 : Real) ;
Trang 38So1, So2, So3 : Real ;
PROCEDURE Menu (Var chon : integer) ;
BEGIN
Trang 39ClrScr ; Writeln (' == TOÁN TIỂU HỌC == ') ; Writeln (' = 0 Chấm dứt = ') ; Writeln (' = 1 Toán cộng = ') ; Writeln (' = 2 Toán trừ = ') ; Writeln (' = 3 Toán nhân = ') ; Writeln (' = 4 Toán chia = ') ; Writeln (‘ ================== ‘) ; Write (' Bạn chọn số mấy ? ') ; Readln (chon);
END ; PROCEDURE nhapso (Var So1, So2, So3 : real );
BEGIN
Write (' Nhập vào số thứ 1 : ') ; Readln(So1) ; Write (' Nhập vào số thứ 2 : ') ; Readln(So2) ; Write (' Kết quả là : ') ; Readln (So3) ;END ;
BEGIN {=====Chương Trình Chính ======}
CLRSCR;
REPEAT
Menu (chon) ; CASE chon OF
1 : BEGIN
Writeln ; Writeln (' == Toán cộng == ') ; Nhapso(So1, So2, So3) ; Cong(So1, So2, So3) ; END;
2 : BEGIN
Writeln ; Writeln (' == Toán trừ == ') ; Nhapso(So1, So2, So3) ; Tru(So1, So2, So3) ; END;
Trang 403 : BEGIN
Writeln ; Writeln (‘ == Toán nhân == ‘) ; Nhapso(So1, So2, So3) ; Nhan(So1, So2, So3) ; END;
4 : BEGIN
Writeln ; Writeln (‘ == Toán chia == ‘) ; Nhapso(So1, So2, So3) ; Chia(So1, So2, So3) ; END;
END; {case}
Writeln (' Gõ bất kỳ phím nào để tiếp tục ');
Readln;
UNTIL chon = 0;
VII/ LẬP TRÌNH THEO CẤU TRÚC TRÊN - XUỐNG
(TOP - DOWN STRUCTURED PROGRAMMING)
Nếu các bạn là một người mới bắt đầu khởi sự thực hành lập trình một bàitoán nào đó, các bạn sẽ thường tự hỏi: Ta phải bắt đầu bằng việc gì đây? Ðây làmột câu hỏi không phải ai cũng trả lời chung được Tuy nhiên, dựa vào kinhnghiệm thu thập được của những người lập trình tài tử và của những lập trìnhviên chuyên nghiệp, tác giả Francis Scheid, trong tác phẩm Computer andProgramming của mình, đã cho một số lời khuyên sau :
1 Ôn lại những kinh nghiệm đã qua để xem coi vấn đề của bạn có chút gìtương tự đến các vấn đề mà bạn đã từng chạm trán trước đây không;
2 Trước tiên, thử làm một phiên bản đơn giản Nếu có thể, đưa ngay vàomột số trường hợp đặc biệt mà bạn có, nhằm tạo chương trình bạn có một vẻ gìsâu sắc
3 Chia bài toán ra thành những bài nhỏ, rồi tiếp tục chẻ những bài nhỏ nàythành những phần nhỏ hơn, nếu được, chẻ tiếp những phần nhỏ này thànhnhững mảnh nhỏ hơn nữa, sau đó giải quyế từng phần hay mảnh nhỏ này
Mỗi thuật toán có thể thể hiện bằng lưu đồ (flow chart) Lưu đồ chính là bản
đồ lộ trình của thuật toán Không hẳn tất cả những chuyên viên máy tính phải thực