Kiểu tập hợp
I. Kiểu tập hợp
Một tập hợp bao gồm một số đối tợng nào đó có cùng bản chất. Trong Pascal điều đó có ngiã là mô
tả cùng một kiểu, kiểu bày gọi là kiểu cơ bản. Kiểu cơ bản bắt buộc phải là một kiểu vô hớng hay
đoạn con và không đợc là số thực. Các đối tợng này gọi là các phần tử của tập. Số phần tử cực đại
cho phép trong Boland Pascal là 256.
Để mô tả kiểu và khai báo biến tập hợp, ngời ta dùng từ khoá SET OF theo sau là kiểu cơ bản T
(kiểu của các phần tử của tập)
VD :
TYPE
Chu_Cai = SET OF CHAR;
Chu_So = SET OF 0..9;
VAR
SO : CHU_SO;
L : CHU_CAI;
A : SET OF BYTE;
II. Xác lập một tập
Một tập hợp đợc xác định 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 dấu
phẩy và đợc đặt giữa 2 dấu ngoặc vuông.
VD :
[];
[3..5];
[3,4,5,8] hoặc [3..5,8];
['A'..'C','Y','Z'];
Bản thân các phần tử của tập cũng có thể cho bằng biến hoặc biểu thức
VD : [X+Y, I*J, 3, 4]
III. Các phép toán trên tập
1. Phép gán
Với cách mô tả ở trên ta có thể gán
VD : SO := [3..5];
L := ['A'..'E','Z'];
kiểu Boolean tức là : Đúng(TRUE) hoặc Sai(FALSE)
Hai tập bằng nhau nếu chúng có phần tử nh nhau từng đôi một (không kể thứ tự sắp xếp trong 2
tập)
Ngợc lại với phép = là phép so sánh khác nhau
Phép so sánh <= sẽ có giá trị TRUE nếu tất cả phần tử tập thứ nhất đều thuộc tập thứ hai.
Phép so sanh >= sẽ có giá trị TRUE nếu tất cả phần tử tập thứ hai đều thuộc tập thứ nhất
Chú ý : Trong Pascal không tồn tại phép so sánh <,>. Muốn so sánh lớn hơn hay nhỏ hơn ta dùng
thủ thuật sau.
IF (A<=B) AND (A<>B) THEN Writeln('A<B');
7. Tổng kết các phép toán trên tập
---------------------------------------------------
| Toán tử | Kí hiệu | Kiểu kết quả |
----------------------------------------------------
| Gán | := | SET OF... |
| Hợp | + | SET OF... |
| Giao | * | SET OF... |
| Hiệu | - | SET OF... |
| Thuộc về | IN | Boolean |
| Bằng nhau | = | Boolean |
| Khác nhau | <> | Boolean |
| Bao hàm | <=,>= | Boolean |
----------------------------------------------------
Bài 1:
{ Viết chơng trình nhập từ bàn phím tập số A gồm các số nguyên trong khoảng 1..99 bằng cách
nhập liên tục các số cho đến khi nhập số 0 thì kết thúc
Tơng tự nhập tập B
a. Tính giao của 2 tập. In ra màn hình
b. Tính hợp của 2 tập. In ra màn hình}
uses crt;
var
VD : N=5 có 6 số : 0 1 2 3 6 2
thì tập đó là [0..3,6]
phần bù của nó [4,5,7..255]}
uses crt;
var
th:set of byte;{Tập th kiểu byte}
i,a,n:integer;{i,a,n kiểu integer}
begin
clrscr;{Xoá màn hình}
randomize;
write('N = ');readln(n);{Đọc N}
th:=[];{Gán tập th bằng rỗng}
for i:=1 to n do{Cho i chạy từ 1 đến n}
begin
a:=random(256);{Gán a bằng số ngẫu nhiên trong khoảng 0..255}
th:=th+[a];{Cộng a vào th}
end;
writeln('Phan bu');
th:=[0..255]-th;{Gán th bằng phần bù của nó}
for i:=0 to 255 do{Cho i chạy từ 0 đến 255}
if i in th then write(i,' ');{Nếu i thuộc th thì xuất i}
readln;
end.
Bài 3:
{ Nhập số N (N<10). Tạo ra N tập số bằng cách với mỗi tập ta thực hiện :
- Tạo ra 100 số ngẫu nhiên trong khoảng từ 0..255 (có thể trùng nhau) rồi cho vào tập đó
a. In ra màn hình số phần tử của mỗi tập
b. Xem tập nào là lớn nhất. In ra màn hình các số thuộc tập đó
Hớng dẫn
Nên viết hàm sopt(a)trả về số phần tử của tập a}
max:=sopt(th[i]);{Gán max bằng số phần tử tập i}
a:=i;{Gán a bằng i}
end;
end;
writeln('Tap ',a,' co so phan tu lon nhat');{Xuất tập lớn nhất}
for i:=0 to 255 do{Cho i chạy từ 0 đến 255}
if i in th[a] then write(i,' ');{Nếu i thuộc th[a] thì xuất i}
readln;
end.
Bài 4:
{ Nhập N. Viết chơng trình in ra một hoán vị đầu tiên của N
VD : N = 9
2 6 4 3 5 8 7 9 1
Hớng dẫn
Gán th:=[]
Thực hiện lấy N số bằng cách :
- Lấy ngẫu nhiên số đó trong khoảng từ 1..N cho tới khi nó cha xuất hiện trong th
- Cộng nó vào th}
uses crt;
var
i,a,n:byte;{i,a,n kiểu byte}
th:set of byte;{th kiểu byte}
begin
clrscr;{Xoá màn hình}
write('N = ');readln(n);{Đọc N}
th:=[];{Gán th bằng rỗng}
for i:=1 to n do{Cho i chạy từ 1 đến n}
begin
repeat a:=random(n)+1 until not(a in th);{Gán a bằng số ngẫu nhiên từ 1..n cho đến khi a không
thuộc th}