III/ KIỂU BẢN GHI (RECORD)
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ụ 3.1:
Ðể 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
<Tên kiểu bản ghi> = RECORD
<Tên trường 1a>[,<Tên trường1b>,...] : <Kiểu trường> ; <Tên trường 2a>[,<Tên trường2b>,...] : <Kiểu trường> ; ... ; END ;
VAR
<Tên biến1>[,<Tên biến2>, ...] : <Tên kiểu bản ghi> ;
Ví dụ 3.2:
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). - Account (Số kế toán) là một kiểu record, chứa các thông tin về tên và địa chỉ khách nợ (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:
TYPEstatus = (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
<Tên biến1>[,<Tên biến2>, ...] : RECORD
<Tên trường 1a>[,<Tên trường1b>,...] : <Kiểu trường> ; <Tên trường 2a>[,<Tên trường2b>,...] : <Kiểu trường> ;
... ; END ;