1. Trang chủ
  2. » Văn Hóa - Nghệ Thuật

Tài liệu Đề cương môn học THNNLT (First draft) PHẦN I: PROLOG ppt

24 840 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 24
Dung lượng 341,29 KB

Nội dung

17/ Viết phương thức để tính định thức của ma trận vuông Tiết 10: Các lớpClasses và phương thứcMethods _ Tính thừa kếinheritance và tính đa hìnhPolymorphism Sinh viên cần nắm các nội du

Trang 1

Đề cương môn học THNNLT

(First draft)

PHẦN I: PROLOG

Tiết 1: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH PROLOG (lý thuyết)

Tiết 2: Giới thiệu tổng quan về PROLOG

Sinh viên cần nắm được các nội dung sau:

• Môi trường làm việc của PROLOG

• Cách định nghĩa vấn đề trong PROLOG: vị từ

• Cách biểu diễn vấn đề trong PROLOG: các sự kiện, luật

• Các chương trình ví dụ

• Cách đặt câu hỏi và nhận câu trả lời trong PROLOG

• Phân biệt Goal nội và goal ngoại

Bài tập / bài thực hành:

1/ Làm quen với môi trường làm việc của PROLOG 2.0

2/Định nghĩa một số khái niệm, sự kiện và luật trong PROLOG:

a/Socrates là người Socrates là người Hy Lạp Aristottle là người Xeda là

người Xeda là vua John là vua của nước Pháp

b/John likes Mary Mary likes John Joe likes fish Joe likes Mary Mary likes book John likes book Mary is female

c/ Xây dựng quan hệ gia đình(parent, child, grandparent, aunt) theo sơ đồ sau:

d/Nếu có mưa thì tôi sẽ sử dụng dù Nếu X là người thì X sẽ chết X là chim nếu X là sinh vật(aninal) và X có lông vũ X là chị(em gái) của Y nếu X là phụ

nữ và X và Y có cùng cha mẹ X là ông của Y nếu cha của Y là Z và cha của Z

Trang 2

3/Đặt câu hỏi và nhận câu trả lời

a/Socrates có phải là người Hy Lạp không? Aristotle có phải là người Hy Lạp không? Socrates có phải là người Việt Nam không? Ai chết? Ai là vua? Socrates có chết không?

b/Does John like Mary? What does John like? Is there an object that likes Mary? Is there anything that John and Mary both like?

c/ Ai là cha của Pat? Mẹ của Bob là ai? Ai là ông của Pat? Ai là chị(em gái) của Pat? Ai là con của Tom? atom

Tiết 3: Cú pháp và ngữ nghĩa của các chương trình PROLOG

Sinh viên cần nắm các nội dung sau:

• Các đối tượng dữ liệu: atom, numbers, variables, structes

• Phép so trùng(matching)

• Ý nghĩa của các khai báo trong Prolog

• Prolog trả lời các câu hỏi như thế nào

Trang 3

d/f(D,three)

6/Chương trình sau đây cho rằng hai người bất kỳ là bà con(relatives) với nhau nếu:

• người này là tiền nhân(predecessor) của người kia, hay

• cả hai người đều có cùng tiền nhân, hay

• cả hai người đều có cùng hậu nhân(successor)

relatives(X,Y) :- predecessor(X,Y)

relatives(X,Y) :- predecessor(Y,X)

relatives(X,Y) :- predecessor(Z,Y), predecessor(Z,X)

relatives(X,Y) :- predecessor(X,Z), predecessor(Y,Z)

Hãy rút gọn chương trình này

7/Viết lại chương trình sau mà không sử dụng các dấu chấm phẩy(semicolon)

translate(Number, Word) :-

Number = 1, Word = one;

Number = 2, Word = two;

Number = 3, Word = three

Tiết 4: Cấu trúc dữ liệu, danh sách và các phép toán số học

Sinh viên cần nắm các nội dung sau:

