Slide 1 * Chương 4 Số và Kiểu mảng Giảng viên PGS TS Vũ Thanh Nguyên Trường Đại học Công Nghệ Thông Tin, ĐHQG HCM Khoa Công Nghệ Phần Mềm * * Nội Dung Số và mảng là khái niệm quan trọng của Đặc tả hìn[.]
Trang 2N ội Dung
Số và mảng là khái niệm quan trọng của Đặc tả hình thức
Ngôn ngữ Z mô tả các dạng số - đặc biệt là số tự
nhiên dùng tương ứng với mảng
Trang 4Kiểu Số
Các phép toán trên số
Trang 55Kiểu Số
Các phép toán trên số
Trang 6Kiểu S ố
Ví dụ về hàm trả lại giá trị tuyệt đối của một số nguyên sử
dụng sự miêu tả rỏ ràng như sau:
Trang 7Kiểu S ố
Miền xác định của số
Miền xác định giữa 2 số a, b: Z được xác định như sau:
a b = {a, a+1, a+2,…, b-2, b-1, b}
Hoặc
a b = {n:Z| a n b}
Nếu a > b khi đó a b = ∅
và a a = {a}
Trang 8 Đối với miền xác định a b
#a b = 1+b-a nếu a b = 0 nếu a > b
#a b = max {0, 1+b-a}
Vậy nó tương ứng là
1 2 3 … b-a 1+b-a
↧ ↧ ↧ … ↧ ↧
a a+1 a+2 … b-1 b
Trang 10Kiểu mảng
Mảng:
Mảng chỉ chứa một phần tử s = {1 ↦ x} có #s=1 và được viết là [x] còn gọi là mảng đơn
Trang 11Mảng
Cho trước kiểu T
Định nghĩa kiểu mảng mà mỗi phần tử thuộc kiểu T
Trang 14Các hàm và thao tác trên mảng/chuỗi
Truy xuất phần tử trong mảng theo chỉ số (tính từ 1)
Trang 16Các hàm và thao tác trên mảng/chuỗi
Trang 17Các hàm và thao tác trên mảng/chuỗi
Lưu ý (ứng dụng cho tiếp đầu ngữ (prefix) của mảng):
(st ts) s = t
(rs st) rt
(rt st) (rs sr)
Trang 18Các hàm và thao tác trên mảng/chuỗi
Phép toán phân bố (ngôn ngữ Z)
⃕/[] = []
⃕/[a,b,…,n] = a⃕b⃕ … ⃕n
⃕/([a]⃕s) = [a]⃕(⃕/s)
⃕/(s⃕[a]) = (⃕/s)⃕[a]
Trang 20Các hàm và thao tác trên mảng/chuỗi
Hàm tail của một mảng không rổng có thể định nghĩa như sau:
Trang 21Các hàm và thao tác trên mảng/chuỗi
Chèn 1 phần tử vào đầu mảng (cons)
Ví dụ: cons (6, [2, 3]) = [6, 2, 3]
Trang 22Các hàm và thao tác trên mảng/chuỗi
Hàm inds: trả về tập chỉ số của các phần tử trong mảng
Trang 23Các hàm và thao tác trên mảng/chuỗi
Hàm elems: trả về tập hợp các giá trị của các phần tử trong mảng
elems s = {s(i) | i inds s}
Ví dụ: elems [12, 4, 6, 12, 4, 6, 38, 12] = {4, 6, 12, 38}
elems s2 = {a}
elems s1 = {b,c}
elems [] = {}
Trang 24Các hàm và thao tác trên mảng/chuỗi
Hai mảng bằng nhau
sa = sb len sa = len sb iinds sa sa (i) = sb (i)
Các mảng có thể liên kết bởi hàm
concat(sa:X* , sb:X*) rs:X*
post len rs = len sa + len sb (iinds sa rs(i) = sa(i))
(iinds sb rs(i+len sa) = sb(i))
Hoặc dùng phép nối ⃕(người ta thường dùng phép nối sa⃕sb hơn là hàm concat(sa,sb)
Trang 25Các hàm và thao tác trên mảng/chuỗi
Các mảng có thể liên kết nhờ phép liên kết phân bố tất cả các mảng trong một mảng bởi hàm đệ quy sau:
dconc : (X*)* → X*
Dconc(ss) ≜ if ss = [] then [] else (hd ss)dconc⃕ (tl ss)
Ví dụ:
dconc[s1, [],s2,s2] = [b,b,c,a,a]
Trang 26Các hàm và thao tác trên mảng/chuỗi
Xác định độ dài của mảng con của mảng đã cho có kích thước
Trang 27Các hàm và thao tác trên mảng/chuỗi
Thường hàm subseq(i,j,q) được viết là s(i,…,j)
Trang 28Các hàm và thao tác trên mảng/chuỗi
Sơ đồ của các phép toán trên mảng