VI. UNIT TỰ TẠO
1. Kiểu vô hướng liệt kê (enumerated scalar type)
Chương trước chúng ta đã đi qua các kiểu dữ liệu đơn giản là các dữ liệu kiểu dữ liệu vô hướng chuẩn (Standard Scalar-type Data) như Integer, Real, Char, Boolean. Các kiểu này đã được định nghĩa sẵn trong mọi chương trình cài đặt trong máy. Ngôn ngữ Pascal cho phép người lập trình có thể tự đặt ra các kiểu vô hướng mới bằng cách tự liệt kê các giá trị của kiểu vô hướng mới và phải khai báo định nghĩa kiểu. Danh sách các giá trị này được đặt trong ngoặc đơn ( ) và được mô tả bằng một tên kiểu (như phần mô tả kiểu TYPE). Kiểu vô hướng theo cách này gọi là kiểu vô hướng liệt kê (Enumerated Scalar Type).
a. Cách khai báo
Có 2 cách khai báo một biến kiểu liệt kê:
+ Khai báo gián tiếp: Ðịnh nghĩa kiểu (dựa vào từ khóa type) trước khi khai biến (var)
TYPE
<tên kiểu liệt kê> = (<danh sách giá trị kiểu liệt kê>) ; VAR
<danh sách biến> : <tên kiểu liệt kê> ; Ví dụ 8.1:
TYPE
Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ; Colors =(Red, Yellow, Green, White, Blue, Black) ; Subjects = (Mathematics, Physics, Chemistry, Biology) ; VAR
Ngay : Days ; MauVe : Colors ;
MonThi, Kiemtra : Subjects ;
+ Khai báo trực tiếp: Kiểu sau biến được định nghĩa trực tiếp.
VAR
<danh sách biến> : (<danh sách giá trị kiểu liệt kê>) ; Ví dụ 8.2:
VAR
Ngay : (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ; MauVe : (Red, Yellow, Green, White) ; Ta có thể gán cho biến các giá trị của kiểu tương ứng:
Ngay := Mon ; MauVe := Red ;
Biến theo định nghĩa của kiểu nào chỉ nhận giá trị của kiểu đó mà thôi. Theo khai báo như ví dụ 8.2. ở trên, ta không thể có MauVe := Mon ; Kiểu vô hướng liệt kê là một kiểu đếm được.
Theo định nghĩa kiểu vô hướng liệt kê, thứ tự danh sách giá trị liệt kê được ngầm đánh số tăng tuyến tính bắt đầu từ số 0 trở đi theo thứ tự từ trái sang phải. Như vậy, ở ví dụ trên: Sun < Mon < Tue < Wed .... và Red < Yellow < Green ...
* Hàm thứ tự ORD (X)
Hàm này cho ta thứ tự của giá trị x trong kiểu vô hướng đếm được. Hàm ORD thực chất là hàm biến đổi một giá trị kiểu vô hướng đếm được sang giá trị kiểu số nguyên.
Theo ví dụ trên:
ORD (Sun) = 0 là Ðúng vì Sun có thứ tự là 0 ORD (Mon) = 1 là Ðúng vì Mon có thứ tự là 1
ORD (Green) = 3 là Sai vì Green có thứ tự là 2 ORD (n) = n trong đó n là một giá trị kiểu Longint * Hàm PRED (X)
Hàm này cho giá trị đứng trước x trong định nghĩa kiểu của x. Theo ví dụ trên :
PRED (Mon) = Sun PRED (Green) = Yellow PRED (n) = n - 1 * Hàm SUCC (X)
Hàm này cho giá trị đứng sau x trong định nghĩa kiểu của x. Theo ví dụ trên:
SUCC (Mon) = Tue SUCC (Green) = White SUCC (n) = n + 1
* Hàm chuyển một số nguyên thành một giá trị vô hướng
Tên hàm này chính là tên kiểu vô hướng mà ta đã khai báo trước. Theo ví dụ trên:
Days(2) = Tue Colors(3) = White
LONGINT (n) = n c. Viết ra và đọc vào kiểu liệt kê
Viết và đọc theo kiểu liệt kê thì khác với kiểu vô hướng chuẩn. * Viết ra kiểu liệt kê
Thủ tục Write và Writeln chỉ chấp nhận đưa ra các giá trị thuộc kiệu vô hướng chuẩn (Real, Integer, Byte, Char, Boolean) mà không chấp nhận viết ra một giá trị kiểu vô hướng liệt kê, ví dụ cách viết sau là không đúng:
Writeln(Color(4)) Writeln(Red) Writeln(Days) mà chỉ có thể chấp nhận nếu viết:
Writeln (Char(78)) vì Char(78) = N là giá trị vô hướng chuẩn. Ðể viết ra một giá trị của biến vô hướng liệt kê, ta có thể áp dụng thủ thuật sau:
IF MauVe = Red THEN Writeln(‘Red’) ; * Ðọc vào kiểu liệt kê
Thủ tục Read và Readln cũng chỉ chấp nhận đọc vào một giá trị kiểu vô hướng chuẩn mà không chấp nhận đọc trực tiếp các giá trị kiểu vô hướng liệt kê, ví dụ không thể đọc Readln(Days). Ðể đọc vào một giá trị kiểu liệt kê ta có thể dùng phương pháp sau: đọc số thứ tự của giá trị biến vô hướng rồi biến đổi kiểu dữ liệu thêm:
Ví dụ 8.3:
TYPE Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ; VAR i : Integer ;
BEGIN
Write('Nhập số từ 0 . .6 tương ứng cho ngày:'); Readln(i) ; Case Days(i) of
Sun: writeln('Ngày Chủ nhật'); Mon: writeln('Ngày thứ hai'); Tue: writeln('Ngày thứ ba'); Wed: writeln('Ngày thứ tư'); Thu: writeln('Ngày thứ năm'); Fri: writeln('Ngày thứ sáu'); Sat: writeln('Ngày thứ bảy');
Else writeln('Nhập sai'); end;
Readln; END.
Mục 2 ở phần II ở phía sau, sẽ giới thiệu chuỗi String, ta có thể dùng thủ thuật sau để đọc kiểu liệt kê: Ví dụ 8.4: Readln(St) ;
IF St = ‘Mon’ THEN Ngay := Mon ;