• Cách biểu diễn một danh sách

• Các thao tác trên danh sách

3/Định nghĩa quan hệ last(Item, List) biểu diễn quan hệ Item là phần tử cuối của

danh sách L bằng 2 cách: dùng conc và không dùng conc

4/Viết 2 vị từ:

evenlength(List) và oddlength(List)

trả về true nếu thông số của chúng là 1 danh sách có chiều dài là một số chẳn(lẻ) tương ứng

VD: [a,b,c,d] là evenlength còn [a,b,c] là oddlength

5/Định nghĩa quan hệ reverse(List, ReverseList) dùng để đảo ngược danh sách List

thành danh sách ReverseList

VD: reverse([a,b,c,d].[d,c,b,a])

6/Viết vị từ palindrome(List) trả về true nếu List là một danh sách đối xứng

7/ Định nghĩa quan hệ shift(L1,L2) để dịch chuyển 1 phần tử trong L1 vòng sang trái

Trang 4

9/Định nghĩa quan hê subset(Set,Subset) với Set và Subset là 2 tập hợp để kiểm tra

Subset có là tập con của Set không cũng như để tìm các tập con có thể có của Set

10/Hãy định nghĩa quan hệ dividelist(List, List1, List2) để chia danh sách List thành

hai danh sách con List1 và List2 sao cho chiều dài của 2 danh sách con này xấp xỉ bằng nhau

Ví dụ: devidelist([a,b,c,d,e],[a,c,e],[b,d])

11/Viết vị từ max(X,Y,Max) sao cho Max là số lớn nhất trong hai số X và Y

12/Viết vị từ maxlist(List, Max) để tính số lớn nhất Max trong danh sách List

13/ Viết vị từ sumlist(List, Sum) để tính tổng của một danh sách

14/ Viết vị từ ordered(List) trả về true nếu danh sách List có thứ tự (tăng hay giảm)

Ví dụ:

ordered([1,5,6,6,9]) ->true

15/Viết vị từ subsum(Set, Sum, Subset) với Set là một danh sách các số nguyên,

Subset là tập con của Set, và Sum là tổng các số trong Subset

Ví dụ:

subsum([1,2,5,3,2],5,Sub) -> Sub = [1,2,2]; Sub = [2,3]; Sub = [5]…

Tiết 5: Sự đệ qui, cơ chế Backtracking và kỹ thuật khống chế số lượng lời giải

Sinh viên cần nắm các nội dung sau:

• Nắm vững và vận dụng cách suy nghĩ đệ qui để giải quyết các bài toán trên Prolog

• Hiểu,nắm vững và điều khiển được cơ chế quay lui (backtraking) của Prolog

• Hiểu và sử dụng tốt vị từ fail và nhát cắt (!) để khống chế số lượng lời giải

class(Number, negative) :- Number < 0

Hãy sử dụng (các) nhát cắt để làm tăng tính hiệu quả của quan hệ này

Trang 5

4/ Viết vị từ split(Numbers, Positives, Negatives) để tách một danh sách số nguyên

Numbers thành 2 danh sách: Positives (chứa các số >=0) và Negatives (chứa các số < 0) Hãy viết thành 2 phiên bản: có và không sử dụng nhát cắt

5/ Hãy định nghĩa quan hệ hiệu của hai tập hợp:

difference(Set1,Set2,SetDifference)

Tất cả các tập hợp sẽ được biểu diễn dưới dạng danh sách

Ví dụ:

difference([a,b,c,d], [b,d,e,f], [a,c])

Tài liệu tham khảo:

1/Ivan Bratko (1986) PROLOG Programming for Artificial Intelligent

Addison-Wesley

2/W.F Clocksin and C.S.Mellish (1981) Programming in Prolog Springer-Verlag

3/Turbo Prolog 2.0 userguide

4/Hướng dẫn sử dụng PROLOG

PHẦN II: SMALLTALK

