KIỂU LIỆT KÊ, KIỂU MIỀN CON

Một phần của tài liệu Cơ bản về lập trình Pascal (Trang 44 - 48)

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ụ 1.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ê>) ;

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 ...

b)Một số hàm chuẩn áp dụng cho kiểu vô hướng

* 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ụ 1.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ụ 1.4: Readln(St) ;

IF St = ‘Mon’ THEN Ngay := Mon ;

2. Kiểu miền con (Sub-range type)

a) Khái niệm

Khi khai báo một số trường hợp, ví dụ Tuổi của người hoặc Ðiểm thi học sinh, nếu ta viết:

VAR

TuoiTho : Integer ; {Integer có miền xác định -32 768 .. 32 767} Hay Diem : Real ; {Real có miền xác định 2.9 E-39 .. 1.7 E38}

Nếu viết như vậy sẽ tốn ô nhớ vì Integer có kích thước 2 bytes hoặc Real có kích thước đến 6 bytes. Làm như vậy sẽ không cần thiết vì Tuổi con người chỉ biến thiên trong khoảng từ 0 đến 200 là lớn nhất và điểm thi học sinh thì chỉ trong khoảng từ 0 đến 10 chẳng hạn.

Trong Pascal cho phép ta xác định một biến lấy giá trị trong một khoảng nào đó được giới hạn ở một hằng cận dưới (first data item) và một hằng cận trên (last data item). Hai giá trị này phải cùng một kiểu vô hướng đếm được và hằng cận trên có giá trị lớn hơn hằng cận dưới. Khai báo như vậy gọi là khai báo kiểu miền con (Sub-range type) và biến của nó chỉ chiếm 1 byte trong ô nhớ mà thôi. Trong lúc chạy chương trình, ta có thể kiểm tra giá trị của biến không được vượt ra khỏi giới hạn của khoảng con.

b) Cách khai báo

Miền con là một tập hợp con của một kiểu đếm được. Có 2 cách khai báo:

TYPE

<Tên kiểu miền con> = <hằng cận dưới> .. <hằng cận trên> ; VAR

<danh sách biến> : < Tên kiểu miền con> ;

Ví dụ 1.5:

TYPE

TuoiTho = 0 .. 200 ; VAR Tho : TuoiTho ;

+ Khai báo trực tiếp:

VAR

<danh sách biến> : <hằng cận dưới> .. <hằng cận trên> ;

Ví dụ 1.6:

VAR Tuoi : 0 .. 200 ;

Một phần của tài liệu Cơ bản về lập trình Pascal (Trang 44 - 48)

Tải bản đầy đủ (DOC)

(122 trang)
w