Trường Đại học Công Nghệ Thông Tin, ĐHQG-HCM Khoa Công Nghệ Phần Mềm

Chương 6: Kiểu đối tượng phức

23-02-2023

TS. Vũ Thanh Nguyên

1

TS. Vũ Thanh Nguyên

Nội dung

23-02-2023

TS. Vũ Thanh Nguyên

2

 Định nghĩa kiểu đối tượng phức  Khởi tạo đối tượng phức  Ràng buộc trên kiểu dữ liệu  Cập nhật đối tượng phức

Đặc tả kiểu đối tượng phức

 Cú pháp:

Tên-kiểu-đối-tượng-phức ::

23-02-2023

TS. Vũ Thanh Nguyên

3

Tên-field1: Kiểu1 Tên-field2: Kiểu2 … Tên-fieldn: Kiểun

Đặc tả kiểu đối tượng phức

 ký hiệu :: có thể được đọc là ”is composed of” mà có thể

 Ở đó:

định nghĩa tương đương 2 khả năng sau: Name :: …

 Lưu ý: ký hiệu :: thường được sử dụng hơn so với

Name = compose Name of … end

23-02-2023

TS. Vũ Thanh Nguyên

4

compose

Đặc tả kiểu đối tượng phức

 Ví dụ: xác đinh kiẻu dữ liệu Datec

Datec ::

day year : {1,…,366} : N

hoặc

Datec = compose Datec of : {1,…,366} : N day year

23-02-2023

TS. Vũ Thanh Nguyên

5

end

Đặc tả kiểu đối tượng phức

 Ví dụ: xác đinh kiẻu dữ liệu Fahrenheit và Celsius Fahrenheit = compose Fahrenheit of

v : R

end

hay

Celsius = compose Celsius of

v : R

23-02-2023

TS. Vũ Thanh Nguyên

6

end

Đặc tả kiểu đối tượng phức

 Ví dụ:

Phân-số ::

: ℤ tử-số mẫu-số : ℤ

hoặc

Phân-số = compose Phân-số of : ℤ tử-số mẫu-số : ℤ

23-02-2023

TS. Vũ Thanh Nguyên

7

end

Đặc tả kiểu đối tượng phức

 Ví dụ:

Khách-hàng :: : String họ-tên địa-chỉ : String điện-thoại: String

hoặc Khách-hàng = compose Khách-hàng of họ-tên : String địa-chỉ : String điện-thoại: String

23-02-2023

TS. Vũ Thanh Nguyên

8

end

Đặc tả kiểu đối tượng phức

 Ví dụ:

Date = compose Date of

: {d  ℕ1 | d  31} day month : {m ℕ1 | m  12} year : {y  ℕ1 | y  1900}

end

 Ví dụ:

Date = compose Date of

: {1, 2, …, 31} day month : {1, 2, …, 12} year : {y  ℕ1 | y  1900}

23-02-2023

TS. Vũ Thanh Nguyên

9

end

Đặc tả kiểu đối tượng phức

 Ví dụ:

Điểm ::

x : ℝ y : ℝ

Tam-giác ::

A : Điểm B : Điểm C : Điểm

Hình-tròn ::

23-02-2023

TS. Vũ Thanh Nguyên

10

tâm : Điểm bán-kính : ℝ

Tạo đối tượng phức

 Hàm mk-TênKiểuĐốiTượngPhức dùng để tạo đối tượng phức

thuộc kiểu tương ứng

 Ví dụ:

23-02-2023

TS. Vũ Thanh Nguyên

11

mk-Phân-số: ℤ  ℤ  Phân-số mk-Phân-số (5, 10) sẽ tạo ra 1 đối tượng phân số có tử-số là 5 và mẫu-số là 10 Điểm

Tạo đối tượng phức

 Ví dụ:

mk-Điểm: ℝ  ℝ  Điểm mk-Tam-giác: Điểm  Điểm  Điểm  Tam-giác

mk-Tam-giác (mk-Điểm(0,0), mk-Điểm (1,0), mk-Điểm(0, 1)) sẽ tạo ra tam giác có các điểm là A(0,0), B(1, 0) và C(0,1)

23-02-2023

TS. Vũ Thanh Nguyên

12

mk-Hình-tròn: Điểm  ℝ  Hình-tròn mk-Hình-tròn (mk-Điểm(100,100), 200) sẽ tạo ra 1 đối tượng hình tròn có tâm (100,100) và bán kính 200

Ràng buộc trên kiểu dữ liệu

 Điều kiện về miền giá trị của các thuộc tính trong kiểu dữ

 Ràng buộc trên kiểu dữ liệu

 Điều kiện về mối liên quan về giá trị của các thuộc tính

liệu

trong kiểu dữ liệu

 Tính chất bất biến (invariant) trên các thuộc tính nhằm đảm

 Ví dụ: mk-Date (29, 2, 2007) !!!  Ràng buộc trên kiểu dữ liệu