Tiết 6: Giới thiệu ngôn ngữ lập trình SMALLTALK(lý thuyết)

Tiết 7: Làm quen với Smalltalk

Sinh viên cần nắm các nội dung sau:

• Môi trường làm việc của Smalltalk 2000 và Smalltalk/V

• Viết được một số đoạn script ví dụ đơn giản

Bài tập / bài thực hành:

1/ Làm quen với cách sử dụng cửa sổ duyệt cây phân cấp các lớp (Class Hirerachy Browser)

2/ Làm quen với cách sử dụng Disk Browser và các browser khác

3/ Làm quen với cách sử dụng Inspector, Workspaces, Debugger

4/ Làm quen với cách import, export (save, load) một Class hoặc một method

5/Tìm hiểu các chức năng khác trong hệ thống menu

6/Làm quen với môi trường soạn thảo code(editor) trong smalltalk

6/ Hãy cho biết lớp Integer được thừa kế từ các lớp nào trong cây phân cấp lớp của Smalltalk Các lớp nào khác có cùng cha với lớp Integer

7/Thực thi đoạn script biểu thức sau trên cả hai phiên bản của Smalltalk:

(3 + 6) < (6 * 2)

8/Thực thi tất cả các ví dụ có trong tài liệu lý thuyết trong cả hai môi trường

Smalltalk/V và Smalltalk 2000

Tiết 8: Đối tượng(Object) và thông điệp(Messages)

Sinh viên cần nắm các nội dung sau:

• Các đối tượng đơn giản

• Các thông điệp đơn giản

• thông điệp unary, keyword, binary (bao gồm cả các thông điệp toán học)

Trang 6

• thông điệp lồng nhau

• Các biến tạm và biến toàn cục

2/Hãy tính căn bậc hai của biểu thức trên

4/Hãy tính bình phương của biểu thức trên

5/Trong smalltalk có phép chia nguyên và phép chia dư không? Nếu có, chúng có tên

12/Cho một dãy gồm các số và ký tự bất kỳ trong smalltalk Hãy xác định dãy các phần tử là số trong dãy này

Ví dụ: với dãy (1 $a 2 $b) -> (1 2)

13/Cho một dãy gồm ký tự bất kỳ trong smalltalk Hãy xác định dãy các phần tử nguyên âm trong dãy này

Ví dụ: với dãy ($a $a $b $c $e) -> ($a $a $e)

Tiết 9: Các cấu trúc điều khiển (Control Structure)

Sinh viên cần nắm các nội dung sau:

• So sánh hai đối tượng

• Phát biểu điều kiện

• Biểu thức logic

• Các cấu trúc lặp

• Cấu trúc khối với các thông số

Bài tập / bài thực hành:

1/ Viết một phương thức uocso có đối số là một số nguyên b, đối tượng nhận thông

điệp là b cho class Integer để kiểm tra xem b có là ước số của a hay không

2/ Viết một phương thức boiso có đối số là một số nguyên b, đối tượng nhận thông

điệp là b cho class Integer để kiểm tra xem b có là bội số của a hay không

3/ Viết cho lớp integer phương thức songuyento để xác định xem đối tượng nhận

thông điệp có là số nguyên tố hay không

4/ Viết phương thức giaithua cho lớp Integer để tính giai thừa cho một số nguyên n 5/ Viết phương thức tìm ước số chung lớn nhất của hai số nguyên a và b

6/ Viết chương trình tìm bội số chung nhỏ nhất của hai số nguyên a và b

Trang 7

7/ Viết phương thức tính số hạng thứ n của dãy Fibonaci

8/ Viết phương thức dem cho lớp String để đếm số ký tự là chữ hoa trong đối tượng

nhận thông điệp

9/ Viết phương thức tach cho lớp String để tạo ra chuỗi s1 là những ký tự trong s có

mã ASCII chia hết cho vị trí của ký tự đó trong s(đối tượng nhận thông điệp)

