Cơ bản về ngôn ngữ Pascal I. Giới Thiệu


b. Mảng nhiều chiều (Multi-Dimensional Array)



tải về 291.86 Kb.
trang3/4
Chuyển đổi dữ liệu30.08.2016
Kích291.86 Kb.
#28831
1   2   3   4

b. Mảng nhiều chiều (Multi-Dimensional Array) Trong một số bài toán thực tế, người ta sử dụng các mảng nhiều hơn 1 chiều, gọi là mảng nhiều chiều.
Ví dụ 8.11: Phòng Ðào tạo quản lý điểm của sinh viên. Trong khoá 22 chẳng hạn, người ta tạo ra một mảng 2 chiều: ví dụ một chiều là số thứ tự của sinh viên, chiều còn lại là các môn học (dạng kiểu vô hướng liệt kê), ta có thể hình dung dạng của mảng ghi điểm (tên mảng là ghi_diem) như sau:

Lưu ý: Thực tế, danh sách tên sinh viên lưu lại trong máy tính thường được ghi bằng cách gán mã số sinh viên (coding) cho mỗi sinh viên ngay từ năm đầu vào học.
Với ví dụ trên, muốn nhập điểm một sinh viên nào đó ta phải khai báo 2 tham số là số thứ tự sinh viên và môn học.
Tương tự, cũng với các khoá kế tiếp theo học những môn như vậy, ta sẽ tạo ra mảng nhiều chiều như hình vẽ minh họa sau:

Trong trường hợp này, muốn biết điểm một sinh viên nào đó ta phải khai báo 3 tham số: Khoá học, số thứ tự sinh viên và môn học, chẳng hạn:


