9.1. Kiểu liệt kê (enumerated type).
9.1.1. Định nghĩa và khai báo : Kiểu liệt kê đợc định nghĩa bằng cách liệt kê tất cả các giá trị của kiểu, theo dạng sau : liệt kê tất cả các giá trị của kiểu, theo dạng sau :
trong đó tên_1, tên_2, ..., tên_N là các tên do ngời lập trình tự đặt.
Ví dụ 1 : Type
Ngay = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); Hoc_vi = (Cu_nhan, Ky_su, Thac_si, Tien_si); Qua = (Cam, Quit, Nhan);
Khai báo biến kiểu liệt kê :
Cách 1 : Khai báo thông qua tên kiểu đã định nghĩa.
Ví dụ 2 : Var
Homqua, Homnay : Ngay; Bangcap : Hoc_vi;
Mua : Qua;
Cách 2 : Khai báo trực tiếp.
Ví dụ 3 : Var
NgayLv : (ThuHai, Thuba, ThuTu, ThuNam, ThuSau); m1, m2 : (den, trang, vang, do);
9.1.2. Tác dụng của các câu lệnh và hàm/thủ tục lên các biến có kiểu liệt kê : kiểu liệt kê :
Có thể thực hiện lệnh gán cho các biến có kiểu liệt kê.
Ví dụ 4 :
Mua := Quit; Bangcap := Ky_su;
Có thể thực hiện phép so sánh giữa các giá trị đã đợc liệt kê trong kiểu liệt kê, với quy định giá trị đứng sau thì nhỏ hơn giá trị đứng trớc.
Không thể dùng các câu lệnh nhập, xuất cho các biến kiểu liệt kê. Chẳng hạn, các câu lệnh sau đây là sai :
Writeln(Mua); Readln(NgayLv);
TYPE
Các hàm liên quan đến kiểu liệt kê :
• Hàm ORD(tên) : Cho số thứ tự của tên trong kiểu liệt kê. Các giá trị liệt kê đợc đánh số thứ tự bắt đầu từ 0. Chẳng hạn, Ord(Sun) = 0; Ord(Tue) = 2.
• Hàm PRED(tên) : Cho giá trị đứng ngay trớc tên trong kiểu liệt kê. Chẳng hạn, Pred(Sat) = Fri; Pred(Cu_nhan) : không xác định.
• Hàm SUCC(tên) : Cho giá trị đứng ngay sau tên trong kiểu liệt kê. Chẳng hạn : Succ(Fri) = Sat; Succ(Tien_si) : không xác định.
9.2. Kiểu đoạn con (subrange type).
9.2.1. Định nghĩa và khai báo : Kiểu đoạn con đợc định nghĩa trên cơ sở các kiểu nguyên, logic, ký tự và liệt kê theo dạng : kiểu nguyên, logic, ký tự và liệt kê theo dạng :
trong đó hằng_1 và hằng_2 là các hằng có cùng kiểu dữ liệu và hằng_1 <
hằng_2. Khi đó, các giá trị của kiểu đoạn con sẽ xác định trong khoảng từ hằng_1 đến hằng_2.
Ví dụ 5 : Type
Chu_Hoa = ‘A’..’Z’; {kiểu miền con của kiểu ký tự} Tuoi_Hop_Dong = 18..50; {kiểu miền con của kiểu nguyên} Ngay_Thuong = Mon..Fri; {kiểu miền con của kiểu Ngay}
Khai báo biến kiểu đoạn con :
Cách 1 : Khai báo thông qua tên kiểu đã định nghĩa.
Ví dụ 6 :
Var ch : Chu_Hoa;
tuoi : Tuoi_Hop_Dong; Cách 2 : Khai báo trực tiếp.
Ví dụ 7 :
Var Chu_so : ‘0’..’9’; tuoi_tho : 1..100;
Ghi chú : Vì kiểu đoạn con đợc định nghĩa nh là một phần của các kiểu dữ liệu
khác (Nguyên, Thực, Logic, Ký tự), nên mọi câu lệnh, hàm hay thủ tục mà áp dụng cho kiểu dữ liệu gốc đều có thể áp dụng cho các biến có kiểu đoạn con t-
TYPE
9.2.2. Tác dụng của kiểu đoạn con :
Trong nhiều trờng hợp, việc khai báo đoạn con cho phép tiết kiệm bộ nhớ.
Có thể kiểm soát đợc giá trị của biến có vợt ra ngoài phạm vi của nó hay không. Khi chạy chơng trình trong mode {$R+}, chơng trình sẽ dừng ngay nếu biến nhận giá trị vợt khỏi phạm vi.
Ví dụ 8 : Program Vidu_8; {$R+} Var x, y : 1..100; Begin x := 80; y := x + 25;
Write(‘ x = ‘,#32,’y = ‘,y); Readln
End.
Khi dịch (compile) chơng trình thì không có lỗi, nhng khi chạy (run) thì chơng trình sẽ bị ngng giữa chừng và thông báo lỗi : “Range check
error”, vì khi thực hiện lệnh y:=x+25 đã vợt khỏi phạm vi cho phép.
Tuy nhiên, nếu bỏ chỉ thị {$R+} hoặc thay {$R+} bằng {$R-} thì ch- ơng trình vẫn chạy bình thờng và in ra kết quả x = 80, y = 105.