10/ Viết phương thức cộng để cộng hai vector

11/ Viết phương thức tich để tính tích vô hướng của hai vector

12/ Viết phương thức sort để sắp xếp thứ tự của một dãy

13/ Viết chương trình(script) giaiptbac1 có 2 đối số là a, b(có xét trường hợp a =0)

14/ Viết chương trình giải phương trình bậc hai

15/ Viết chương trình tính diện tích tam giác khi biết ba cạnh

16/ Viết chương trình tính diện tích và chu vi hình tròn khi biết bán kính

17/ Viết phương thức để tính định thức của ma trận vuông

Tiết 10: Các lớp(Classes) và phương thức(Methods) _ Tính thừa kế(inheritance) và

tính đa hình(Polymorphism)

Sinh viên cần nắm các nội dung sau:

• Khái niệm lớp và phương thức

• Cách duyệt cây phân cấp lớp

• Biến “self”, đối tượng “nil”

• Tạo đối tượng mới

• Biến thực thể tên và biến thực thể chỉ số(index instance variables), biến lớp

• thêm phương thức mới, phương thức lớp

• Sự thừa kế (cả về phương thức lẫn biến)

4/ Hãy so sánh giữa lớp(Classes) và kiểu dữ liệu trừu tượng(abstract data types) 5/ Giả sử có 3 đối tượng A, B, C trong cùng một chương trình lớn đều sử dụng đối tượng R để cung cấp các số ngẫu nhiên(random number) Chúng ta nên sử dụng các bản sao khác nhau của R cho từng đối tượng A, B, C hay dùng chung(share) cùng một đối tượng R cho cả ba đối tượng A, B, C? Tại sao?

Ghi chú: Sinh viên làm thêm bài tập trong tài liệu lý thuyết

First Project in Smalltalk/V: A Prioritizer

Trang 8

code trong môi trường Smalltalk/V cũng như hiểu rõ thêm về khả năng của bộ

Debugger trong Smalltalk/V

Chúng ta sẽ sử dụng các lớp sau trong dự án này:

Dự án mà chúng ta sẽ xây dựng là một chương trình nhỏ cho phép

người sử dụng nhập vào một danh sách các item theo thứ tự bất kỳ, sau đó

chương trình sẽ giúp ta sắp xếp lại các item này theo mức độ quan trọng từ cao

đến thấp hay ngược lại Nói cách khác, thay vì sử dụng các phép so sánh toán

học “lớn hơn”, “nhỏ hơn” cổ điển có sẵn trong một số lớp của Smalltalk/V, dự

án Prioritizer sẽ sử dụng các phép so sánh do người dùng định nghĩa Điều này

cũng giống như trong thực tế, chúng ta thường phải ra nhiều quyết định khác

nhau trong cuộc sống hằng ngày Ứng dụng Prioritizer này sẽ hỗ trợ chúng ta

ra quyết định giữa hai hay nhiều chọn lựa khác nhau bằng cách xem xét đến

từng giá trị có thể có của mỗi lựa chọn khi so sánh chúng với nhau

3 Thiết kế

Xét ở mức độ đơn giản nhất thì dự án này sẽ chỉ có nhiệm vụ chính là

chuyển đổi một thực thể của lớp Collection thành một thực thể của lớp

SortedCollection Chúng ta sẽ thêm vào một số ràng buộc khác vào thiết kế

này để đáp ứng được yêu cầu là ứng dụng hoàn chỉnh phải có nhiều thành

phần khác nhau Cụ thể là chúng ta sẽ phải xây dựng các thành phần để:

• cho phép người sử dụng nhập các item cần được sắp xếp độ ưu tiên

• yêu cầu người sử dụng xếp loại (rank) các cặp trong danh sách các item và trả lời câu hỏi ứng với mỗi cặp phần tử: “phần tử này lớn hơn hay nhỏ hơn phần tử kia?”

• hiển thị danh sách kết quả đã được sắp xếp

