1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Tài liệu Tập hợp trong Pascal doc

8 416 1

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 8
Dung lượng 135 KB

Nội dung

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

Trang 1

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'];

A := [1 100,140 200];

L := [];

Chúng ta không thể gán L := [3,5] vì kiểu cơ bản của chúng không tơng thích với nhau

2 Phép hợp

Hợp của 2 tập là một tập có các phần tử thuộc hai tập

Đợc kí hiệu bằng dấu +

VD :

A := [3 5];

B := [4 6,10,123];

C := A+B;

{ Tập C sẽ là [3 6,10,123] }

3 Phép giao

Giao của 2 tập là một tập có các phần tử nằm trong cả 2 tập

Đợc kí hiệu bằng dấu *

VD : Với VD trên ta gán

C := A*B; Tập C sẽ là [4,5]

Trang 2

4 Phép hiệu

Hiệu của 2 tập là tập các phần tử thuộc tập thứ nhất nhng khồn thuộc tập thứ hai

VD : Với VD trên ta gán

C := A-B; Tập C sẽ là [3];

C := B-A; Tập C sẽ là [6,10,123];

5 Phép thử "thuộc về"

Là một phép thử để xem một biến, hay một giá trị có thuộc một tập nào đó không

VD : Để thử biến ch có nằm trong câu trả lời Có bằng tiếng Việt hoặc bằng tiếng Anh là Yes không, bằng cách thông thờng ta viết

IF(Ch='Y')or(Ch='y')or(Ch='C')or(Ch='c')THEN

Song ta có thể viết ngắn gọn với phép thử IN nh sau :

IF Ch in['Y','y','C','c'] THEN

6 Các phép so sánh <>,=,<=,>=

Hai tập đợc đem ra so sánh trớc hết phải có cùng kiểu cơ bản Kết quả của phép so sánh là giá trị 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 |

Trang 3

-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

a,b,t:set of byte;{Tập a,b,t kiểu byte}

i:byte;{i kiểu byte}

begin

clrscr;{Xoá màn hình}

a:=[];b:=[];{Gán tập A và B bằng rỗng}

writeln('Nhap tap A');

repeat

readln(i);{Đọc i}

if i>0 then a:=a+[i];{Nếu i>0 thì cộng i vào tập A}

until i=0;{Cho đến khi i=0}

writeln('Nhap tap B');

repeat

readln(i);{Đọc I}

if i>0 then b:=b+[i];{Nếu i>0 thì cộng i vào tập B}

until i=0;{Cho đến khi i=0}

Writeln('Giao');

t:=a*b;{Gán t bằng giao của A và B}

for i:=1 to 99 do{Cho i chạy từ 1 đến 99}

if i in t then write(i,' ');{Nếu i thuộc t thì xuất i}

writeln;

writeln('Hop');

t:=a+b;{Gán t bằng hợp của A và B}

for i:=1 to 99 do{Cho i chạy từ 1 đến 99}

if i in t then write(i,' ');{Nếu i thuộc t thì xuất i}

readln;

end

Bài 2:

{ Nhập N Viết chơng trình tạo ra một tập số ngẫu nhiên trong khoảng từ 0 255 bằng cách :

- Tạo ra ngẫu nhiên N số trong khoảng từ 0 255

Tính phần bù của tập đó

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}

Trang 4

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}

uses crt;

type taphop=set of byte;

var

th:array[1 10]of taphop;{Khai báo mảng th 10 phần tử kiểu taphop}

i,j,a,max,n:byte;{i,j,a,max,n kiểu byte}

function sopt(th:taphop):byte;

var i,so:byte;{Khai báo i,so kiểu byte}

begin

so:=0;{Gán so bằng 0}

for i:=0 to 255 do{Cho i chạy từ 0 đến 255}

if i in th then inc(so);{Nếu i thuộc th thì tăng so}

sopt:=so;{Gán sopt bằng so}

end;

begin

clrscr;{Xoá màn hình}

randomize;

write('N = ');readln(n);{Đọc N}

for i:=1 to n do th[i]:=[];{Gán th[1] th[n] bằng rỗng}

for i:=1 to n do{Cho i chạy từ 1 đến n}

for j:=1 to 100 do{Cho j chạy từ 1 đến 100}

begin

a:=random(256);{Gán a bằng số ngẫu nhiên trong khoảng 0 255}

th[i]:=th[i]+[a];{Cộng a vào th[i]}

end;

max:=0;{Gán max bằng 0}

for i:=1 to n do{Cho i chạy từ 1 đến n}

begin

writeln('So phan tu tap ',i,' : ',sopt(th[i]));{Xuất số phần tử tập i}

if max<sopt(th[i])then{Nếu max nhỏ hơn số phần tử tập i}

begin

Trang 5

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}

write(a,' ');{Xuất a}

th:=th+[a];{Cộng a vào th}

end;

readln;

end

Bài 5:

{ Nhập N (N<=255) Tìm các số nguyên tố không vợt quá N bằng sàng Eratosthene

Hớng dẫn

Gán th:=[2 N]

Cho i chạy từ 2 đến trunc(sqrt(n))

Nếu i thuộc th thì xoá các bội của i trong khoảng i*i -> N ra khỏi th

Các phần tử còn lại chính là các số nguyên tố}

uses crt;

var

i,n:byte;{i,n kiểu byte}

th:set of byte;{Tập th kiểu byte}

a:integer;{a kiểu integer}

begin

clrscr;{Xoá màn hình}

Trang 6

write('N = ');readln(n);{Đọc N}

th:=[2 n];{Gán th bằng [2 n]}

