Nộp lại đề thi Đặc tả số hữu tỷ Rational Number Lớp các số hữu tỷ được biểu diễn bởi hai thành phần tử số n và mẫu số d là những số nguyên.. Dựa theo các tiên đề đã cho gợi ý, hãy tiếp t
Trang 1Đề thi Môn CÔNG NGHỆ PHẦN MỀM Đề số 106
Thời gian làm bài 90 phút Không sử dụng tài liệu Ghi số đề thi vào bài làm Nộp lại đề
thi
Đặc tả số hữu tỷ (Rational Number)
Lớp các số hữu tỷ được biểu diễn bởi hai thành phần tử số n và mẫu số d là những số nguyên Người ta cần xây dựng các hàm xử lý số hữu tỷ như : tạo mới, rút gọn, cộng, trừ, nhân, chia, so sánh và chuyển đổi thành số thực
Giả sử kiểu trừu tượng Rational được định nghĩa như sau (cột bên phải đặt trước bởi một dấu ; để giải thích) :
Type Rational
Functions
Create-rat : Int × Int → Rational ; tạo số hữu tỷ từ hai số nguyên Reduction : Rational → Rational ; rút gọn số hữu tỷ
+rat : Rational × Rational → Rational ; cộng hai số hữu tỷ
-rat : Rational × Rational → Rational ; trừ hai số hữu tỷ
*rat : Rational × Rational → Rational ; nhân hai số hữu tỷ
/rat : Rational × Rational → Rational ; chia hai số hữu tỷ
=rat : Rational × Rational → Bool ; so sánh hai số hữu tỷ
Rat-Real : Rational → Real ; chuyển một số hữu tỷ thành số thực Preconditions
Axioms ForAll n, d, n1, d1, n2, d2 : Int, r, r1, r2 : Rational :
r=create-rat(n, d) ⇒ numer(r) * d=denom(r) * n and denom(r) ≠ 0
; Nghĩa là, nếu r là một số hữu tỷ, r=n/d, thì tử số của r là n và mẫu số là d≠0
=rat(create-rat(n1, d1), create-rat(n2, d2) ⇔ n1*d2 = n2*d1
; Hai số hữu tỷ r1=n1/d1 và r2=n2/d2 bằng nhau khi và chỉ khi n1*d2 =n2*d1 +rat(create-rat(n1, d1), create-rat(n2, d2) ⇔
Reduction(create-rat(n1*d2 + n2*d1, d1*d2))
Yêu cầu :
1 Dựa theo các tiên đề đã cho gợi ý, hãy tiếp tục tạo mới các tiên đề cho phép thực hiện các phép toán xử lý số hữu tỷ được định nghĩa trong phần Functions
2 Lập trình bằng ngôn ngữ giả (tương tự Pascal) các hàm xử lý số hữu tỷ mô tả trên đây
Đề thi Môn CÔNG NGHỆ PHẦN MỀM Đề số 105
Trang 2Thời gian làm bài 90 phút Không sử dụng tài liệu Ghi số đề thi vào bài làm Nộp lại đề
thi
Đặc tả cây nhị phân Binary Tree)
Kiểu cây nhị phân kiểu T, với T là một kiểu bất kỳ nào đó, được định nghĩa đệ quy như sau :
1 ∅ là một cây nhị phân kiểu T, được gọi là cây rỗng (empty tree)
2 Nếu E là một phần tử kiểu T, A1 và A2 là những cây nhị phân kiểu T, thì bộ ba (E, A1, A2) cũng là những cây nhị phân kiểu T
3 Chỉ những đối tượng được định nghĩa bởi hai quy tắc trên đây mới là các cây nhị phân kiểu T
Nếu A=(E, A1, A2) là cây nhị phân, thì E là nút gốc, A1 là cây con (subtree) bên trái, A2 là cây con bên phải của A Nếu A là cây suy biến chỉ gồm một nút, thì nút đó luôn luôn là nút gốc của một cây con Người ta còn gọi A là cây được gắn nhãn (labelled tree, hay tag tree) bởi các giá trị trong T Chú ý sự lệch đối xứng của định nghĩa : nếu A không phải là cây rỗng, thì cây (E, A, ∅) khác với cây (E, ∅, A) Cần phân biệt một nút với một giá trị gắn cho nút đó Các nút luôn luôn rời (phân biệt) nhau, còn các giá trị thì có thể giống nhau Kiểu trừu tượng của cây nhị phân được định nghĩa như sau (cột bên phải đặt trước bởi một dấu ; để giải thích) :
Type BinTree(T)
Functions
createtree : T BinTree(T) BinTree(T) BinTree(T) ; tạo cây nhị phân
Preconditions
root(A) được xác định nếu và chỉ nếu A ≠ emptytree
left(A) được xác định nếu và chỉ nếu A ≠ emptytree
right(A) được xác định nếu và chỉ nếu A ≠ emptytree
leaf?(A) được xác định nếu và chỉ nếu A ≠ emptytree
Axioms ForAll E : T ; A, A1, A2 : BinTree(T) :
emptytree?(emptytree()) = true
emptytree?(createtree(E, A1, A2)) = false
root(createtree(E, A1, A2)) = E
Yêu cầu :
Trang 3Thời gian làm bài 90 phút Không sử dụng tài liệu Ghi số đề thi vào bài làm Nộp lại đề
thi
Đặc tả tập hợp (Collection Specification)
Cho trước một tập hợp (collection) C các phần tử (elements) e Người ta cần thực hiện các phép tìm kiếm, bổ sung (Add) và loại bỏ (Delete) một phần tử e có khoá (key) là k trong C Ngoài ra, người ta có hai phép toán bổ sung là kiểm tra một phần tử có thuộc (in) một tập hợp cho trước hay không và đếm số phần tử (number of occurrences) có khoá đúng bằng một khoá k đã cho
Giả sử Element là kiểu phần tử có khoá kiểu Key đã được định nghĩa trước đó Kiểu trừu tượng Collection được định nghĩa như sau :
Type Collection
EmptyCollection : → Collection Add : Element × Collection → Collection Delete : Key × Collection → Collection Search : Key × Collection → Element
NbOccurrences : Key × Collection → Int Preconditions
Pre Search (k: Key, C: Collection) ≡ NbOccurrences(k, C) ≥ 1
Axioms ForAll C: Collection, k, k’: Key e, e’ : Element :
(e in EmptyCollection) = false
(e = e’) ⇒ (e in Add (e’, C)) = true
(e ≠ e’) ⇒ (e in Add (e’, C)) = (e in C)
NbOccurrences (k, EmptyCollection) = 0
Key-of (e) = k ⇒NbOccurrences (k, Add (e, C)) = NbOccurrences (k, C) 1
(k = k’) and NbOccurrences (k, C) = 0 ⇒ NbOccurrences (k, Delete (k’, C)) = 0
Key-of (Search (k, C)) = k
(Search (k, C) in C) = true
e = Search (k, C) ⇒(e in Delete (k, C)) = false
Yêu cầu :
1 Dựa theo các tiên đề đã cho, hoàn chỉnh (điền vào dấu ?) các tiên đề sau đây :
2 Cho S là tập hợp các số tự nhiên gồm giữa 1 và N Viết bằng ngôn ngữ giả (tương tự Pascal) thủ tục xây dựng một tập hợp con S’ ⊆ S sao cho S’ gồm các số chẵn
3 Viết thủ tục xây dựng một tập hợp con S’ ⊆ S sao cho S’ gồm các phần tử của S thoả mãn một tính chất đã cho nào đó
Trang 4Đề thi Môn CÔNG NGHỆ PHẦN MỀM Đề số 103
Thời gian làm bài 90 phút Không sử dụng tài liệu Ghi số đề thi vào bài làm Nộp lại đề
thi
Đặc tả danh sách tuyến tính (Linear List) viết tắt DSTT)
DSTT là một dãy có thể rỗng hoặc có hữu hạn các phần tử, ký hiệu = <e1, e2, , en> Thứ tự các phần tử trong một DSTT là thứ tự của các vị trí (place) của chúng, được xác định bởi hàm Succ Nghĩa là với mọi vị trí p của một DSTT ≠ φ, ta có : ∃ k ≥ 0 sao cho p = Succk (Head (Trong đóHead () chỉ vị trí đầu tiên của
Mỗi vị trí có một nội dung (content) chính là phần tử ở vị trí đó Số phần tử hay số vị trí của
được gọi là độ dài (length) của Nếu n = 0, thì = φ Mặt khác hàm Succ không xác định ở
vị trí thứ n hay Succn (Head ()) không xác định
Đối với các DSTT, người ta xây dựng ba phép xử lý tuần tự trên các phần tử :
• Tiếp cận (access) đến phần tử thứ k của DSTT
• Loại bỏ (delete) phần tử thứ k của DSTT
• Chèn (insert) một phần tử mới tại vị trí thứ k của DSTT
Giả sử Element là một phần tử có kiểu đã được định nghĩa trước đó Kiểu trừu tượng List được định nghĩa như sau :
Type List, Place
Functions EmptyList : → List
Length : List → Int Succ : Place → Place Access : List × Int → Place Content : Place → Element Delete : List × Int → List Insert : List × Int × Element → List Preconditions
Pre Access (: List, k : Int) = (1 ≤ k ≤ Length ())
Pre Delete (: List, k : Int) = (1 ≤ k ≤ Length ())
Pre Insert (: List, k : Int, e : Element) = (1 ≤ k ≤ Length () + 1)
/* k = Length () tương ứng với việc thêm một phần tử vào cuối DSTT */
Axioms ForAll : List, k : Int, e : Element :
Length (EmptyList) = 0
( ≠ EmptyList) and (1 ≤ k ≤ Length ())⇒ Length (Delete (, k)) = Length () 1 (1 ≤ k ≤ Length ()) ⇒ Length (Insert (, k, e)) = Length () + 1 ( ≠ EmptyList) and (1 ≤ k < Length ())⇒ Succ (Access (, k)) = Access (, k + 1) ( ≠ EmptyList) and (1 ≤ k ≤ Length ()) and (1 ≤ i ≤ k1) ⇒
Content (Access (Delete (, k), i)) = Content (Access (i) Yêu cầu :
1 Dựa theo các tiên đề đã cho, hoàn chỉnh (điền vào dấu ?) các tiên đề sau đây :
Trang 5Đề thi Môn CÔNG NGHỆ PHẦN MỀM Đề số 102
Thời gian làm bài 90 phút Không sử dụng tài liệu Ghi số đề thi vào bài làm Nộp lại đề
thi
Đặc tả tập hợp (Collection Specification)
Cho trước một tập hợp (collection) C các phần tử (elements) e Người ta cần thực hiện các phép tìm kiếm, bổ sung (Add) và loại bỏ (Delete) một phần tử e có khoá (key) là k trong C Ngoài ra, người ta có hai phép toán bổ sung là kiểm tra một phần tử có thuộc (in) một tập hợp cho trước hay không và đếm số phần tử (number of occurrences) có khoá đúng bằng một khoá k đã cho
Giả sử Element là kiểu phần tử có khoá kiểu Key đã được định nghĩa trước đó Kiểu trừu tượng Collection được định nghĩa như sau :
Type Collection
EmptyCollection : → Collection Add : Element × Collection → Collection Delete : Key × Collection → Collection Search : Key × Collection → Element
NbOccurrences : Key × Collection → Int Preconditions
Pre Search (k: Key, C: Collection) ≡ NbOccurrences(k, C) ≥ 1
Axioms ForAll C: Collection, k, k’: Key e, e’ : Element :
(e in EmptyCollection) = false
(e = e’) ⇒ (e in Add (e’, C)) = true
(e ≠ e’) ⇒ (e in Add (e’, C)) = (e in C)
NbOccurrences (k, EmptyCollection) = 0
Key-of (e) = k ⇒NbOccurrences (k, Add (e, C)) = NbOccurrences (k, C) 1
(k = k’) and NbOccurrences (k, C) = 0 ⇒ NbOccurrences (k, Delete (k’, C)) = 0
Key-of (Search (k, C)) = k
(Search (k, C) in C) = true
e = Search (k, C) ⇒(e in Delete (k, C)) = false
Yêu cầu :
1 Dựa theo các tiên đề đã cho, hoàn chỉnh (điền vào dấu ?) các tiên đề sau đây :
(k = k’) and NbOccurrences (k, C) ≥ 1 ⇒ ?
2 Cho S là tập hợp các số tự nhiên gồm giữa 1 và N Viết bằng ngôn ngữ giả (tương tự Pascal) thủ tục xây dựng một tập hợp con S’ ⊆ S sao cho S’ gồm các số lẻ
3 Viết thủ tục cho phép xử lý (duyệt) tất cả các phần tử của một tập hợp đã cho
Trang 6Đề thi Môn CÔNG NGHỆ PHẦN MỀM Đề số 101
Thời gian làm bài 90 phút Không sử dụng tài liệu Ghi số đề thi vào bài làm Nộp lại đề
thi
Đặc tả danh sách tuyến tính (Linear List) viết tắt DSTT)
DSTT là một dãy có thể rỗng hoặc có hữu hạn các phần tử, ký hiệu = <e1, e2, , en> Thứ tự các phần tử trong một DSTT là thứ tự của các vị trí (place) của chúng, được xác định bởi hàm Succ Nghĩa là với mọi vị trí p của một DSTT ≠ φ, ta có : ∃ k ≥ 0 sao cho p = Succk (Head (Trong đóHead () chỉ vị trí đầu tiên của
Mỗi vị trí có một nội dung (content) chính là phần tử ở vị trí đó Số phần tử hay số vị trí của
được gọi là độ dài (length) của Nếu n = 0, thì = φ Mặt khác hàm Succ không xác định ở
vị trí thứ n hay Succn (Head ()) không xác định
Đối với các DSTT, người ta xây dựng ba phép xử lý tuần tự trên các phần tử :
• Tiếp cận (access) đến phần tử thứ k của DSTT
• Loại bỏ (delete) phần tử thứ k của DSTT
• Chèn (insert) một phần tử mới tại vị trí thứ k của DSTT
Giả sử Element là một phần tử có kiểu đã được định nghĩa trước đó Kiểu trừu tượng List được định nghĩa như sau :
Type List, Place
Functions EmptyList : → List
Length : List → Int Succ : Place → Place Access : List × Int → Place Content : Place → Element Delete : List × Int → List Insert : List × Int × Element → List Preconditions
Pre Access (: List, k : Int) = (1 ≤ k ≤ Length ())
Pre Delete (: List, k : Int) = (1 ≤ k ≤ Length ())
Pre Insert (: List, k : Int, e : Element) = (1 ≤ k ≤ Length () + 1)
/* k = Length () tương ứng với việc thêm một phần tử vào cuối DSTT */
Axioms ForAll : List, k : Int, e : Element :
Length (EmptyList) = 0
( ≠ EmptyList) and (1 ≤ k ≤ Length ())⇒ Length (Delete (, k)) = Length () 1 (1 ≤ k ≤ Length ()) ⇒ Length (Insert (, k, e)) = Length () + 1 ( ≠ EmptyList) and (1 ≤ k < Length ())⇒ Succ (Access (, k)) = Access (, k + 1) ( ≠ EmptyList) and (1 ≤ k ≤ Length ()) and (1 ≤ i ≤ k1) ⇒
Content (Access (Delete (, k), i)) = Content (Access (i) Yêu cầu :
1 Dựa theo các tiên đề đã cho, hoàn chỉnh (điền vào dấu ?) các tiên đề sau đây :