1. Ðịnh nghĩa và khai báo
Một tập hợp (SET) bao gồm một số các phần tử có cùng bản chất kiểu là kiểu cơ bản. Trong Turbo Pascal và IBM Pascal, số phần tử tối đa trong một tập hợp là 256. Kiểu cơ bản có thể là kiểu vô hướng liệt kê, kiểu miền con hoặc kiểu Char, không được là số thực. Khái niệm tập hợp trong Pascal tương tự như khái niệm tập hợp trong toán học.
+ Khai báo gián tiếp TYPE
<Kiểu cơ bản> = (phần_tử_1, phần_tử_2, ..., phần_tử_n) ; <Tên kiểu tập hợp> = SET OF <Kiểu cơ bản> ;
VAR
<Tên biến > : <Tên kiểu tập hợp> ; Ví dụ 8.29: TYPE
Sizes = (short, medium, large) ; Shirtsizes = SET OF sizes ; VAR
shortleeve, longleeve : shirtsizes ;
+ Khai báo trực tiếp
VAR
<Tên biến> : SET OF <Kiểu cơ bản> ; Ví dụ 8.30:
VAR
Chu : SET OF Char ; So : SET OF 0 .. 9 ; ABC : SET OF 0 .. 256 ;
Date : SET OF (Sun, Mon, Tue, Wed, Fri, Sat) ;
2. Mô tả một tập hợp
Một tập hợp được mô tả bằng cách liệt kê các phần tử của tập hợp, chúng cách nhau bằng một dấu phẩy (,) và được đặt giữa hai dấu móc vuông [ ], các phần tử có thể là hằng, biến hoặc biểu thức. Ví dụ 8.31:
[] {tập hợp rỗng, không có các phầnt tử } [5 .. 15] {tập hợp các chữ số nguyên từ 5 đến 15}
[1, 3, 5] {tập hợp 3 số 1, 3 và 5 } [Hồng, Lan, Cúc, Mai] {tập hợp tên 4 loài hoa}
[i, i + j*2, 4, 5] {tập hợp các biến nguyên gồm số 4, 5 và các số nhận từ i, i +j*2 với i, j là 2 biến nguyên}
3. Các phép toán trên tập hợp
a. Phép gán
Ta có thể gán giá trị các tập đã được mô tả vào các biến tập cùng kiểu. Riêng tập hợp rỗng có thể gán cho mọi biến kiểu tập hợp khác nhau.
Với ví dụ trên, ta có thể gán : Chu := [X,Y,Z] ; So := [2,3,4] ;
Date := [] ;
Nếu ta viết Chu := [1,2]; thì không hợp lệ vì Chu là tập hợp các chữ. b. Phép hợp
Ký hiệu của phép hợp là dấu cộng (+). Phép hợp có tính giao hoán: A+B = B+A
Ta có thể mô tả phép hợp qua hình ảnh sau :
Ví dụ 8.32 A := [0,1,3,5,7,9] ; B := [0,2,4,6,8,9] ; C := A + B ; {tập hợp C sẽ có các phần tử là [0,1,2,3,4,5,6,7,8,9] } c. Phép giao
Giao của 2 tập hợp A và B là một tập chứa các phần tử của cả A và cả B. Ký hiệu A * B. Phép giao cũng có tính giao hoán, nghĩa là A * B = B * A Minh họa như sau :
Với ví dụ trong phép hợp, nếu:
D := A * B ; {tập D chứa phần tử [0,9] }
Nếu A và B không có phần tử nào giống nhau thì phép hợp sẽ cho tập rỗng.
d. Phép hiệu
Hiệu của 2 tập hợp A và B, ký hiệu là A - B, là một tập hợp chứa các phần tử chỉ thuộc A mà không thuộc B. Lưu ý : A - B thì khác B - A.
Ví dụ 8.33: A := [3 .. 7] ;
B := [1.. 6, 10, 15] ;
thì A - B là tập hợp [7] còn B - A là tập hợp [1,2, 10,15]
e. Phép thuộc IN
Phép thuộc IN cho phép thử xem một giá trị nào đó thuộc về một tập hay không? Phép thuộc IN cho kết quả có kiểu Boolean. Nếu đúng nó sẽ cho kết quả là TRUE, ngược lại là FALSE.
Ví dụ 8.34: Chu là biến kiểu Char, còn A là biến kiểu SET OF Char và Chu := ‘X’ ;
A := [‘X’, ‘x’,’Y’, ‘y’, ‘Z’, ‘z’] ; thì phép toán Chu IN A sẽ cho kết quả là TRUE f. Các phép so sánh =, <>, <= và >=
Muốn so sánh 2 tập hợp với nhau thì chúng phải có cùng kiểu cơ bản. Kết quả của các phép so sánh là giá trị kiểu Boolean, tức là TRUE (Ðúng) hoặc FALSE (Sai).
Hai tập hợp A và B gọi là bằng nhau (A = B) chỉ khi chúng có các phần tử giống với nhau từng đôi một (không kế thứ tự sắp xếp các phần tử trong 2 tập). Ngược lại của phép so sánh bằng nhau (=) là phép so sánh khác nhau (<>). Nghĩa là, nếu A = B là TRUE thì A <> B sẽ là FALSE và ngược lại.
Phép so sánh nhỏ hơn hoặc bằng (<=) của A <= B sẽ cho kết quả là TRUE nếu mọi phần tử có trong A đều có trong B. Ðịnh nghĩa này cũng tương tự như lớn hơn hoặc bằng (>=). Với A >= B thì mọi phần tử của B đều có trong A, kết quả này TRUE, ngược lại là FALSE.
Chú ý: Trong Pascal không có phép so sánh nhỏ hơn (<) và lớn hơn (>). Ðể kiểm tra xem tập A có thực sự nằm trong tập B hay không (A nhỏ hơn B), ta phải sử dụng thêm các phép logic như sau:
4. Viết và đọc dữ liệu kiểu tập hợp
Với dữ liệu kiểu tập hợp, ta không thể viết ra hoặc đọc vào bằng các thủ tục (Write) Writeln hoặc (Read) Readln. Tuy nhiên, ta có thể thực hiện các thao tác này khi mà kiểu cơ bản của tập hợp là số nguyên, ký tự.
Ví dụ 8.35: Viết chương trình để đọc một câu bất kỳ, sắp xếp các chữ của câu đó theo thứ tự ABC abc từ chữ in đến chữ thường. Chương trình chấm dứt khi nhận được chữ END hoặc end.
PROGRAM Letters_used ; TYPE letters = SET OF char ; VAR used, unused : letters ;
count, charcount : 0 .. 80 ; alpha : char ;
line : string ;
PROCEDURE Readinput ; {đọc một câu bất kỳ} BEGIN
FOR count := 1 TO 80 DO line[count] := ‘ ‘ ; Writeln (' Nhập vào một dòng câu dưới đây : ') ;
Count := 0;
WHILE NOT eoln DO {hàm eoln trả về giá trị false khi ký tự nhận vào khác} BEGIN {ký tự kết thúc dòng CR: carry return}
count := count + 1 ; read(line[count]); END ; readln; charcount := count; END ;
PROCEDURE Writeoutput ; {trình bày phân tích của một dòng câu } BEGIN
writeln;
write(' Các chữ đã sử dụng: ') ; FOR alpha := ‘A’ to ‘z’ DO
IF [alpha] <= used THEN write( ‘ ‘, alpha) ; writeln;
writeln; END;
BEGIN {Thân chương trình chính} Readinput;
WHILE NOT (([line[1]] <= [‘E’, ‘e’]) AND ([line[2]] <= [‘N’, ‘n’]) AND ([line[3]] <= [‘D’, ‘d’])) DO BEGIN
used := [] ;
unused := [‘A’ .. ‘Z’, ‘a’ .. ‘z’] ;
FOR count := 1 TO charcount DO IF [line[count]] <= unused THEN
BEGIN
used := used + [line[count]] ; unused := unused - [line[count]]; END ;
Writeoutput ; Readinput;
END ; END.
Khi chạy chương trình, ta sẽ thấy (Các dòng chữ gạch dưới là của người dùng): Nhập vào một dòng câu dưới đây:
Pascal is a structured programming language derived from ALGOL - 60 Các chữ đã sử dụng: A G L O P a c d e f g i l m n o p r s t u v
Nhập vào dòng câu dưới đây: END