ghi_diem[K22,0001,AV] nhập điểm 10,...
Khai báo cũng có 2 cách như đối với mảng 1 chiều:
+ Khai báo gián tiếp:
TYPE
= ARRAY [Kiểu_chỉ_số_1, ..., Kiểu_chỉ_số_n] OF ;
VAR
:;
Ví dụ 8.12:
TYPE matrix = ARRAY [1 .. 20, 1 .. 30] OF integer ;
VAR A:matrix;
Lệnh trên khai báo một kiểu tên matrix. Ðây là một mảng 2 chiều, chiều thứ nhất có các chỉ số từ 1 đến 20, chiều thứ hai có các chỉ số từ 1 đến 30, tổng cộng ta có (20 x 30) phần tử số nguyên. Và ta có một biến A là biến có kiểu matrix.
Ví dụ trên cũng có thể được khai báo tương đương với:
TYPE matrix = ARRAY [1 .. 20] OF ARRAY [1 .. 30] OF integer ;
VAR A:matrix;
+ Khai báo gián tiếp:
VAR
: ARRAY [Kiểu_chỉ_số_1, ..., Kiểu_chỉ_số_n] OF ;
Khai báo một biến A có 5 dòng và 10 cột kiểu phần tử là Integer như sau:
VAR A : ARRAY [1 .. 5, 1 .. 10] OF integer ;
+ Truy xuất các phần tử mảng:
Tương tự như cách truy xuất phần tử của mảng 1 chiều, mảngg nhiều chiều cũng được truy xuất thông qua tên biến mảng kết hợp với các chỉ số của nó được đặt trong cặp dấu ngoặc vuông.
Mảng 2 chiều là một ma trận, như ví dụ trên ta có một ma trận 5 dòng và 10 cột. Các phần tử của ma trận A được ký hiệu là a[i,j] với i là vị trí cột và j là dòng. Khi viết a[2, 7] thì hiểu đây là phần tử ở dòng 2 và cột 7.
Trong Pascal, ta có thể viết a[i,j] thành a[i] [j] với ý nghĩa hoàn toàn như nhau.
Chú ý: Trên nguyên tắc, ta có thể khai báo một mảng có đến 255 chiều. Tuy vậy, một điều cần lưu ý là kích thước bộ nhớ của máy tính có hạn nên thường chỉ khai báo mảng từ 1 đến 3 chiều. Khai biến quá nhiều thì phải cần máy lớn hơn.
Chẳng hạn khi báo 1 mảng [1.. 10] các phần tử số nguyên đã lấy 10 bytes bộ nhớ
- Mảng 2 chiều 10 x 10 = 100 bytes bộ nhớ.
- Mảng 3 chiều 10 x 10 x 10 = 1 000 bytes bộ nhớ
- Mảng 4 chiều 10 x 10 x 10 x 10 = 10 000 bytes bộ nhớ
- Mảng 5 chiều 10 x 10 x 10 x 10 x 10 = 100 000 bytes bộ nhớ
- v.v...
Ví dụ 8.13:
Viết một chương trình Pascal để đọc một bảng các số thực được nhập vào máy tính dưới dạng một mảng 2 chiều. Tính tổng các giá trị số theo hàng và theo cột. Kết quả được in ra màn hình theo vị trí hàng và cột tương ứng.
Trước tiên, ta bắt đầu bằng định nghĩa các biến:
table = mảng 2 chiều chứa số thực dưới dạng bảng gồm các số nhập và kết quả
nrows = một biến số nguyên chỉ số hàng
ncols = một biến số nguyên chỉ số cột
row = một số đếm nguyên chỉ số hàng
col = một số đếm nguyên chỉ số cột
Ðể đơn giản, chúng ta giả sử rằng kích thước số liệu nhập vào bảng tính không vượt quá 10 hàng và 10 cột. Ta sẽ thêm vào 1 hàng cộng phía dưới và 1 cột cộng bên phải vào bảng để ghi kết quả tính cộng các phần tử hàng và cột tương ứng. Như vậy, mảng 2 chiều của chúng ta sẽ trở thành mảng sẽ được in ra có số hàng là (nrows + 1) và số cột là (ncols +1). Do vậy, ta phải khai báo biến table là 1 mảng 2 chiều số nguyên có tối đa 11 cột và 11 hàng.
Ðể dễ theo dõi chương trình, ta thực hiện cấu trúc module khi viết chương trình bằng cách tiến hành làm các thủ tục procedure cho đọc số liệu, tính tổng các phần tử theo hàng, tính tổng các phần tử theo cột và in ra màn hình bảng kết quả. Các thủ tục này sẽ có tên tương ứng là readinput, rowsums, columsums và writeoutput.
Thuật toán logic yêu cầu cho mỗi thủ tục là cách khai báo thẳng trước (straightforward), chú ý rằng trong mỗi thủ tục ta có một vòng lặp đôi (double loop). Ví dụ, để đọc số liệu ở bảng gốc, ta sẽ phải làm một vòng lặp đôi sau:
FOR row := 1 TO nrows DO
BEGIN
FOR col := 1 TO ncols DO readln( table[row, col] ) ;
Writeln;
END ;
Câu lệnh Writeln để báo chương trình nhảy tới dòng kế.
Tương tự, vòng lặp sau được viết để tính tổng các phần tử theo hàng:
FOR row := 1 TO nrows DO
BEGIN
table [row, ncols + 1] := 0 ;
FOR col := 1 TO ncols DO
table [row, ncols + 1] := table [row, ncols + 1] + table [row, col];
END ;
Tương tự, cấu trúc vòng lặp đôi cũng được dùng để tính tổng các phần tử cột và in ra bảng kết quả cuối cùng.
Sau đây là chương trình Pascal của bài toán trên:
PROGRAM Tongbang ;
{đọc một bảng số, tính tổng từng cột và hàng của cá bảng}
VAR
row, col : 1 .. 11 ;
nrows, ncols : 1 .. 10 ;
table : ARRAY [1 .. 11, 1 .. 11] OF real ;
PROCEDURE Rowsums ; {cộng các phần tử theo cột bên trong mỗi hàng }
BEGIN
FOR row := 1 TO nrows DO
BEGIN
table [row,ncols+1] := 0 ;
FOR col := 1 TO ncols DO
table[row, ncols+1] := table[row, ncols+1] + table[row,col];
END ;
END ;
PROCEDURE Columnsums ; {cộng các phần tử theo hàng bên trong từng cột }
BEGIN
FOR col := 1 TO ncols DO
BEGIN
table [nrows+1, col] := 0 ;
FOR row := 1 TO nrows DO
table[nrows+1,col] := table[nrows+1,col] + table[row,col];
END ;
END ;
PROCEDURE Readinput ; {đọc các phần tử của bảng }
BEGIN
Write(' Nhập số hàng (1 .. 10) ? ') ;Readln(nrows) ;
Write(' Nhập số cột (1 .. 10) ? ') ;Readln(ncols) ;
FOR row := 1 TO nrows DO
BEGIN
Writeln (' Nhập số liệu hàng số , row :2') ;
FOR col := 1 TO ncols DO readln(table [row, col] ) ;
END ;
END ;
PROCEDURE Writeoutput ; { In ra bảng số liệu và kết quả tính tổng }
BEGIN
Writeln('Bảng số liệu và kết quả tính tổng các phần tử theo hàng và cột ');
Writeln(‘======================================= ====== ‘);
Writeln;
FOR row := 1 TO nrows + 1 DO
BEGIN
FOR col := 1 TO ncols+1 DO Write (table [row,col] : 6 : 1) ;
Writeln;
END ;
END ;
BEGIN { Thân chương trình chính }
Readinput ;
Rowsums ;
Columnsums ;
Writeoutput;
END. { Chấm dứt chương trình }
Giả sử, ta có bảng số liệu sau :
2.5 -6.3 14.7 4.0
10.8 12.4 -8.2 5.5
-7.2 3.1 17.7 -9.1
Khi chạy chương trình, ta có (số có gạch dưới là số của người thử chương trình):
Nhập số hàng (1 .. 10 ) ? 3
Nhập số cột (1 .. 10) ? 4
Nhập số liệu hàng số 1
2.5 -6.3 14.7 4.0
Nhập số liệu hàng số 2
10.8 12.4 -8.2 5.5
Nhập số liệu hàng số 3
-7.2 3.1 17.7 -9.1
Chương trình sẽ tính tổng các giá trị ở hàng và cột, xong in ra màn hình kết quả:
Bảng số liệu và kết quả tính tổng các phần tử theo hàng và cột
2.5 -6.3 14.7 4.0 14.9
10.8 12.4 -8.2 5.5 20.5
-7.2 3.1 17.7 -9.1 4.5
6.1 9.2 24.2 0.4 0.0
Ta có thể kiểm tra kết quả ở các hàng và cột.


