3.6.1 Đặt vấn đề
Trong lập trình, có một điều phổ biến là một biến có thể lấy một hoặc một số nhỏ các giá trị. Chẳng hạn biến NGAY_TRONG_TUAN chỉ lấy 7 giá trị biểu diễn cho “chủ nhât”, “thứ hai”, “thứ ba”,...”thứ bảy”. Tương tự biến GIOI_TINH chỉ có hai giá trị biểu diễn là "nam" và "nữ". Trong các ngôn ngữ như FORTRAN hay COBOL một biến như vậy phải có kiểu số nguyên và các giá trị được biểu diễn bởi các số nguyên chẳng hạn "chủ nhật" được biểu diễn bởi số 1, "thứ hai" được biểu diễn bởi số 2,... "nam" được biểu diễn bởi số 0 và "nữ" được biểu diễn bởi số 1.
Chương trình sử dụng các giá trị này như là các số nguyên và người lập trình phải nhớ sự tương ứng giữa các giá trị nguyên với "nghĩa" của chúng trong ứng dụng. Quả thực đây là một điều bất tiện và dễ gây ra sai sót.
Nhiều ngôn ngữ mới như Pascal hay Ada cho phép người lập trình tự đặt ra một kiểu dữ liệu bằng cách liệt kê ra một danh sách các giá trị của kiểu đó. Kiểu này gọi là kiểu liệt kê.
3.6.2 Sự đặc tả
Người lập trình định nghĩa kiểu liệt kê bằng cách liệt kê ra một danh sách các tên trực kiện thông qua sự khai báo. Các tên trực kiện trong danh sách là các giá trị của kiểu và thứ tự của chúng cũng được xác định nhờ thứ tự chúng xuất hiện trong danh sách. Chẳng hạn, ta có khai báo biến trong Pascal:
VAR
Vì có nhiều biến có cùng một kiểu liệt kê được dùng trong một chương trình nên người ta thường định nghĩa một liệt kê như là một kiểu có tên, sau đó sử dụng nó để xác định kiểu cho nhiều biến như trong Pascal:
TYPE
NGAY = (Chu_nhat, Hai, Ba, Tu, Nam, Sau, Bay); sau đó khai báo biến:
VAR
NGAY_TRONG_TUAN, NGAY_LAM_VIEC: NGAY;
Trong sự khai báo trên, các tên trực kiện như Chu_nhat, Hai, Ba,… chính là các giá trị của kiểu và các giá trị này được sắp thứ tự như chúng đã được ghi ra, tức là Chu_nhat < Hai < Ba < … < Bay.
Chú ý rằng kiểu NGAY đã được định nghĩa thì có thể được dùng như một tên kiểu nguyên thuỷ (Integer chẳng hạn) và các hằng trực kiện như Chu_nhat, Hai, Ba, Tu,.. cũng được sử dụng như là các hằng trực kiện nguyên thuỷ (chẳng hạn "27"). Vì thế ta có thể viết:
IF NGAY_TRONG_TUAN = Hai THEN ...
Các phép toán cơ bản trong kiểu liệt kê là các phép toán quan hệ (bằng, nhỏ hơn, lớn hơn...), phép gán trị, phép toán cho giá trị đứng sau và giá trị đứng trước một giá trị trong dãy các hằng trực kiện của liệt kê. Ngôn ngữ lập trình Chương III: Kiểu dữ liệu sơ cấp
28
3.6.3 Sự cài đặt
Biểu diễn bộ nhớ cho một ÐTDL kiểu liệt kê thường là không phức tạp. Mỗi giá trị trong liệt kê được biểu diễn bằng một số nguyên 0, 1, 2,... Ví dụ kiểu NGAY ở trên chỉ cần sử dụng 7 giá trị từ 0 đến 6, trong đó 0 biểu diễn cho Chu_nhat, 1 biểu diễn cho
Hai, 2 biểu diễn cho Ba,...
Sự cài đặt các phép toán cơ bản cũng không phức tạp. Các phép quan hệ được cài đặt bằng cách sử dụng các phép toán quan hệ dưới phần cứng cho số nguyên như "=", "<", ">",... Phép toán lấy giá trị đứng sau một giá trị được cài đặt bằng cách lấy số nguyên biểu diễn cho giá trị đó cộng thêm 1 và có sự kiểm tra để thấy được kết quả không vượt quá giới hạn cho phép. Chẳng hạn để xác định giá trị sau Hai, ta lấy 1 (biểu diễn cho Hai) cộng với 1 được 2, mà 2 biểu diễn cho Ba, nên sau Hai là Ba, nhưng sau Bay thì không có giá trị nào vì tổng của 6 (biểu diễn cho Bay) với 1 được 7, vượt quá giới hạn cho phép của kiểu. Tương tự cho phép toán lấy giá trị đứng trước của một giá trị. 3.6.4 Lợi ích của việc sử dụng kiểu liệt kê
Kiểu liệt kê được đưa vào trong ngôn ngữ lập trình nhằm để giải quyết vấn đề được nêu ra trong phần đặt vấn đề. Từ đó ta có thể thấy rõ việc sử dụng kiểu liệt kê làm cho chương trình sáng sủa, trực quan, người lập trình không còn phải nhớ “nghĩa” của giá trị số và do vậy chương trình sẽ có độ chính xác cao hơn. Nói cách khác, kiểu liệt kê làm tăng tính dễ đọc, tính dễ viết và độ tin cậy của ngôn ngữ.