• “gắn” (làm cho có thể truy xuất được) ứng dụng vào trong System menu và Demo menu

4 Xây dựng dự án

Chúng ta sẽ bắt đầu việc xây dựng dự án này bằng cách xây dựng một

số thành phần cơ bản của nó trong workspace và kiểm tra chúng Một khi đã

xây dựng thành công những thành phần này thì chúng ta có thể copy và paste

chúng thành method Prioritize

Chúng ta sẽ đi theo các bước đã thiết kế ở phần trên, do đó đầu tiên

chúng ta sẽ xây dựng một đoạn chương trình để yêu cầu người sử dụng nhập

vào một danh sách các phần tử(item) cần sắp xếp Chúng ta sẽ cần một cách

nào đó để hỏi người sử dụng, nhận các thông tin đáp ứng từ phía họ và đưa các

thông tin này vào danh sách các phần tử để sau này chúng ta sẽ tiến hành sắp

thứ tự theo hướng dẫn của người sử dụng

Ở trường hợp này, các lớp mà chúng ta sẽ sử dụng xuất phát (devire)

một cách rất tự nhiên từ các mô tả chương trình đã nêu ở phần trên (Tuy nhiên,

cách tiếp cận này còn mang khá nặng tính thủ tục(procedural approach), không

phải là cách tốt nhất để thiết kế một dự án bằng Smalltalk Trong phần sau

Comment: Xem lại câu văn của

đoạn này

Comment: Chưa làm tới

Trang 9

chúng ta sẽ có cách tiếp cận để thiết kế dự án hướng đối tượng hơn.) Chúng ta

cần tìm các lớp trong Smalltalk/V cho phép chúng ta đưa ra câu hỏi cho người

sử dụng và nhận đáp ứng từ họ Sau khi tìm kiếm trong các lớp của Smalltalk

(có thể tìm thấy trong các tài liệu đi kèm theo phần mềm) chúng ta thấy là lớp

Prompter sẽ đáp ứng được các yêu cầu tương tác người dùng này

4.1 Lớp Prompter

Trong Smalltalk/V Prompter là một cửa sổ nhỏ với một khung soạn

thảo(TextPane) dùng để đưa ra một câu hỏi cho người sử dụng ở dòng đầu

tiên(header) và cho phép người sử dụng nhập câu trả lời ở phần bên dưới

Trong tài liệu đi kèm(manual) smalltalk chúng ta sẽ dễ dàng tìm thấy 3

methods của lớp này dùng cho việc đối thoại với người sử dụng:

• prompt:default:

• prompt:defaultExpression:

• promptWithBlanks:default:

Do chúng ta không cần phải tính toán, đánh giá các câu trả lời do

người sử dụng nhập vào nên ta loại phương thức thứ hai ra khỏi danh sách các

phương thức sẽ sử dụng

Phương thức đầu tiên và phương thức thứ ba có tác dụng gần giống

nhau Tuy nhiên phương thức promptWithBlanks:default: quan tâm đến các

khoảng trắng(space) mà người sử dụng vô tình nhập vào cửa sổ prompter Do

việc này không cần thiết đối với dự án này nên chúng ta sẽ sử dụng phương

thức đơn giản hơn là prompt:default:

Tóm lại, bây giờ chúng ta sẽ xử lý quá trình giao tiếp với người sử

dụng thông qua một thực thể của lớp Prompter mà cụ thể là ta sẽ sử dụng

phương thức prompt:default: của lớp này để nhận vào danh sách các items từ

phía người sử dụng để sắp xếp

4.2 Tạo một Prompter

Hãy mở cửa sổ Workspace trong môi trường Smalltalk/V và nhập đoạn

code sau đây:

|anotherItem|

anotherItem := Prompter prompt:

‘Something to prioritize? (or leave blank)’

default: ‘’

^anotherItem

Sau đó, chọn(highlight) đoạn mã này và chọn show it từ ô menus Kết

