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[.]
Trường Đại học Công Nghệ Thông Tin, ĐHQG-HCM Khoa Công Nghệ Phần Mềm Chương Số Kiểu mảng Giảng viên: PGS TS Vũ Thanh Nguyên Nội Dung Số mảng khái niệm quan trọng Đặc tả hình thức Ngơn ngữ Z mơ tả dạng số - đặc biệt số tự nhiên dùng tương ứng với mảng Kiểu Số Tập số nguyên Z = {…, -2,-1,0,1,2,…} Tập số tự nhiên N = {n:Z|n0} = {0,1,2,…} Các phép toán số Kiểu Số Các phép toán số Kiểu Số Các phép toán số Kiểu Số Ví dụ hàm trả lại giá trị tuyệt đối số nguyên sử dụng miêu tả rỏ ràng sau: abs Z Z n:Z n abs n = -n n abs n = n Hàm successor (succ) trả lại giá trị số số tự nhiên Succ = { ↦ 1, ↦ 2, ↦ 3,…} Hàm predecessor (pred) trả lại giá trị số phía trước pred == succ∼ Kiểu Số Miền xác định số Miền xác định số a, b: Z xác đị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 a b = ∅ a a = {a} Kiểu Số Cardinality Số phần tử tập (số nguyên) Xác định card hay # (ngôn ngữ z) Ví dụ: #∅ = 0, #{a} = Đối với miền xác định a b #a b = 1+b-a a b = a > b #a b = max {0, 1+b-a} Vậy tương ứng … b-a 1+b-a ↧ ↧ ↧ … ↧ a a+1 a+2 … b-1 b ↧ Kiểu mảng Mảng (sequence): Gồm hữu hạn phần tử (0 hay nhiều phần tử) Có thứ tự Một phần tử xuất nhiều lần mảng Có kiểu liệu Kiểu mảng Mảng: Mảng chứa phần tử s = {1 ↦ x} có #s=1 viết [x] gọi mảng đơn Tổng quát mảng {1 ↦ x1, ↦ x2, …,n ↦ xn} viết ngắn gọn [x1, x2,…,xn] Ví dụ: [4, 2, 7, 1, 5, 6, 3] [7, 2, 1, 4, 3, 6, 5] [‘C’, ‘O’, ‘N’] [42.0, 343.0, 42.0] [] (không giống tập mảng rổng xác định kiểu liệu) 10 Mảng Cho trước kiểu T Định nghĩa kiểu mảng mà phần tử thuộc kiểu T Ví dụ: T* Word = Char* Smallstring = {‘a’, ‘b’, ‘c’}* Smallstring = { [], [‘a’], [‘b’], [‘c’], [‘a’, ‘a’], [‘a’, ‘b’], …, [‘a’,’a’, ‘c’], … } Paragraph = Word* Chapter = Paragraph* 11 Chuỗi Chuỗi xem mảng ký tự Ví dụ: Lưu ý: [‘D’, ‘i’, ‘s’, ‘k’, ‘ ‘, ‘f’, ‘u’, ‘l’, ‘l’] “Disk full” ‘a’ Char “hello” Char* “a” Char* 12 Các hàm thao tác mảng/chuỗi Hàm len len [] = len [1, 2, 3, 4, 1] = Tổng quan len s = card dom s Một số ví dụ mảng [a,b] [b,a] [a,b] [a,b,b] Giả sử s1= [b,b,c] s2= [a] Khi len s1= 3, len s2= 13 Các hàm thao tác mảng/chuỗi Truy xuất phần tử mảng theo số (tính từ 1) sq = [2, 19, 13, 5, 17] sq(1) = sq(4) = Tổng quát s X* i len s s(i) X s1(1) = s1(2) = b 14 Các hàm thao tác mảng/chuỗi Mảng/chuỗi [‘a’, ‘a’, ‘d’, ‘c’, ‘a’, ‘b’] (2, …, 4) = [‘a’, ‘d’, ‘c’] “Hello” (2, …, 2) = “e” s(1,…, len s) = s 15 Các hàm thao tác mảng/chuỗi Phép nối ⃕ s⃕t Ví dụ: “Hello” ⃕ “ ” ⃕ “World” = “Hello World” Cập nhật phần tử mảng † Ví dụ: [1, 2, 3, 4] (3) †11 = [1, 2, 11, 4] Một số quy tắc []⃕s=s⃕[]=s r(⃕ s⃕t) = (r⃕s)⃕t (r⃕s = r⃕t) s = t Lưu ý Nếu s,tT*, st r:T* s⃕r = t 16 Các hàm thao tác mảng/chuỗi Lưu ý (ứng dụng cho tiếp đầu ngữ (prefix) mảng): (st ts) s = t (rs st) rt (rt st) (rs sr) 17 Các hàm thao tác mảng/chuỗi Phép tốn phân bố (ngơn ngữ Z) ⃕/[] = [] ⃕/[a,b,…,n] = a⃕b⃕ … ⃕n ⃕/([a]⃕s) = [a]⃕(⃕/s) ⃕/(s⃕[a]) = (⃕/s)⃕[a] 18 Các hàm thao tác mảng/chuỗi Hàm Head (hd) Tail (tl) Ví dụ: hd [‘p’, ‘q’, ‘r’] = ‘p’ Hàm head mảng khơng rổng định nghĩa sau: hd (s: X*) r:X pre s[] post r = s(1) 19 Các hàm thao tác mảng/chuỗi Hàm tail mảng không rổng định nghĩa sau: tl (s: X*) rs:X pre s[] post s = [hd s]⃕rs Ví dụ tl [‘p’, ‘q’, ‘r’] = [‘q’, ‘r’] tl [42] = [] Ví dụ: hd s1 = b hd s2 = a tl s1 = [b,c] tl s2 = [] 20 ... Hàm Head (hd) Tail (tl) Ví dụ: hd [‘p’, ‘q’, ‘r’] = ‘p’ Hàm head mảng khơng rổng định nghĩa sau: hd (s: X*) r:X pre s[] post r = s(1) 19 Các hàm thao tác mảng/chuỗi Hàm tail mảng khơng