2. Dữ liệu kiểu chuỗi (String Type Data)



Một chuỗi dữ liệu là một loạt các ký tự được định nghĩa bằng từ khoá STRING theo sau là số ký tự cực đại có thể có của chuỗi ký tự. String là một kiểu cấu trúc được thêm vào trong Turbo Pascal.


a. Khai báo
Chúng ta có thể khai báo kiểu chuỗi ký tự String gián tiếp hoặc trực tiếp. Khai báo gián tiếp là khai kiểu trước rồi sau đó mới khai báo biến. Cách khai báo trực tiếp là khai thẳng biến số. Chiều dài tối đa của chuỗi ký tự phải là một hằng nguyên và được đặt trong dấu ngoặc vuông [ ]. Trường hợp không khai báo thì chương trình sẽ lấy giá trị mặc nhiên là 255 ký tự
+ Khai báo gián tiếp
TYPE
= STRING [hằng nguyên] ;
VAR
: ;
Ví dụ 8.14:
TYPE
TenSV = STRING [25] ; {định độ dài tối đa là 25}
Diachi = STRING; {mặc nhiên có độ dài tối đa là 255}
VAR
HT : TenSV ;
DC : Diachi ;
+ Khai báo trực tiếp
VAR
: STRING [hằng nguyên] ;
Ví dụ 8.15:
VAR
HT : STRING [25] ;
DC : STRING;
Chuỗi ký tự sẽ chiếm số byte trong bộ nhớ bằng số ký tự lớn nhất đã khai báo trước cộng thêm 1 byte đầu tiên chứa số ký tự hiện có của chuỗi ký tự.
Ví dụ 8.16:
TYPE DH = STRING[10] ;
VAR CT : DH ;
và nếu ta gán CT := CAN THO;
thì CT sẽ được cấp phát 1 + 10 = 11 ô nhớ (byte) liên tục, với hình ảnh sau :

Chú ý:
- Ðộ dài của chuỗi ký tự CT là 7 ký tự mặc dầu độ dài lớn nhất cho phép là 10.