quả sẽ giống như trong hình

Comment: Chèn một cái hình

vào đây

Trang 10

Khi người sử dụng nhập vào một đoạn text nào đó và nhấn Enter, Smalltalk/V sẽ hiển thị lại đoạn text này trong cửa sổ Workspace Bây giờ, chúng ta hãy tìm hiểu cụ thể xem đoạn mã ở trên làm việc ra sao

Dòng đầu tiên của đoạn mã chỉ đơn giản là khai báo một biến cục bộ

có tên là anotherItem dùng để lưu các giá trị do người sử dụng nhập vào

Chúng ta chọn tên này vì chúng ta hiểu rằng ứng dụng hoàn chỉnh sau cùng sẽ cho phép người sử dụng nhập vào nhiều hơn 1 item

Dòng kế sử dụng phương thức prompt:default: của lớp Prompter như

đã được trình bày ở trên để đặt câu hỏi vào trong cửa sổ prompter và phần text mặc định là trống

Dòng cuối cùng của đoạn mã trên trả về giá trị mà người sử dụng đã nhập vào Prompter

Tuy nhiên, trả về giá trị này là điều không cần thiết trong ứng dụng của chúng ta Chúng ta cần phải tạo một đối tượng mới để lưu các giá trị này(entry) Vậy đối tượng này sẽ thuộc loại nào? Đối tượng này phải có khả năng lưu trữ nhiều hơn 1 đối tượng tại một thời điểm nào đó Do đó, nó có thể

là một loại Collection nào đó Lớp Collection này có ba lớp con là: Bag, IndexedCollection và Set Do chúng ta không quan tâm đến thứ tự của các

thành phần(elements) trong giai đoạn nhập thông tin từ người sử dụng nên

chúng ta không cần đến lớp IndexedCollection Bag có thể có phần tử trùng

nhau mà Set thì không có Trong trường hợp này, nếu người sử dụng nhập vào một giá trị đã có vào danh sách các lựa chọn để sắp thứ tự thì giá trị này sẽ được bỏ qua Do đó chúng ta cần phải chắc chắn rằng danh sách kết quả sẽ chỉ

có 1 điểm nhập(entry) cho mỗi lựa chọn mà người sử dụng muốn sắp xếp Vì

vậy chúng ta sẽ sử dụng thực thể của lớp Set

Nếu chúng ta đơn giản chỉ định nghĩa một biến cục bộ mới để giữ danh sách tích lũy của các đối tượng và sau đó sửa lại danh sách đã nhập trước đó

để thêm vào tập hợp này, chúng ta sẽ gặp phải một vấn đề là làm sao để dừng quá trình này? Chúng ta cần một phương pháp để cho phép người sử dụng chỉ

ra rằng họ vừa mới nhập xong phần tử cuối cùng Chúng ta đã chọn là: khi người sử dụng không nhập thông tin gì mà nhấn enter thì xem như là danh sách nhập đã chấm dứt Sau đây chúng ta sẽ xây dựng đoạn mã để xử lý tình huống này Nếu thông tin người sử dụng nhập vào là trống thì quá trình nhập kết thúc, ngược lại, chúng ta sẽ tiếp tục đưa ra các Promter mới để yêu cầu người sử dụng nhập tiếp

Trang 11

Sau đây là đoạn mã hoàn chỉnh dùng để nhập cũng như hiển thị tập

hợp các lựa chọn được đưa vào bởi người sử dụng:

|items anotherItem|

itém := Set new

