– Một kiểu tập hợp được định nghĩa bởi dạng sau: TYPE = SET OF ; trong đó là tên của kiểu dữ liệu cần định nghĩa là tên hoặc là định nghĩa một kiểu dữ liệu nào đó gọi là kiểu cơ sở.
Trang 1Chương 6
Kiểu tập hợp và kiểu mảng
6.1 Kiểu tập hợp (Set Type)
6.1.1 Định nghĩa
– Dữ liệu kiểu tập hợp là một tập hợp của những dữ liệu cùng thuộc một kiểu vô hướng đếm
được (kiểu cơ sở của kiểu tập hợp)
– Một kiểu tập hợp được định nghĩa bởi dạng sau:
TYPE
<tên kiểu> = SET OF <kiểu cơ sở> ; trong đó <tên kiểu> là tên của kiểu dữ liệu cần định nghĩa <kiểu cơ sở> là tên hoặc là định nghĩa một kiểu dữ liệu nào đó gọi là kiểu cơ sở
Ví dụ 1 Sau đây là các ví dụ về định nghĩa kiểu dữ liệu tập hợp và mô tả biến thuộc kiểu dữ liệu đó:
Mau : Set Of (Xanh, Vang, Tim);
– Nếu <kiểu cơ sở> là kiểu nguyên thì giá trị cần phải nằm trong đoạn 0 đến 255
– Hằng kiểu tập hợp được biểu diễn dưới dạng liệt kê các phần tử nằm trong 2 dấu ngoặc vuông [ ] Chẳng hạn, [‘A’,‘D’,‘E’] , [3, 5 , , 9] là các hằng kiểu tập hợp
Trang 26.1.2 Các phép toán trên tập hợp
a Phép toán quan hệ
– Phép toán = (bằng) cho giá trị true nếu 2 tập hợp bằng nhau
– Phép toán <> (khác) cho giá trị true nếu 2 tập hợp khác nhau
– Phép toán <= (nhỏ hơn hoặc bằng): A<=B cho giá trị true nếu A là tập con của B
– Phép toán >= (lớn hơn hoặc bằng): A>=B cho giá trị true nếu B là tập con của A
Chú ý Để kiểm tra tập hợp A có thật sự nằm trong tập hợp B hay không ta sử dụng phép toán AND nh− trong câu lệnh sau đây:
if (A<>B) AND (A<=B) then
Write (‘A la tap hop con thuc su cua B’);
b Phép toán IN
– Dùng để xét xem một phần tử nào đó có nằm trong tập hợp không? Nếu phần tử đó có trong tập hợp thì phép toán sẽ trả về giá trị True, ng−ợc lại trả về giá trị False
Ví dụ 2
‘C’ In [‘A’,’C’,’D’] cho giá trị True
‘E’ In [‘A’,’C’,’D’] cho giá trị False
c Các phép toán hợp, giao, hiệu
Gọi A,B là hai dữ liệu cùng kiểu tập hợp
– A+B là hợp của A và B (tập hợp các phần tử thuộc A và thuộc B)
– A*B là giao của A và B (tập hợp các phần tử thuộc và thuộc B)
– A-B là hiệu của A và B (tập hợp các phần tử thuộc A và không thuộc B)
Chẳng hạn, nếu A=[1,3,9], B=[9,2,5] thì A+B có giá trị là [1,2,3,5,9], A*B có giá trị là [9],
Trang 3Repeat
Clrscr;
Write(‘Nhap mot chu cai:’); readln (ch);
Until ch In chucai;
If Upcase(Ch) In Nguyenam Then Writeln(Ch,’La Nguyen am’)
Else Writeln (Ch, ‘La Phu am’);
Readln;
End
6.2 Kiểu mảng (Array Type)
6.2.1 Khái niệm kiểu mảng (Array)
Mảng là một kiểu cấu trúc dữ liệu được dùng để lưu trữ nhiều phần tử dữ liệu cùng kiểu cùng tính chất nào đó trong cùng một tên chung Các thành phần của mảng được xác định thông qua truy xuất các chỉ số của nó
Chẳng hạn, mảng a một chiều gồm 5 phần tử được phân bố như sau:
a[1] a[2] a[3] a[4] a[5]
Mảng cũng có thể có nhiều chiều, có nghĩa là mỗi một phần tử của mảng được xác định bởi một bộ nhiều hơn một chỉ số Chẳng hạn, để lưu trữ các mảng n hàng, m cột ta có thể sử dụng mảng hai chiều a có nìm phần tử Phần tử ở dòng i cột j của bảng là a[i,j]
6.2.2 Khai báo mảng một chiều
Dạng định nghĩa kiểu mảng:
TYPE
<tên kiểu mảng> = ARRAY [<chỉ số>] OF <kiểu phần tử> ;
trong đó <tên kiểu mảng> là một tên định nghĩa kiểu mảng, <chỉ số> là một kiểu vô hướng đếm
được có hữu hạn phần tử, <kiểu phần tử> là kiểu dữ liệu của các phần tử của mảng
Để khai báo biến kiểu mảng ta có thể sử dụng một trong hai cách:
•Cách 1
VAR <tên mảng> : <tên kiểu mảng> ;
•Cách 2
VAR <tên mảng> : ARRAY[<chỉ số>] OF <kiểu phần tử>;
trong đó <tên mảng> là một tên được dùng để đặt cho mảng cần khai báo
Trang 4Ví dụ 4 ta có thể định nghĩa một mảng 20 phần tử thuộc kiểu Real, có chỉ số chạy từ 20
đến 39 như sau:
Type DAY_THUC = Array[20 39] Of Real;
Khi đó để A, B là các mảng thuộc kiểu mảng trên ta cần khai báo:
Var A,B : DAY_THUC;
Ta có thể thay khai báo này bằng khai báo trực tiếp:
Var A,B: Array [20 39] Of Real;
a Nhập xuất giá trị cho một mảng
Các thủ tục nhập xuất biến như: Writeln, Readln, không thể truy xuất thẳng biến mảng mà phải truy xuất từng thành phần nó
Ví dụ 5 Chương trình dưới đây nhập vào từ bàn phím một dãy số nguyên M và xuất ra màn hình theo thứ tự ngược lại
Trang 5Write (‘phan tu thu’ , i ‘la: ’);
Readln (M[i]);
End;
Writeln (‘ -‘);
Writeln (‘In dau theo thu tu nguoc lai:’);
For i:=n downto 1 do Write (M[i]#32);
Writeln;
Writeln(In cac doi so cña day:’);
For i:=1 to n do Write (-M[i],#32);
Write (‘Dua vao so phan tu cua day: ‘); readln(n);
For i:=1 to n do Begin Write(‘a[‘, i, ’] = ‘); readln(a[i]) end;
For i:=n downto 2 do
Trang 6Khai bao mảng hai chiều : Khai báo mảng hai chiều cũng tương tự như mảng một chiều, chỉ
có điều có hai tập chỉ số cách nhau bởi dấu phẩy (,)
Dạng định nghĩa kiểu:
TYPE
<tên kiểu mảng>=ARRAY[<chỉ số 1>, <chỉ số 2>] OF <kiểu phần tử>; trong đó <chỉ số 1>
và <chỉ số 2> là các kiểu vô hướng đếm được hữu hạn phần tử Đây là các giá trị mà các chỉ số của các phần tử của mảng có thể nhận được
Khai báo các biến của mảng nhiều chiều tương tự như khai báo các biến mảng hai chiều
Ví dụ 6 Ta có thể định nghĩa kiểu mảng 2 chiều
Type M_2C=Array [1 4,’A’ ’D’] Of Integer;
Khi đó mảng A với kiểu dữ liệu M_2C có thể khai báo qua tên:
Var A : M_2C;
hay khai báo trực tiếp:
A: Array [1 4,’A’ ’D’] Of Integer;
Câu hỏi – Bài tập Chương 6
1 Viết chương trình nhập vào một dãy số và xuất ra màn hình các thông tin sau:
a) Phần tử lớn nhất của dãy,
b) Phần tử nhỏ nhất của dãy,
c) Tổng các phần tử của dãy,
2 Viết trong cùng một chương trình thực hiện các yêu cầu sau:
a) Nhập vào từ bàn phím một dãy số nguyên M có 10 phần tử và một số nguyên x thoả mãn tính chất : chữ số tận cùng của x bằng 6 và –180≤x≤1200
b) Xuất ra màn hình số phần tử trong dãy M thoả mãn tính chất : có hai chữ số và chia đúng cho x
c) Tính tích của các phần tử M[i] thoả mãn tính chất: 10<M[i]<20
3 Viết chương trình đổi số nguyên dương từ hệ có số 10 sang hệ cơ số 2
Trang 74 Viết chương trình tính điểm trung bình, xếp loại cho các học sinh trong một lớp với 2 môn thi
là Văn, Toán và các thông tin thống kê sau:
– Số lượng các học sinh được xếp loại giỏi, khá, trung bình, yếu Tỉ lệ phần trăm tương ứng – Số lượng học sinh dưới điểm trung bình môn Văn, Toán Tỉ lệ phần trăm tương ứng
5 Viết phương trình nhập vào từ bàn phím một dãy B có 10 phần tử và một số x Dò tìm xem trong dãy có hai phần tử liên tiếp nào mà tổng của chúng bằng x không ?
6 Viết chương trình nhập vào từ bàn phím một dãy số nguyên và xuất ra màn hình tần suất (số lần xuất hiện) của các số trong dãy số đó
7 Viết chương trình tạo và in ra trên màn hình ma trận đơn vị cấp 10
8 Viết chương trình nhập vào từ bàn phím một ma trận vuông và xuất ra màn hình tổng các phần
tử trên đường chéo chính
9 Viết chương trình nhập vào từ bàn phím giá trị lượng mưa trung bình của 12 tháng trong năm
In ra màn hình biểu đồ cột đứng biểu thị lượng mưa từng tháng (sử dụng ký tự #219)
10 Viết chương trình nhập vào một chuỗi rồi tách ra các nguyên âm và phụ âm của chuỗi đó
11 Viết chương trình nhập vào 2 xâu rồi in ra màn hình các kí tự xuất hiện trong cả 2 xâu
12 Viết chương trình nhập vào các kí tự cho đến khi nào gặp dấu ! thì kết thúc Hãy in ra kết quả a) Số lần xuất hiện của mỗi chuỗi loại kí tự Alphabet
b) Tổng số các chữ cái được nhập vào
c) Số kí tự nhập vào không phải là Alphabet
13 Viết chương trình in ra màn hình 100 số ngẫu nhiên từ 1 dến 100 sao cho không có 2 số nào trùng nhau
14 Viết chương trình in ra màn hình tập hợp các từ có trong một xâu kí tự
Trang 8Chương 7
Chương trình con
7.1 Khái niệm về chương trình con
Khi lập trình thường gặp những đoạn chương trình cùng giải quyết một công việc giống nhau
ở nhiều chỗ khác nhau Để ngắn gọn và dễ sửa đổi chương trình người ta thay thế việc lập những
đoạn chương trình này thành một chương trình con, sau đó chỉ cần gọi tên chương trình con thay cho việc lặp lại cả đoạn chương trình Chẳng hạn, có thể xây dựng chương trình con có tên MAX với hai tham số a, b để tính chọn giá trị lớn nhất trong hai số a, b sau đó mỗi khi cần tính giá trị lớn nhất của hai số x,y nào đó trong chương trình ta chỉ cần gọi chương trình con MAX(x,y) Một ứng dụng khác của chương trình con là phát triển các chương trình lớn Khi đó có thể chia nhỏ công việc thành nhiều chương trình con riêng biệt (Module) Các lập trình viên có thể làm việc độc lập với nhau, người quản lí chung chỉ cần tập hợp và sử dụng các chương trình con
để phát triển chương trình chính Phương pháp này cho phép nhìn nhận và giải quyết vấn đề một cách tổng quát, không bị sa vào các chi tiết nhỏ
Trong Pascal có hai loại chương trình con : Chương trình con thủ tục và chương trình con hàm
7.1.1 Chương trình con hàm
a Dạng tổng quát của khai báo hàm
FUNCTION <tên_hàm>(<tham số hình thức>) : <kiểu dữ liệu>; <khai báo>;
+ Cách 1 : <danh sách biến>: <kiểu dữ liệu> Các biến trong danh sách biến được gọi là các tham trị
+ Cách 2 : Var <danh sách biến>: <kiểu dữ liệu> Các biến trong danh sách biến được gọi
là các tham biến
Trang 9<kiểu dữ liệu > là một tên kiểu dữ liệu hoặc định nghĩa kiểu dữ liệu, nó quy định kiểu dữ liệu cho kết quả
– <khai báo> là các khai báo thêm cho chương trình con nếu cần Phần này thường sử dụng để khai báo các biến không phải là tham số hình thức và chỉ được sử dụng trong chương trình con (gọi là các biến cục bộ)
– <dãy các câu lệnh> là một dãy các câu lệnh Pascal (có thể là lệnh ghép) để thực hiện việc tính giá trị cho <tên hàm> mỗi khi có lời gọi hàm
Ví dụ 1 Sau đây là một chương trình con dạng hàm tính dùng để tính hàm tang:
Function tg(x: Real): Real;
Ví dụ 2 Như hàm đã định nghĩa ở trên ta có thể có lời gọi:
y:=tg(x*x+2);
7.1.2 Thủ tục
a Dạng tổng quát của khai báo thủ tục
PROCEDURE <tên thủ tục> (<tham số hình thức>);
– <tên thủ tục> là một tên dùng để kí hiệu thủ tục
– <tham số hình thức> là một dãy các tên biến cùng với mô tả kiểu của nó Trong <tham số hình thức> các biến được khai báo kiểu dữ liệu của nó bằng hai cách như đối với chương trình con
Trang 10FUNCTION
(<tham số hình thức>) có thể không có
– <khai báo> và <dãy các câu lệnh> được xác định như đối với chương trình con FUNCTION
Ví dụ 3 Chương trình con MAX sau đây thực hiện việc tìm số lớn nhất trong 2 số nguyên cho trước
Procedure MAX(x,y:Real; Var z: Real);
Begin
If x>y then z:=x else z:=y;
End;
b Lời gọi thủ tục
Thủ tục được gọi như là một lệnh đơn trong chương trình Dạng gọi thủ tục như sau:
<tên thủ tục>(tham số thực sự>);
trong đó <tham số thực sự> là một dãy các biểu thức tương ứng với các biến trong <tham số hình thức> Nếu tham số hình thức là tham biến thì tham số thực sự tương ứng phải là tên biến Nếu tham số hình thức là tham trị thì tham số thực sự tương ứng có thể là biểu thức
Kết quả của lời gọi thủ tục là giá trị nhận được ở các tham biến
Ví dụ 4 Lời gọi sau đây cho kết quả là giá trị lớn nhất giữa hai giá trị a*a+2 và b-1, với a, b
là hai biến có giá trị đã được xác định trước đó Kết quả được lưu trong tên biến c
Có nghĩa là giá trị của nó không bị thay đổi bởi các phép gán trong chương trình con
Ví dụ 5 Hai chương trình dưới đây sẽ chỉ rõ sự khác nhau giữa tham biến và tham trị trong các chương trình con
♦ Chương trình 1
Program Tham_tri;
Trang 11Var a,b,c: Integer;
Procudure InTri(Var x,y,z : Integer);
Trong ví dụ này khi thủ tục InTri nhân x, y, z với 2 thì biến toàn cục thay đổi
7.2 Một số hàm và thủ tục của Turbo Pascal
Trang 12– DELLINE : Thủ tục này có tác dụng xoá dòng chứa con trỏ màn hình, các dòng sau sẽ được chuyển lên một dòng
– TEXMODE(<Medo>: Integer) Thủ tục này có tác dụng chọn chế độ trình bày văn bản Tham số< Mode> sẽ lấy giá trị:
BW40=0; {40x25 B/W trên Color Adapter},
C40=1; {40x25 Color trên Color Adapter},
BW80=2; {80x25 B/W trên Color Adapter},
C80=3; {80x25 Color trên Color Adapter},
Mono=7; {80x25 trên Monochrome Adapter},
Font8x8=256; EGA và VGA: 43, 50 Line Mode
LastMode= -1
Khi khai báo TextMode (LastMode) chương trình tự động thử xem Mode màn hình trước đó và
ấn định Mode đó cho chương trình Điều này đặc biệt thuận lợi khi ta muốn chương trình chạy được trên nhiều loại máy khác nhau
– WINDOW (x1,y1,x2,y2): Thủ tục này có tác dụng thiết lập một cửa sổ để trình bày (x1,y1)
là toạ độ góc trái phía trên của cửa sổ, (x2,y2) là toạ độ góc phải phía dưới của cửa sổ Cửa sổ mặc nhiên là Window(1,1,80,25) Thủ tục này ảnh hưởng đến các lệnh trình bày dữ liệu trên màn hình
ở chế độ văn bản
– GOTOXY(x,y) : Thủ tục này có tác dụng đưa con trỏ màn hình đến tọa độ (x,y) : dòng y, cột
x
– HIGHVIDEO : Thủ tục này cho phép hiển thị trên màn hình với độ chói cao
– LOWVIDEO : Thủ tục này cho phép hiển thị trên màn hình với độ chói thấp
– NORMVIDEO: Thủ tục này khôi phục thuộc tính màn hình, mặc định theo các thuộc tính đã hiện hữu ở vị trí con trỏ màn hình khi thực hiện chương trình
– SOUND(Hz) : Thủ tục này cho phép phát âm thanh có tần số Hz cho đến khi gặp thủ tục NoSound
– NOSOUND : Thủ tục này có tác dụng tắt loa phát âm thanh ở máy
– DELAY (ms) : Thủ tục này tạm treo chương trình trong thời gian ms mili giây
– TEXTCOLOR(color) : Thủ tục này chọn màu của kí tự trình bày trên màn hình Color có giá trị từ 0 đến 255
– TEXTBACKGROUND(color) Thủ tục này chọn màu nền trong chế độ văn bản
Trang 13Các hằng xác định màu nền và chữ:
Black = 0 Brown = 6 LightRed = 12
Blue = 1 LighGray = 7 LightMagenta = 13
Green = 2 DarkGray = 8 Yellow = 14
Cyan = 3 LightBlue = 9 White = 15
Read = 4 LightGreen = 10
Magenta = 5 LightCyan = 11
Hằng xác định nhấp nháy: Blink = 128
Chú ý Nếu muốn màu nền loang đều trên màn hình thì sau khi phát lệnh TextBackGround(color) thì đánh tiếp lệnh ClrScr
7.2.2 Các hàm
– KEYPRESSED : Hàm kiểm tra có nút nào được nhấn trên bàn phím không Nếu có cho giá trị True, nếu không cho giá trị False
– READKEY : Hàm đọc kí tự từ bàn phím (ký tự nhập không được trình bày trên màn hình) Các nút trên bàn phím như: A, B, C, chỉ tạo một kí tự khi được nhấn Còn các nút chức năng F1, F2, Home, end, Alt, Ctrl, tạo hai kí tự khi được nhấn, trong đó kí tự thứ nhất sẽ mang mã 0 Hàm ReadKey chỉ đọc được kí tự thứ nhất (kết quả đều như nhau) Để sử dụng được các nút này, trong lập trình ta sử dụng:
đến chính nó Để thấy rõ hơn ta xét hai chương trình con sau đây:
Chương trình con 1. Thủ tục đệ quy sau đây thực hiện việc in ra dãy các chữ số của một số
tự nhiên theo thứ tự ngược lại:
Procedure In_so(n:word);
Trang 14end
End;
Khi cã lêi gäi, ch¼ng h¹n In_so(123) th× qu¸ tr×nh thùc hiÖn sÏ nh− sau:
– IN sè 3 (theo lÖnh write(123 mod 10)
– Gäi thñ tôc In_so(12) (theo lêi gäi In_so(123 div 10))
– In sè 2 (theo lÖnh write(12 mod 10)
– Gäi thñ tôc In_so(1) (theo lêi gäi In_so(12 div 10))
– In sè 1 (theo lÖnh write(1 mod 10)
– Gäi thñ tôc In_so(0) (theo lêi gäi In_so(1 div 10))
– A=4 3.G_thua(2)( G_thua:=3*GT mµ GT:=G_thua(3-1))
– A=4 3.2.G_thua(1)( G_thua:=2*GT mµ GT:=G_thua(2-1))
– A=4 3 2 1.G_thua(0)( G_thua:=1*GT mµ GT:=G_thua(0))
→ Cuèi cïng A=4.3.2.1.1 = 4!
C©u hái – Bµi tËp Ch−¬ng 7
1 ViÕt ch−¬ng tr×nh tÝnh tæng:
Trang 151! + 2! + 3! + +n! với n < 12 và đã được nhập vào từ bàn phím
2 Viết chương trình có các chức năng sau:
– Tìm ước số chung lớn nhất của hai số nguyên
– Tìm bội số chung nhỏ nhất của hai số nguyên
6 Tàu NT1 cứ k ngày cập bến cảng một lần, tàu NT2 cứ m ngày cập bến cảng một lần (k≠m) Viết chương trình nhập k và m từ bàn phím rồi tính xem nếu hai tàu cùng rời cảng thì sau thời gian ngắn nhất là bao nhiêu ngày chúng lại cùng cập cảng Biết rằng ngày rời cảng luôn luôn cùng với ngày cập cảng
7 Viết chương trình nhập từ bàn phím 2 ma trận vuông cấp 2 và xuất ra màn hình các kết quả sau: a) Ma trận tổng A + B
b) Ma trận hiệu A – B
c) Ma trận tích A * B
d) Ma trận chuyển vị của A
8 Viết hàm Function NTo(n:word) : Boolean; để kiểm tra xem n có phải là số nguyên tố ?
9 Viết 2 hàm tìm Max, Min của 3 số thực
10 Viết hàm LOWCASE(c: Char): Char để đổi chữ cái hoa C thành chữ thường
11 Viết thủ tục KHUNG(x1,y1,x2,y2:Integer) để vẽ một khung hình chữ nhật có đỉnh trên bên trái là (x1,y1) và đỉnh dưới bên phải là (x2,y2)
12 Viết thủ tục FILL(x1,y1,x2,y2:Integer; ch:Char) để tô một vùng màn hình hình chữ nhật có
đỉnh trên bên trái là (x1,y1) và đỉnh dưới bên phải là (x2,y2) bằng các kí tự ch
13 Viết thủ tục để hoán đổi hai giá trị x,y cho nhau
14 Viết hàm tìm BSCNN và USCLN của 2 số nguyên a,b được khai báo như sau:
Trang 16Function USCLN(a,b: word ) : word;
Function BSCNN(a,b: word ) : word;
15 Viết thủ tục để tối giản phân số a/b, với a, b là 2 số nguyên
S5 = 1 + sin(x) + sin2(x) + + sinn(x)
17 Viết hàm đệ quy tính Ckn biết : C = 1, C = 1, C = Cnn 0n kn k-1n-1 + Cn-1k
Trang 17Chương 8
Kiểu chuỗi kí tự
8.1 Khai báo kiểu chuỗi
Chuỗi là kiểu dữ liệu có cấu trúc dùng để tổ chức lưu trữ và xử lí các xâu kí tự Một chuỗi
được khai báo bằng từ khoá STRING theo sau là số kí tự cực đại có thể có của chuỗi được đặt trong hai dấu ngoặc vuông [ ]
Định nghĩa kiểu chuỗi:
TYPE
<tên> = String[<độ dài cực đại>];
trong đó <tên> là tên của kiểu dữ liệu, <độ dài cực đại> là một số nguyên dương chỉ độ dài tối đa của mỗi chuỗi có thể được lưu trữ trong biến thuộc kiểu dữ liệu này
Đối với Turbo Pascal:
– String có chiều dài tối đa là 255
– Có thể không chỉ ra <độ dài cực đại> khi đó mặc nhiên độ dài cực đại là 255
Biến kiểu chuỗi có thể được khai báo bằng tên hoặc khai báo trực tiếp như trong ví dụ sau
Trang 18– Readln(St) sẽ đọc các kí tự cho chuỗi St với độ dài thực sự là số kí tự gõ vào từ bàn phím Nếu
ta gõ <Enter> luôn, không cho kí tự nào thì St = ‘’ (chuỗi rỗng)
b) Ghép nối chuỗi
Phép nối String : Kí hiệu bởi dấu (+)
Chẳng hạn : Nếu A:= ‘Turbo’;
‘ABC’ = ‘ABC’ có trị là True
‘ABC’ = ‘AB’ có trị là False
‘ABCD’ < ‘ABED’ có trị là True
Trang 19‘ABC’ > ‘AD’ có trị là False
8.3 Các thủ tục trên chuỗi kí tự
♦ Thủ tục DELETE (<St>, <Pos>, <Num>);
trong đó <St> là biến kiểu String, <Num> và <Pos> là các biểu thức nguyên Thủ tục này xoá khỏi chuỗi <St> một số kí tự là <Num> và bắt đầu từ vị trí thứ <Pos> (tính từ trái sang phải)
Ví dụ 3 Nếu St là biến kiểu chuỗi kí tự thì sau khi thực hiện dãy lệnh:
St:=’ABCDEFG’;
Delete(St, 2, 4);
Writeln(St);
trên màn hình sẽ có kết quả là : AFG
♦ Thủ tục INSERT(<St2>,<St1>,<Pos>);
trong đó <St1> là biến kiểu String, <St2> là biểu thức kiểu String, <Pos> là biểu thức kiểu nguyên Thủ tục này dùng để chèn chuỗi kết quả của biểu thức <St2> vào chuỗi <St1> ở vị trí
sẽ cho kết quả trên màn hình là: ABTFGCD
Trường hợp <Pos> vượt quá chiều dài của <St1> thì <St2> sẽ được nối đuôi vào <St1>
thì kết quả xuất hiện trên màn hình là: 1234 (có năm kí tự, kí tự đầu tiên là kí tự trắng)
♦ Thủ tục VAL(<St>,<var>,<code>);
trong đó <St> là biểu thức kiểu chuỗi kí tự, <var> là biến nguyên hay thực, còn <code> là biến nguyên Thủ tục này đổi chuỗi chữ số <St> (biểu diễn một số nguyên hay thực) thành số và gán cho biến <var>.<code> là số nguyên để phát hiện lỗi : Nếu phép biến đổi đúng thì <code> có giá
Trang 20trị bằng 0, nếu sai do <St> không biểu diễn đúng số nguyên hay thực, <code> sẽ nhận giá trị bằng
vị trí của kí tự sai trong chuỗi <St>
Ví dụ 6 Nếu St là biến kiểu chuỗi kí tự, i và e là hai biến nguyên thì sau khi thực hiện dãy lệnh:
St:=‘234’ ; e:=0;
Val(St, i, e);
Writeln(i);
sẽ cho kết quả trên màn hình là : 234
Nếu thay lệnh đầu tiên là St:=‘2121x’ thì i không xác định và e=3 (kí tự thứ 3 gây lỗi)
Sau đây là một ứng dụng dùng thủ tục Val để đọc số nguyên từ bàn phím Bình thường ta dùng thủ tục Readln(i) để đọc số nguyên i, song nếu chẳng may ta gõ nhầm chữ cái vào máy thì máy dừng lại, có thể gây lãng phí thời gian, bây giờ ta muốn máy kiểm tra lỗi, nếu có thì báo lỗi để gõ lại số liệu
Procedure DOC_Integer(Var: Integer);
Var St: String[6]; e: Integer;
trong đó <St> là một biểu thực chuỗi Hàm này cho ta độ dài của biểu thức chuỗi kí tự <St>
Ví dụ 7 Nếu St là biến chuỗi , i là một biến nguyên thì sau khi thực hiện dãy lệnh sau:
St = ‘ABCDEF’ ; i:= Length(St);
Writeln(i);
sẽ cho kết quả trên màn hình là số nguyên 7
Hàm COPY(<St>,<Pos>,<Num>);
Trang 21trong đó <St> là biểu thức kiểu chuỗi kí tự, <Pos>, <Num> là các biểu thức kiểu nguyên Hàm cho ta một chuỗi mới bằng cách chép <Num> kí tự từ chuỗi <St>, bắt đầu từ vị trí <Pos>
Ví dụ 8 Nếu St1, St2 là các biến kiểu chuỗi kí tự thì sau khi thực hiện dãy lệnh:
St1:=‘BCDEF’;
St2:=Copy(St1, 3, 2);
Writeln(St2);
thì trên màn hình sẽ cho kết quả là chuỗi : CD
Nếu <Pos>+<Num> lớn hơn Length (<St>) thì Copy chỉ nhận các kí tự nằm trong chuỗi <St> Nếu <Pos> lớn hơn Length(<St>) thì Copy sẽ cho một chuỗi rỗng
Hàm CONCAT(<St1>,<St2>, , <Stn>);
trong đó <St1>, <St2>, ,<Stn> là các biểu thức kiểu chuỗi kí tự
Hàm này cho kết quả là ghép nối tất cả các chuỗi <St1>, <St2>, ,<Stn> thành một chuỗi theo thứ tự đã viết
Chú ý
– Số l−ợng đối số của hàm concat phải ≥ 2
– Nếu tổng số chiều dài của các chuỗi cộng lại > 255 thì máy sẽ báo lỗi
– Có thể dùng phép (+) để ghép nối chuỗi thay Concat
• Hàm POS(<St1>,<St2>);
trong đó <St1>,<St2> là hai biểu thức kiểu chuỗi kí tự Hàm này cho ta số nguyên chỉ vị trí đầu tiên của chuỗi <St1> gặp trong chuỗi <St2> Nếu không tìm thấy thì <Pos> có giá trị bằng 0 Chẳng hạn, nếu St:=‘ABCDEFBCD’ thì
Pos(‘DE,St) cho kết quả là 4, Pos(‘XY’,St) là 0;
Trang 22Writeln(‘NhËp vµo mét c©u: ’); Readln(cau);
For i := Length(cau) Downto 1 Do Writeln(cau[i]);
Trang 23Câu hỏi – Bài tập chương 8
1 Viết chương trình nhập vào từ bàn phím họ và tên Việt Nam và chỉ xuất phần tên ra màn hình Chẳng hạn, nhập ‘Nguyễn Văn Long’, xuất ‘Long’
2 Viết chương trình nhập vào từ bàn phím một chuỗi kí tự bằng các kí tự thường hay hoa và xuất
ra màn hình chuỗi đó bằng kí tự hoa Chẳng hạn, nhập ‘Trung Tam’ xuất ra ‘TRUNG TAM’
3 Viết chương trình đổi một số nguyên dương hệ cơ số 10 sang hệ cơ số bất kì
4 Viết chương trình đọc vào từ bàn phím một câu được kết thúc bằng dấu chấm và cho biết có bao nhiêu nhóm kí tự ‘T.R’ trong câu này
5 Viết chương trình đọc vào từ bàn phím một câu được kết thúc bằng dấu chấm Hãy đếm trong câu có bao nhiêu từ Để đơn giản, ta định nghĩa từ là một dãy liên tục các kí tự khác khoảng trắng, khoảng trắng là dấu tách từ duy nhất
6 Viết chương trình xuất lên màn hình một khung hình chữ nhật và một dòng chữ di chuyển từ phải qua trái bên trong khung cho đến khi nhấn một phím bất kì
7 Viết hàm Trim(St:String):String, có kết quả trả về chuỗi St được loại bỏ các khoảng trống bên phải
8 Viết chương trình tính tổng các số hạng của một số nguyên dương bất kì nhập vào từ bàn phím
Trang 24Chương 9
Kiểu bản ghi và kiểu tập tin
9.1 Kiểu bản ghi (Record type)
9.1.1 Khái niệm và định nghĩa
Các kiểu cấu trúc dữ liệu như kiểu mảng, kiểu tập hợp đều được tạo ra bằng một tập hợp các phần tử có cùng kiểu Chẳng hạn, các phần tử của mảng được mô tả bởi Array[1 50] of Integer là các số nguyên Để tạo ra một kiểu cấu trúc dữ liệu mới với các phần tử dữ liệu có kiểu khác nhau, người ta định nghĩa ra các bản ghi (Record)
Record là một cấu trúc nhiều thành phần Các thành phần có thể thuộc các kiểu dữ liệu khác nhau và được gọi là trường (Field), mỗi trường đều được đặt bởi một tên
Để định nghĩa kiểu T có cấu trúc kiểu bản ghi với danh sách các trường có tên là: S1, S2, ,
Sn và có các mô tả kiểu tương ứng là T1, T2, ,Tn ta có cách viết như sau:
Trang 25Để mô tả một biến kiểu bản ghi ta có thể mô tả bằng tên kiểu bản ghi hoặc mô tả thông qua
định nghĩa trực tiếp Chẳng hạn, với tên Dia_chi đã đ−ợc định nghĩa trong ví dụ 2 ta có thể mô tả:
Var X,Y,Z : Dia_chi;
hoặc có thể mô tả trực tiếp nh− sau:
Var X,Y,Z : Record
So_nha : Word;
Duong_pho : String[20];
Thanh_pho : String[15];
End;
9.1.2 Sử dụng biến kiểu bản ghi
Muốn truy xuất một biến kiểu bản ghi ta phải truy xuất theo thành phần của chúng Cú pháp
để truy xuất đến một thành phần nào đó là:
Trang 26Writeln(‘NHAP HO SO CAN BO’);
Write(‘So can bo: ‘); Readln(socb);
Write(‘Co gia dinh (Y/N)?:’); Readln(Gd);
Trang 27If Upcase(Gd)=’Y’ then ds[i].giadinh:=True
If cb2=cb1 Then Writeln (‘Cung mot nguoi’);
9.1.3 Sử dụng câu lệnh With
Khi cần truy cập vào nhiều thành phần của một biến kiểu bản ghi ta có thể dùng câu lệnh With để chương trình được gọn hơn
Dạng câu lệnh:
Trang 28WITH < tên biến > DO <câu lệnh>;
trong đó <tên biến> là tên của một biến kiểu bản ghi còn <câu lệnh> là một câu lệnh Pascal, thông thường là một lệnh ghép chứa nhiều trường của bản ghi
Ví dụ 5 Ta có thể thay đoạn chương trình trong ví dụ 4 bằng đoạn sau đây:
For i:=1 To Socb Do
Write(‘Có gia dinh (Y/N)?: ’); Readln(gd);
If Upcase(Gd)=‘Y’ then ds[i].Giadinh:=True
Else ds[i].Giadinh:=False
End; {With}
Như vậy chúng ta còn có thể lồng các chỉ thị With Do vào với nhau để thâm nhập vào các trường ở sâu trong record phức tạp như biến ds[i]
9.1.4 RECORD có cấu trúc thay đổi
Các kiểu Record được trình bày ở trên là kiểu Record cố định vì số thành phần cũng như cấu trúc của Record là cố định Bên cạnh đó ngôn ngữ Pascal còn cho phép thành lập các Record có một phần cấu trúc thay đổi được
Trang 29Nghe = (Congnhan, Kisu, Bacsi, Cabiet);
Nganh = (Khaithac, Cokhi, Chebien, Nuoi, Kinhte);
Khoa = (Noi, Ngoai, Nhi, Phu);
Case Nghenghiep: Nghe of
Congnhan: (NganhCN: Nganh; Bactho: Byte);
Kisu : (NganhKS : Nganh;
TrinhdoTT: (Kem, TB, Kha, Gioi));
Bacsi: (Chuyenkhoa : Khoa);
Trang 30Trong khai báo một kiểu bản ghi các thành phần thay đổi (nếu có) phải nắm chắc các thành phần cố định và chỉ được phép có nhiều nhất là một trường thay đổi Nói cách khác phần thay đổi
được đặt sau cùng trong danh sách các trường và nó được bắt đầu bằng lệnh Case Tuy nhiên phần thay đổi có thể lại chứa kiểu bản ghi khác có cấu trúc thay đổi
Chú ý
– Phần thay đổi bao gồm một trường gọi là trường đánh dấu (Tag Field) được đặt trong câu lệnh Case ứng với mỗi giá trị của trường đánh dấu ta có các biến dạng của kiểu bản ghi với danh sách các trường tương ứng được đặt sau các nhãn của lệnh Case và toàn bộ danh sách này phải được đặt trong hai dấu ngoặc đơn
– Trường đánh dấu phải được mô tả bằng một kiểu đơn giản
– Tất cả các tên biến trong phần thay đổi đều bắt buộc phải khác nhau
Ví dụ 6 Chương trình sau đây thực hiện việc nhập họ tên và điểm trung bình của một lớp theo thứ tự giảm dần của điểm trung bình và có xếp hạng
Trang 31Write (‘Ho ten :’); Readln (Hoten);
Write (‘Diem TB: ’); Readln (Dtb);
Trang 329.2 Kiểu tập tin (File type)
9.2.1 Khái niệm về tập tin
Tập tin (File) là một cấu trúc dữ liệu gồm nhiều thành phần cùng kiểu được chứa ở bộ nhớ ngoài
Định nghĩa một kiểu tập tin với các phần tử có kiểu phần tử nào đó được viết trong phần mô tả kiểu với từ khoá FILE OF như sau:
TYPE
<tên> = FILE OF <kiểu phần tử>;
trong đó <tên> là một tên định danh cho tập tin, <kiểu phần tử> là một kiểu dữ liệu nào đó khác với kiểu tập tin và thông thường là kiểu bản ghi