- Vì ta dùng 1 byte để chứa chiều dài nên string chỉ có tối đa là 255 ký tự.
b. Các thao tác trên chuỗi
+ Phép gán
Giống như phép gán trong các kiểu vô hướng khác, phép gán chuỗi là lệnh gắn một biến với một biểu thức ký tự để trong cặp dấu nháy đơn
Cú pháp:
:= Biểu thức ký tự ;
Ví dụ 8.17:
HT := Lê Văn Hai ;
DC := Số 12/4 đường Trần Hưng Ðạo, TP. Cần thơ ;
+ Phép cộng
Phép cộng là thuật toán nối các chuỗi lại với nhau bằng dấu cộng (+).
Ví dụ trên nếu ghép HT + DC thì ta sẽ được:
Lê Văn Hai Số 12/4 đường Trần Hưng Ðạo, TP. Cần thơ
Ghi chú: Không có phép trừ, nhân, chia trong chuỗi ký tự.
+ Các phép so sánh
Các so sánh gồm có bằng nhau =, lớn hơn >, lớn hơn hoặc bằng >=, khác nhau <>, nhỏ hơn <, nhỏ hơn hoặc bằng <=
Khi so sánh 2 chuỗi ký tự thì các ký tự được so sánh từng cặp một từ trái sang phải theo giá trị của bảng mã ASCII. Có 2 khả năng xảy ra khi so sánh:
- Nếu 2 chuỗi có độ dài khác nhau nhưng số ký tự giống nhau cho đến độ dài chuỗi ngắn nhất thì chuỗi ngắn nhỏ hơn chuỗi dài.
Ví dụ 8.18: 'Nation' < 'National' 'Lan' < 'Lang'
- Nếu 2 chuỗi có độ dài và nội dung giống nhau thì bằng nhau.
Ví dụ 8.19: 'Hello' = 'Hello'
Ghi chú: Chuỗi rổng (null string, viết là '') là chuỗi không có chứa gì cả. Nó có giá trị nhỏ hơn mọi string khác rỗng.
Vì vậy: 'A' >'' và chr(32)> ''
+ Câu lệnh Read và Readln
Hai câu lệnh này đối với chuỗi cũng tương tự như đối với các kiểu vô hướng khác, nhưng cần lưu ý:
- Lệnh Read và Readln chỉ cho phép đọc tối đa 127 ký tự một chuỗi nhập từ bàn phím mặc dầu chiều dài tối đa của một chuỗi có thể đến 255 ký tự.
- Nếu ta đọc một lúc nhiều biến theo kiểu Read(biến1, biến2, ..., biếnN) ( hoặc Readln(biến1, biến2, ..., biếnN)) thì có thể bị nhầm lẫn khi ta nhập giá trị có độ dài vượt quá độ dài tối đa của biến1 thì phần vượt sẽ được gán cho biến2. Ngược lại, nếu ta nhập giá trị ít hơn độ dài của biến1 thì chương trình lại lấy các giá trị của biến2 gán thêm cho biến1 kể cả khoảng trống. Do vậy, cách tốt nhất là đối với biến kiểu String chỉ nên nhập mỗi lần 1 biến.
Ví dụ 8.20: Nên tránh viết kiểu Read(TenSV, Diachi); mà nên viết :
Read(TenSV) ;
Read(Diachi) ;
hoặc:
Readln(TenSV) ;
Readln(Diachi) ;
- Ðộ dài thực tế của chuỗi là độ dài thực tế khi ta đọc vào từ bàn phím mặc dầu trước đó ta có khai báo độ dài chuỗi. Nếu ta gõ Enter mà không gõ ký tự nào trước đó thì mặc nhiên chương trình hiểu đó là một chuỗi rỗng (null string hay st = '').
+ Câu lệnh Write và Writeln
Tương tự như trên nhưng cần một số lưu ý về cách viết:
- Nếu viết Write(st) hoặc Writeln(st) gọi là cách viết không qui cách thì mỗi ký tự sẽ chiếm 1 vị trí trên màn hình.
- Nếu viết Write(st : n) hoặc Writeln(st : n) gọi là cách viết theo qui cách, với n là số nguyên, thì màn hình sẽ dành n vị trí để viết chuỗi st theo lối canh trái nếu n> 0 và ngược lại theo lối canh phải nếu n < 0.
- Một số chuỗi mà trong đó có dấu như là một chữ viết tắt, ví dụ như câu: Hes an Intal staff (Ông ta là một nhân viên quốc tế) thì nơi có dấu phải viết thành (đây là 2 dấu nháy đơn chứ không phải là 1 dấu nháy kép ).
Ta viết:
Writeln ( ‘ He ‘’s an Int’’al staff ‘) ;
c. Các thủ tục và hàm chuẩn xử lý chuỗi ký tự
Chuỗi ký tự được dùng khá phổ biến trong lập trình nên Turbo Pascal đã đưa sẵn vào một số thủ tục và hàm chuẩn để xử lý chuỗi ký tự.
* Thủ tục xóa DELETE (St, Pos, Num)
Ý nghĩa: Xóa khỏi chuỗi St một số ký tự là Num bắt đầu từ vị trí Pos tính từ trái sang.
Ví dụ 8.21: VAR st : string [20];
Begin
St := ' BÀ BA BÁN BÁNH BÒ '; Writeln (St) ;
DELETE (St, 10, 4); Writeln(St); Readln ;
End.
Khi chạy chương trình, ta sẽ thấy trên màn hình:
BÀ BA BÁN BÁNH BÒ
BÀ BA BÁN BÒ
* Thủ tục INSERT (Obj, St, Pos)
Ýï nghĩa: Chèn chuỗi Obj xen vào chuỗi St kể từ vị trí Pos tính từ bên trái.
Ví dụ 8.22: VAR st : string [25];
Begin
St := 'BÀ BA BÁN BÁNH BÒ' ; Writeln (St) ;
INSERT ( BỤNG BỰ , St, 6); Writeln(St); Readln ;
End.
Khi chạy chương trình, ta sẽ thấy trên màn hình:
BÀ BA BÁN BÁNH BÒ
BÀ BA BỤNG BỰ BÁN BÁNH BÒ
* Thủ tục STR (S [: n[: m]], St)
Ý nghĩa: Ðổi giá trị số S thành chuỗi rồi gán cho St, Giá trị n:m nếu có sẽ là số vị trí và số chữ số thập phân của S.
Ví dụ 8.23: VAR S: real;
St: string[10];
Begin
S:= 12345.6718;
Writeln(S:5:2);
Str(S:6:2:st);
Readln;
End.
Kết quả trên màn hình:
12345.67 {Ðây là số }
12345.67 {Ðây là chuỗi}
* Thủ tục VAL(St, S, Code)
Ý nghĩa: Ðổi chuỗi số St (biểu thị một số nguyên hoặc số thực) thành số (số nguyên hoặc số thực) và gán giá trị này cho S. Code là số nguyên dùng để phát hiện lỗi: nếu đổi đúng thì Code có giá trị = 0, nếu sai do St không biểu diễn đúng số nguyên hoặc số thực thì Code sẽ nhận giá trị bằng vị trí của ký tự sai trong chuỗi St.
Ví dụ 8.24: VAR St : String[10];
SoX : real;
maloi: integer;
Begin
St:= ‘123.456’ ;
VAL(St,SoX,maloi) ;
Writeln('Số X = , SoX :5:2, và mã lỗi = , maloi) ;
Readln;
St:=‘123.XXX ’;
VAL(St,SoX,maloi);
Writeln('St = 123.XXX không đổi thành số được !');
Writeln('Sai lỗi ở vị trí thứ ' , maloi); Readln;
End.
Khi chạy, ta sẽ thấy trên màn hình:
123.45 và maloi = 0
St = 123.XXX không đổi thành số được !
Sai lỗi ở vị trí thứ 5
* Hàm LENGTH (St)
Ý nghĩa: Cho kết quả là một số nguyên chỉ độ dài của chuỗi ký tự St.
Ðể viết 1 chuỗi ký tự ở trung tâm màn hình, ta có thể dùng thủ thuật viết chuỗi là (80 - lenght(st)) div 2
Ví dụ 8.25:
Uses CRT;
Var St : String[80];
Begin
ClrScr ;
Write(' Nhập vào một câu : '); Readln(St) ;
Gotoxy(80 - Lenght(St)) div2, 12);
Writeln(St) ;
Readln ;
End.
* Hàm COPY (St, Pos, Num)
Ý nghĩa: Cho kết quả là một chuỗi ký tự mới có được bằng cách chép từ chuỗi St, bắt đầu từ vị trí Pos và chép Num ký tự.
Nếu vị trí Pos lớn hơn chiều dài của chuỗi St thì hàm COPY sẽ cho một chuỗi rỗng. Nếu giá trị của vị trí Pos và số ký tự Num (Pos + Num) lớn hơn chiều dài của chuỗi St thì hàm COPY chỉ nhận các ký tự nằm trong chuỗi St.
Ví dụ 8.26:
Var St1, St2 : string[25] ;
Begin
St1 := ‘UNIVERSITY OF CANTHO : 1966 - 1996’ ;
St2 := COPY (St1, 15, 6) ;
End.
Như vậy, giá trị của biến St2 bây giờ là CANTHO.
* Hàm CONCAT (St1, St2, ..., StN)
Ý nghĩa: Cho kết quả là một chuỗi mới được ghép theo thứ tự từ các chuỗi St1, St2, ..., StN. Hàm này giống như phép cộng các chuỗi. Chuỗi mới cũng sẽ không được vượt quá 255 ký tự.
* Hàm POS (Obj, St) :
Ý nghĩa: Cho kết quả là vị trí đầu tiên của chuỗi Obj trong chuỗi St. Nếu không tìm thấy thì hàm POS cho giá trị 0.
Ví dụ 8.27:
nếu St := 1234567890, nếu Obj := 456 thì POS (Obj, St) = 4 còn POS(4X, St)=0
d. Truy xuất từng ký tự trong chuỗi
Ta có thể truy xuất đến từng ký tự trong chuỗi với tên biến và chỉ số trong dấu ngoặc vuông [ ] như truy xuất các phần tử của mảng. Ví dụ với chuỗi St thì St[i] là ký tự thứ i trong chuỗi St, dĩ nhiên . Chỉ số i chạy dài từ 1 đến độ dài lớn nhất của chuỗi ký tự.
Ví dụ 8.28:
Program DoiChu;
Var St:String;
i: integer;
Begin
Write('Hãy nhập tên của bạn : ');
Readln(St);
FOR i:= 1 TO Length(St) DO
St[i] := Upcase(St[i]);
(*Hàm Upcase đổi ký tự thành chữ in hoa*)
Writeln;
Writeln(St);
Readln;
End.
III. KIỂU TẬP HỢP (SET)



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

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. 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 := [] ;



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
Каталог: nonghocbucket -> UploadDocument server07 id114188 190495
UploadDocument server07 id114188 190495 -> ChuyêN ĐỀ ĐIỀu khiển tán sắC
UploadDocument server07 id114188 190495 -> Trong khuôn khổ Hội nghị của fifa năm 1928 được tổ chức tại Amsterdam (Hà Lan), Henry Delaunay đã đưa ra một đề xuất mang tính đột phá đối với lịch sử bóng đá
UploadDocument server07 id114188 190495 -> MỤc lục phần I: MỞ ĐẦU
UploadDocument server07 id114188 190495 -> «Quản trị Tài sản cố định trong Công ty cổ phần Điện lực Khánh Hòa»
UploadDocument server07 id114188 190495 -> Khóa luận tốt nghiệp 2010 Mục tiêu phát triển kinh tế xã hội trong thời kì tới 85
UploadDocument server07 id114188 190495 -> ĐỒ Án tốt nghiệp tk nhà MÁY ĐƯỜng hiệN ĐẠi rs
UploadDocument server07 id114188 190495 -> Đề tài: Qúa trình hình thành và phát triển an sinh xã hội ở Việt Nam
UploadDocument server07 id114188 190495 -> Chuyên đề tốt nghiệp Trần Thị Ngọc – lt2 khct L ời cảM ƠN
UploadDocument server07 id114188 190495 -> Địa vị của nhà vua trong nhà nước phong kiến Việt Nam

tải về 291.86 Kb.

Chia sẻ với bạn bè của bạn:
1   2   3   4




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương