1. ịnh nghĩa và khai báo TOP
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
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 TOP
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 TOP
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
Hợp của 2 tập hợp A và B là một tập hợp chứa tất cả các phần tử của tập A hoặc B hoặc cả A và B.
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. Lu ý: 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 TOPVớ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) 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:= [];
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