[(anotherItem := Prompter prompt:

‘Something to prioritize? (or leave blank)’

default: ‘’) = ‘’] whileFalse: [items add: anotherItemư

^items

Chọn toàn bộ đoạn mã này rồi chọn mục show it từ hệ thống menu

Kết quả xuất hiện trên màn hình sẽ giống như trong hình bên dưới sau khi

nhập vào một số phần tử và nhấn enter sau khi đã nhập hết các phần tử Chú ý

rằng Smalltalk thật sự sẽ trả về một tập hợp Chúng ta có thể nhập vào các

phần tử trùng nhau để kiểm tra tính duy nhất của dữ liệu nhập như đã trình bày

ở phần trên hay không

4.3 Sắp xếp danh sách của người sử dụng

Do chúng ta sẽ có một danh sách các đối tượng để sắp xếp nên chúng

ta sẽ có cơ hội để làm việc thêm với một trong các lớp con của lớp Collection

Tra cứu trong thư viện các lớp của Smalltalk chúng ta thấy có lớp

SortedCollection có vẻ như là sẽ đáp ứng được yêu cầu sắp xếp của chúng ta

Điều này được khẳng định là đúng khi chúng ta đọc qua phần mô tả

của lớp này Chú ý rằng bất kỳ thực thể nào thuộc lớp này đều có thể truy xuất

vào một đoạn mã có tên là sortBlock Đoạn mã này có hai đối số và trả về một

giá trị kiểu luận lý là true nếu đối số thứ nhất được sắp cao hơn theo thứ tự

được định nghĩa bởi đoạn mã so với đối số thứ hai, ngược lại thì trả về false

Smalltalk/V đã định nghĩa sẵn(default) khối này theo thứ tự alphabet

Do phép so sánh x > y chính là hành vi mà chúng ta mong muốn trong

ứng dụng Prioritizer nên việc lựa chọn lớp nào thích hợp đã quá rõ ràng,

không cần phải tìm thêm các lớp khác nữa Chúng ta chỉ cần sử dụng khía

cạnh này của lớp SortedCollection trong dự án của chúng ta là đủ Tuy nhiên,

sau này chúng ta sẽ thấy các ứng dụng mở rộng khác của lớp này cũng như các

phương thức mạnh mẽ của chúng

Một điều thú vị ở đây là có thể chúng ta sẽ nghĩ là tại sao chúng ta lại

không đơn giản thêm phương thức prioritize vào cho lớp SortedCollection mà

lại phải tạo riêng trong các menu như đã trình bày ở trên? Nếu chúng ta làm

như vậy thì sẽ không hiệu quả bởi vì các phần tử sẽ được sắp xếp mỗi khi

chúng được thêm vào trong một thực thể của lớp SortedCollection(xem mô tả

của lớp này) Điều này sẽ dẫn đến việc là tất cả các phần tử sẽ được sắp xếp lại

hoàn toàn mỗi khi thêm một phần tử vào trong danh sách và trong quá trình

thực thi phương thức prioritize Người sử dụng sẽ bị yêu cầu so sánh đi so

sánh lại các phần tử nhiều lần Việc này rõ ràng là tốn thời gian vô ích

Chúng ta sẽ thêm khả năng sắp xếp vào trong chương trình của chúng

ta Để làm được việc này chúng ta cần phải định nghĩa lớp sortBlock để xác

định các phần tử trong danh sách sẽ được sắp xếp theo cách nào Đoạn mã này

sẽ thực thi trên từng cặp phần tử trong tập hợp được nhập vào gọi là items và

trả về một thực thể của lớp SortedCollection gọi là result

Chúng ta sẽ sử dụng một phương thức khác của lớp Prompter trong

đoạn mã sortBlock này Đó là phương thức prompt:defaultExpression:

Phương thức này sẽ đánh giá các đáp ứng của người sử dụng trước thay vì chỉ

đơn giản trả về các chuỗi thông tin đã nhập của người sử dụng Do sortBlock

Comment: Copy 1 cái hình vào

đây

Trang 12

phải trả về một giá trị luận lý nên chúng ta muốn Smalltalk phải chuyển các

thông tin nhập vào của người sử dụng thành giá trị luận lý

Trong cửa sổ Workspace của chúng ta trước đây, hãy xóa dòng trả về

giá trị của items(dòng cuối cùng), và thêm một biến mới tên là result vào danh

sách các biến ở đầu chương trình Bây giờ, hãy thêm đoạn mã sau đây vào sau

khối của whileFalse

result := SortedCollection sortBlock:

[:a :b | Prompter prompt:

‘Does ‘, a printString, ‘have higher priority than’,

b printString,’ ? (Enter true or false) ‘ defaultExpression: ‘false’]

result addAll: items

^result

Chọn chương trình rồi show it Nhập vào hai hay ba item để sắp xếp

rồi nhấn Enter để báo hiệu là đã kết thúc quá trình nhập thông tin Bây giờ, khi

chúng ta được hỏi item này có lớn hơn item kia hay không(xem hình) chúng ta

có thể nhấn Enter để trả lời là false(default) hoặc chọn câu trả lời mặc định rồi

gõ lại là true.(Lưu ý là phải sử dụng chữ thường) Khi chúng ta đã cung cấp

câu trả lời cho tất cả các cặp phần tử mà chúng ta đã nhập thì Smalltalk/V sẽ

trả về giá trị của biến result đã được sắp thứ tự theo yêu cầu của chúng ta

Ngôn ngữ mà chúng ta đã sử dụng trong prompter ở trên có vẻ không

được tự nhiên lắm Chúng ta muốn là có thể trả lời là “Yes” hay “No” cho câu

hỏi để so sánh thay vì trả lời là “true” và “false” nhưng khối sortBlock đòi hỏi

kiểu kết quả là Boolean mà trong Smalltalk/V, kiểu Boolean chỉ mang 2 giá trị

là true và false Chúng ta có thể cho phép người sử dụng nhập vào câu trả lời

kiểu khác rồi chuyển chúng sang dạng Boolean nhưng điều này làm chúng ta

phải viết thêm vài dòng code nữa Tuy nhiên, chúng ta cũng sẽ không làm do

sau này chúng ta sẽ thay đổi giao diện với người sử dụng(click chuột chẳng

hạn) trong việc trả lời cho chương trình

4.4 Hiển thị kết quả

Có rất nhiều nơi chúng ta có thể hiển thị kết quả của một chương trình

trong Smalltalk/V Có lẽ nơi thông thường nhất, đặc biệt là các ứng dụng đơn

giản như ứng dụng Prioritize này là cửa sổ Transcript Chúng ta đặt các ký

hiệu và các đoạn text vào hệ thống cửa sổ Transcript bằng cách gửi các chuỗi

đến một biến hệ thống toàn cục là Transcript Chúng ta quy ước là sẽ sử dụng

từ: kỹ thuật message cascading khi gửi một loạt các thông điệp đến cùng một

đối tượng(như Transcript trong trường hợp này)

Nhìn lại đoạn mã đã viết, chúng ta thấy biến result chứa một thực thể

của lớp SortedCollection sau khi chúng ta hoàn tất quá trình sắp xếp dưới sự

trợ giúp của người sử dụng Bây giờ có một câu hỏi đặt ra là: làm thế nào để

hiển thị một đối tượng kiểu này? Do Transcript là một thực thể của lớp

TextEditor nên chúng ta sẽ tìm trong tài liệu về các lớp của Smalltalk/V để

biết cách để hiển thị các phần tử trong một thực thể của lớp này Chúng ta sẽ

tìm thấy trong đó có phương thức tên là nextPuttAllL: có vẻ như là để dùng

vào việc này Dù vậy chúng ta cũng nên chú ý rằng phương thức này đòi hỏi

thông số truyền vào phải là một chuỗi Chúng ta đã định nghĩa biến result là

một thực thể của lớp SortedCollection vậy thì câu hỏi tiếp theo là làm thế nào

để biến nó thành một chuỗi

Comment: Thêm 1 cái hình vào

đây

Ngày đăng: 20/12/2013, 22:16

TỪ KHÓA LIÊN QUAN

w