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
= (phần_tử_1, phần_tử_2, ..., phần_tử_n) ; = SET OF ;
VAR : ; : ;
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 : SET OF ; : SET OF ;
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
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 ; C := A + B ;
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:
IF (A <> B) AND (A <= B) THEN WRITELN ( ‘A < B’)
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.
Code:
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 := [] ; 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 ; Writeoutput ;
END ; 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