1. Ðịnh nghĩa vă khai bâo
Câc cấu trúc dữ liệu kiểu mảng (Array) vă tập hợp (Set) có hạn chế ở chỗ câc phần tử trong tập hợp của chúng phải cùng kiểu mô tả. Song trong thực tế, có những kiểu cấu trúc dữ liệu khâc nhau nhưng lại có một mối liín quan năo đó.
Ví dụ 8.36:
Ðể mô tả dữ liệu về lý lịch một người năo đó, người ta phải khai bâo họ tín người (kiểu String), Phâi (Nam :=True, Nữ := False theo kiểu Boolean), ngăy sinh (mô tả kiểu date), địa chỉ (kiểu String) vă mức lương (kiểu integer), v.v... Với câc kiểu cơ bản khâc nhau như vậy trong Pascal, ta phải dùng kiểu bản ghi (RECORD).
Kiểu bản ghi trong ngôn ngữ Pascal gắn liền với kiểu tập tin (FILE) - sẽ được trình băy trong phần kế tiếp. Tuy nhiín, ta có thể sử dụng RECORD một câch độc lập với FILE. RECORD lă kiểu dữ liệu bao gồm nhiều thănh phần có thể khâc nhau về kiểu dữ liệu, mỗi thănh phần được gọi lă trường (Field).
Cú phâp khai bâo kiểu bản ghi (Record) trước rồi khai bâo biến như sau:
+ Khai bâo giân tiếp:
TYPE = RECORD = RECORD [,,...] : ; [,,...] : ; ... ... ; END ; VAR [,, ...] : ; Ví dụ 8.37:
Ta đang lăm một khai bâo về khâch hăng của công ty chuyín bân hăng trả góp năo đó. Số liệu cần sử dụng lă ngăy thâng lăm bản ghi vă câc thông tin cơ bản về khâch hăng nợ thanh toân cho công ty, theo minh họa ở hình dưới:
Trong chương trình năy, Công ty phđn ra 3 tình trạng loại khâch nợ (status): đúng kỳ hạn phải trả (current), đê quâ hạn phải trả (overdue) vă loại khâch chểnh mảng, dđy dưa việc trả nợ nhiều lần (delinquent). Ở đđy:
- Status được khai bâo theo kiểu dữ liệu liệt kí (enumerated data type).
(kiểu chuỗi string), số khâch nợ (kiểu số nguyín integer-type), loại khâch nợ (kiểu liệt kí enumerated type) vă số liệu tồn đọng nợ của khâch (kiểu số thực real-type).
- Date (Ngăy thâng) lă một kiểu Record trong chương trình ghi ngăy, thâng năm đâo nợ của khâch hăng.
Biến của chương trình lă khâch hăng (customer). Ta có thể khai bâo như sau:
Code:
TYPE status = (current, overdue, delinquent); date = RECORD day : 1 .. 31 ; month : 1 ..12 ; year : 1900 .. 2100 ; END ; account = RECORD Custname : String ; Custaddress : String ; Custno : 1 .. 9999 ; Custtype : status ; Custbalance : Real ; Lastpayment : date; END;
VAR customer : account ;
+ Khai bâo trực tiếp
VAR [,, ...] : RECORD [,, ...] : RECORD [,,...] : ; [,,...] : ; ... ... ; END ;
2. Truy xuất một Record
Ðể truy xuất văo một trường của kiểu Record, ta cần dùng tín biến kiểu Record, sau đó lă dấu chấm (.) rồi đến tín trường. Dạng tổng quât sau:
.
Ví dụ 8.39: Nhập lý lịch nhđn viín của một cơ quan
Code:
TYPE
Lylich = RECORD {Lý lịch gồm Họ tín, Tuổi, Phâi, Lương}
Hoten : string [25] ; Tuoi : integer ;
PhaiNam : boolean; {Nam : M (Male), Nữ : F (Female)}
Luong : real; END;
VAR x, y : Lylich ;
nv : ARRAY [1 .. 200] OF Lylich ; {nv lă mảng lý lịch câc nhđnviín} viín}
...
FOR i := 1 TO n DO BEGIN
Write(' Họ tín : '); readln(nv[i].Hoten); Writeln(' Tuổi : '); readln(nv[i].Tuoi) ; Write(' Phâi (Nam :M, Nữ : F) ? '); readln (Phai);
IF (Phai = ‘M’) or (Phai =‘m’) THEN nv[i].PhaiNam := TRUE
ELSE nv[i].PhaiNam := FALSE ;
Writeln(' Lương : '); read(nv[i].Luong) ; END ;
...
Lưu ý :
· Câc biến Record có thể gân cho nhau. Ví dụ x vă y lă 2 biến bản ghi có cùng kiểu Lylich, thì ta có thể gân:
x := y;
Như vậy ta không phải lặp lại: x.Hoten := y.Hoten ;
x.Tuoi := y.Tuoi ; ...
· Không được viết ra măn hình hoặc đọc từ băn phím một biến record như :
Writeln(x); hoặc Readln(x);
· Không thể so sânh câc record bằng câc phĩp toân quan hệ <, >, <=, >=,=,<>
· Không được dùng câc toân số học vă logic với kiểu record.
Ví dụ 8.40: Nhập văo 2 số phức C1 vă C2 vă tính C3 lă tổng của chúng
Với chương trình loại năy ta phải lần lượt nhập từng phần thực vă phần ảo riíng rẽ của C1 vă C2. Ta không thể dùng dòng lệnh C3 = C1 + C2. Kết quả tính C3 phải lă phĩp cộng riíng rẽ từng phần thực vă phần ảo của C1 vă C2 rồi ghĩp lại.
Code: PROGRAM So_Phuc ; TYPE Sophuc = Record pt, pa : real ; End; VAR c1, c2, c3 : Sophuc ; BEGIN
Write('Lần lượt nhập phần thực vă phần ảo của 2 số phức C1 vă C2') ;
Write('Nhập phần thực của số phức C1 : ') ; Readln(c1.pt) ;
Write('Nhập phần ảo của số phức C1 : ') ; Readln(c1.pa) ;
Write('Nhập phần thực của số phức C2 : ') ; Readln(c2.pt) ;
Write('Nhập phần ảo của số phức C2: ') ; Readln(c2.pa) ;
c3.pt := c1.pt + c2.pt ;
c3.pa := c1.pa + c2.pa ;
Write(‘C3 = C1 + C2 ‘);
Write(‘ = (‘, c1.pt:5:2, ‘+i ‘, c1.pa:5:2, ‘) +(‘, c2.pt:5:2, ‘+i ‘,c2.pa:5:2, ‘) ‘);
Write(‘C3 = ‘, c3.pt:5:2, ‘+i’, c3.pa:5:2 ); Readln;
END.
3. Câc Record lồng nhau
Record lồng nhau lă record mă có trường (field) của nó lại có kiểu lă một record khâc. Ta có thể định nghĩa câc record lồng nhau theo một câch trực tiếp hay giân tiếp nhau vă câch khai bâo cũng hoăn toăn tương tự như câch khai bâo record ở trín.
Ví dụ 8.41: Code: TYPE dd_mm_yy = Record dd:1..31; mm:1..12; yyyy:1900..2100; end; hoso = Record masv:string[7]; ngsinh:dd_mm_yyyy; diem:real; end; VAR
Lop: Array[1..20] of hoso;
4. Cđu lệnh WITH
Nhiều chương trình đòi hỏi câc phần tử khâc nhau của cùng một record phải được thao tâc tại câc vị trí khâc nhau bín trong chương trình. Như vậy phải cần có nhiều chỉ thị trường khâc nhau đặc trưng. Việc năy lăm chương trình trở nín phức tạp, tẻ nhạt vă khó theo dõi. Ðể giải quyết tình trạng năy, Pascal đê đưa ra cấu trúc cđu lệnh WITH ... DO trong record nhằm bớt đi câc rắc rối từ câc chỉ thị trường (hay nói câch khâc, cđu lệnh WITH .. DO như lă phĩp toân đặt thừa số chung mă ở đó thừa số chung lă câc tín biến record).
Dạng tổng quât của cđu lệnh WITH lă:
WITH DO BEGIN BEGIN ; ... ; ; END ; Ví dụ 8.42:
Một biến bản ghi DANSO có câc trường KHUVUC, HOTEN, NGAYSINH, DIACHI, NGHE đưa dữ liệu từ băn phím như sau:
Code:
BEGIN
Write ('Khu vực điều tra :'); Readln (KHUVUC); Write ('Họ tín công dđn :'); Readln (HOTEN); Write ('Ngăy-thâng-năm sinh :'); Readln
(NGAYSINH);
Write ('Ðịa chỉ công dđn :'); Readln (DIACHI); Write ('Nghề nghiệp : '); Readln (NGHE); END ;
Ðối với bản ghi có nhiều thứ bậc: R1 lă biến bản ghi có trường R2 R2 lă biến bản ghi con có trường R3 R3 lă biến bản ghi con có trường R4 ...
thì cđu lệnh WITH được tổ chức lồng nhau:
WITH R1 DO WITH R2 DO WITH R2 DO ... WITH RN DO ;
hay viết đơn giản hơn:
WITH Record1, Record2, ..., RecordN DO ;
Ở ví dụ 8.41, ta có thể viết như sau:
Code:
WITH Lop[i] DO
Begin
With Ngsinh Do
Begin dd:= 25; mm:=05; yyyy:=1978; End; masv:='7962343'; diem:=9.0; End;
Phạm Văn Ất, 1993. Turbo Pascal 5 & 6 - Giâo trình cơ sở vă nđng cao kỹ thuật lập trình
hướng đối tượng, NXB Giâo dục, Hă Nội.
Byron S. GottFried, 1994. Theory and Problems of Programming with Pascal, 2/ed, Schaum's Outline Series, McGraw-Hill Int. Ed., New York, USA.
Hồ Sĩ Ðăm, Nguyễn Tô Thănh, Dương Việt Thắng, Nguyễn Thanh Tùng, 1995. Băi tập Tin học I, NXB Giâo dục, Hă Nội.
Francis Scheid, 1982. Theory and Problems of Computers and Programming, McGraw-Hill Book Co., New York, USA.
J. Glenn Brookhear, 1991. Computer Science. The Benjamin/ Cummings Publishing Co.,l nc., New York, USA. New York, USA.
Bùi Việt Hă, 1995. Hướng dẫn sử dụng Norton Commander, NXB. Giâo dục ,Hă Nội. Ðoăn Nguyín Hải, Nguyễn Trung Trực, Ng. Anh Dũng, 1993. Lập trình căn bản ngôn
ngữ Pascal, NXB Khoa Tin học, Ðại học Bâch khoa TP. HCM.
Henri E. Bal, Dick Grune, Programming Language Essentials, Addison - Wesley Publishing Company, New York, USA.
Nguyễn Văn Hoăi, Nguyễn Tiến, 1995. Tin học căn bản, NXB. Giâo dục, Hă Nội. Nguyễn Tiến Huy, 1995. Giâo trình Tin học căn bản , TT Tin học Ðaị học Tổng hợp TP.
Hồ Chí Minh, NXB Ðồng Nai, Biín Hòa.
Trần Sĩ Huyín, 1996. Câc vấn đề về lập trình Pascal, NXb Trẻ, TP. Hồ Chí Minh. Nguyễn Xuđn Quốc Hưởng, 1996. Tin học A & B, NXB Trẻ, TP. Hồ Chí Minh.
Nguyễn Trần Kỷ, Vương Quang Tiến, Nguyễn Thế Hùng, 1994. DOS 6.0 & 6.2, NXB.
Thống kí, Hă Nội.
Trần Thị Lệ, Hoăng Kiếm, 1995. Tin học 10, NXB. Giâo dục, Hă Nội.
Ngô Hữu Liím, 1990. Giâo trình nhập môn lập trình, Tủ sâch Trung tđm Tin học,
TP.HCM.
Nguyễn Văn Linh, 1994. Giâo trình Tin học đại cương, Tủ sâch Ðại học Cần Thơ. Võ Hiếu Nghĩa, 1994. Tự học Tin học, NXB Thống kí Hă Nội.
Quâch Tuấn Ngọc, 1995. Giâo trình Tin học căn bản, NXB. Giâo dục, Hă Nội. Quâch Tuấn Ngọc, 1995. Ngôn ngữ lập trình Pascal, NXB Giâo dục, Hă Nội. Ðinh Vũ Nhđn, 1995. Tin học căn bản, NXB TP. Hồ Chí Minh.
Ruknet Cezzar, A Guide to Programming Languages, Artech House, Inc., London, UK.
Trần Ngọc Tiến, Trần Văn Nam, 1995. Tin học đại cương, Trường Ðại Học Kiến Trúc Hă Nội, Hă Nội.
Nguyễn Ðình Thẳng - Hoăng Minh - Ðỗ Phúc, 1989. MS -DOS 3.30, Trung Tđm Tin học CADASA, Trường Cao đẳng Sư Phạm TP. Hồ Chí Minh.
Lương Văn Thụy, Võ Văn Sơn, Nguyễn Văn Tră, 1992. Ðiện toân căn bản, Trung tđm
điện toân, UBKHNN, TP. Hồ Chí Minh.
Nguyễn Văn Trư, 1995. Hướng dẫn tự lăm việc bằng mây vi tính, NXB TP. Hồ Chí Minh. Trường Ðại học Tăi chânh Kế toân Tp. Hồ Chí Minh, 1991. Turbo Pascal 5.5 vă Băi tập
Turbo Pascal 5.5, NXB Ðại học vă Giâo dục chuyín nghiệp, Hă Nội.
Ngô Trung Việt, 1994. Kiến thức cơ bản về lập trình, NXB Giao thông vận tải, Hă Nội. Walter Savitch, 1995. Pascal: An introduction to the Art and Science of Programming, the Benjamin/ Cummings Publishing Co.,Inc., New York, USA.
http://lhp4u.com