23-02-2023

TS. Vũ Thanh Nguyên

13

bảo tính hợp lệ của thông tin trong đối tượng

Ràng buộc trên kiểu dữ liệu

 Hàm kiểm tra ràng buộc trên kiểu dữ liệu  Ví dụ: Date :: : {d  ℕ1 | d  31} day month : {m ℕ1 | m  12} year : {y  ℕ1 | y  1900}

inv-Date: Date  B inv-Date (d) ≜

(d.month  {1, 3, 5, 7, 8, 10, 12}  d.day  {1,…, 31})

23-02-2023

TS. Vũ Thanh Nguyên

14

 (d.month  {4, 6, 9, 11}  d.day  {1,…, 30})  (d.month = 2  là-năm-nhuận(d.year)  d.day  {1,…, 29})  (d.month = 2  (là-năm-nhuận(d.year))  d.day  {1,…, 28})

Ràng buộc trên kiểu dữ liệu

 Ví dụ: cho kiểu dữ liệu Mảng-tăng

Mảng-tăng ::

ds : ℝ* số-pt : ℕ

Ràng buộc: mảng có tối đa 1000 phần tử, các phần tử trong ds luôn có thứ tự tăng và số-pt bằng đúng với số phần tử trong ds inv-Mảng-tăng: Mảng-tăng  B inv-Mảng-tăng (m) ≜

23-02-2023

TS. Vũ Thanh Nguyên

15

let s = m.ds, n = m.số-pt in len s  1000   i, j  inds s  i > j  s(i)  s(j)  n = len s

Ràng buộc trên kiểu dữ liệu

 Ví dụ: cho kiểu dữ liệu Mảng-tăng

Mảng-tăng ::

ds : ℝ* số-pt-không-âm-phân-biệt : ℕ

Ràng buộc: các phần tử trong ds luôn có thứ tự tăng và số-pt- không-âm-phân-biệt là số lượng các phần tử không âm phân biệt trong ds inv-Mảng-tăng: Mảng-tăng  B inv-Mảng-tăng (m) ≜

23-02-2023

16

let s = m.ds, n = m.số-pt in  i, j  inds s  i > j  s(i)  s(j)  n = card { x  elems s | x  0} TS. Vũ Thanh Nguyên

Cập nhật đối tượng phức

 Phương án 1: Tạo ra đối tượng mới với các thông tin mới cập

nhật và các thông tin sẵn có

⃐ ⃐  Ví dụ: d = mk-Date (1, d.month, d.year) sẽ cập nhật lại giá trị

ngày là 1, vẫn giữa nguyên giá trị tháng và năm

 Phương án 2: sử dụng hàm  để cập nhật thuộc tính trong đối

tượng phức

⃐  Ví dụ: d =  (d, date ↦ 1) sẽ cập nhật lại giá trị ngày là 1, vẫn

23-02-2023

TS. Vũ Thanh Nguyên

17

giữa nguyên giá trị tháng và năm

Cập nhật đối tượng phức

 Ví dụ: đặc tả hàm rút gọn phân số (giả sử tử số và mẫu số đều

là số tự nhiên)

ps: Phân-số

23-02-2023

TS. Vũ Thanh Nguyên

18

RÚT-GỌN-PS ext wr ⃐ let tử-số-cũ = ps.tử-số, mẫu-số-cũ = ps.mẫu-số in let u = uscln (tử-số-cũ, mẫu-số-cũ) in let tử-số-mới = tử-số-cũ / u, mẫu-số-mới = mẫu-số-cũ / u in ps = mk-Phân-số (tử-số-mới, mẫu-số-mới)

Cập nhật đối tượng phức

 Ví dụ: đặc tả hàm rút gọn phân số (giả sử tử số và mẫu số đều

là số tự nhiên)

ps: Phân-số

RÚT-GỌN-PS ext wr ⃐ let tử-số-cũ = ps.tử-số, mẫu-số-cũ = ps.mẫu-số in let u = uscln (tử-số-cũ, mẫu-số-cũ) in let tử-số-mới = tử-số-cũ / u, mẫu-số-mới = mẫu-số-cũ / u in ps =  (ps, tử-số ↦ tử-số-mới, mẫu-số ↦ mẫu-số-mới)

23-02-2023

TS. Vũ Thanh Nguyên

19

Cập nhật đối tượng phức

23-02-2023

TS. Vũ Thanh Nguyên

20

 Ví dụ: Sơ đồ của phép toán Datec

Cập nhật đối tượng phức

 Ví dụ: Hàm  cung cấp khả năng tạo giá trị kết hợp (phức) mà

23-02-2023

TS. Vũ Thanh Nguyên

21

khác biệt chỉ ở một trường  dt = mk-Datec(17,1927)  (dt, day ↦ 29) = mk-Datec(29,1927)  (dt, year ↦ 1937) = mk-Datec(17,1937)