for i:=2 to trunc(sqrt(n))do{Cho i chạy từ 2 đến trunc(sqrt(n))}

if i in th then{Nếu i thuộc th}

begin

a:=i*i;{Gán a bằng i*i}

while a<=n do{Trong khi a<=n thì}

begin

th:=th-[a];{Loại a ra khỏi th}

a:=a+i;{Tăng a thêm i đơn vị}

end;

end;

for i:=2 to n do{Cho i chạy từ 1 đến n}

if i in th then write(i:4);{Nếu i thuộc th thì xuất i}

readln;

end

Bài 6:

{ Nhập vào một chữ chuỗi kí tự Xem có bao nhiêu loại kí tự xuất hiện trong đó

VD : "abcdeDcB"

Có 7 loại kí tự

Hớng dẫn

Khai báo th là tập hợp kiểu kí tự

for i=1 -> length(s)do

th:=th+[s[i]];

Sau đó

for i:=0 to 255 do

Nếu chr(i)xuất hiện trong TH thì tăng dem len 1}

uses crt;

var

s:string;{Xâu S}

i,dem:byte;{i,dem kiểu byte}

th:set of char;{Tập th}

begin

clrscr;{Xoá màn hình}

write('S = ');readln(s);{Đọc S}

th:=[];{Gán th bằng rỗng}

for i:=1 to length(s)do{Cho i chạy từ 1 đến chiều dài xâu S}

th:=th+[s[i]];{Cộng s[i] vào th}

dem:=0;{Gán dem bằng 0}

for i:=0 to 255 do{Cho i chạy từ 0 đến 255}

if chr(i)in th then inc(dem);{Nếu kí tự có mã là i có trong th thì tăng dem} writeln(dem);{Xuất dem}

readln;

end

Trang 7

Bài 7:

{ Viết chơng trình nhập vào một chuỗi kí tự

a Tính các tập sau

- Tập A chỉ chứa các chữ cái hoa

- Tập B chỉ chứa các chữ cái thờng

- Tập C chỉ chứa các chữ số

- Tập D chứa mọi kí tự con lại

b In ra màn hình các tập đó}

uses crt;

var

s:string;{Xâu S}

a,b,c,d:set of char;{Tập a,b,c,d kiểu kí tự}

i:byte;{i kiểu byte}

ch:char;{ch kiểu kí tự}

begin

clrscr;{Xoá màn hình}

write('S = ');readln(S);{Đọc S}

a:=[];b:=[];c:=[];d:=[];{Gán a,b,c,d bằng rỗng}

for i:=1 to length(s)do{Cho i chạy từ 1 đến chiều dài xâu S}

if s[i]in['A' 'Z']then a:=a+[s[i]]{Nếu s[i]thuộc 'A' 'Z' thì cộng s[i] vào tập A}

else if s[i]in['a' 'z']then b:=b+[s[i]]{Ngợc lại nếu s[i]thuộc 'a' 'a' thì cộng s[i] vào tập B} else if s[i]in['0' '9']then c:=c+[s[i]]{Ngợc lại nếu s[i]thuộc '0' '9' thì cộng s[i] vào tập C} else d:=d+[s[i]];{Ngợc lại nếu thì cộng s[i] vào tập D}

writeln('Tap A');

for ch:='A' to 'Z' do{Cho ch chạy từ 'A' đến 'Z'}

if ch in a then write(ch,' ');{Nếu ch thuộc tập A thì xuất ch}

writeln;

writeln('Tap B');

for ch:='a' to 'z'do{Cho ch chạy từ 'a' đến 'a'}

if ch in b then write(chr(i),' ');{Nếu ch thuộc tập B thì xuất ch}

writeln;

writeln('Tap C');

for ch:='0' to '9'do{Cho ch chạy từ '0' đến '9'}

if ch in c then write(chr(i),' ');{Nếu ch thuộc tập C thì xuất ch}

writeln;

writeln('Tap D');

for i:=0 to 255 do{Cho i chạy từ 0 đến 255}

if chr(i)in d then write(chr(i),' ');{Nếu kí tự có mã i thuộc tập D thì xuất kí tự đó}

readln;

end

Trang 8

Bài 8:

{ Viết thủ tục

tracnghiem(s,sa,sb,sc,sd:string;kq:char);

Thủ tục sẽ in ra câu hỏi s và các câu lựa chọn sa,sb,sc,sd Sau đó chơng trình sẽ đợi đến khi ngời dùng ấn các phím A,B,C,D So sánh kết quả đó với kq Nếu đúng thì in ra

"Ban tra loi dung" ngợc lại in ra " Ban tra loi sai"}

uses crt;

procedure tracnghiem(s,sa,sb,sc,sd:string;kq:char);

var ch:char;{Khai báo ch kiểu kí tự}

begin

clrscr;{Xoá màn hình}

writeln(s);{Xuất S}

writeln(sa);{Xuất sa}

writeln(sb);{Xuất sb}

writeln(sc);{Xuất sc}

writeln(sd);{Xuất sd}

repeat ch:=upcase(readkey) until ch in['A' 'D'];{Nhận ch cho đến khi ch là các phím A,B,C,D}

if ch=upcase(kq)then writeln('Ban tra loi dung'){Nếu ch bằng kí tự kq thì xuất Đúng}

else writeln('Ban tra loi sai');{Ngợc lại thì xuất Sai}

readln;

end;

begin

tracnghiem('Bo nho co may loai','a 1','b 2','c 3','d 4','b');

end

Ngày đăng: 25/01/2014, 13:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w