Thuật toán xử lý sự kiện
Kĩ thuật lập trình xử lý sự kiệnNguyễn Xuân TàiLập trình xử lí sự kiệnnghĩa là như thế nào Nghĩa là tạo ramột chương trình đáp ứng đúng đắn cáckích thích của người dùng mỗi kích thích gọi là một sự kiện. Tôimuốn để in nghiêng cụm từ "cáckích thích của người dùng" vì rằng nó có thể hiểu rộng ra là cáchoàn cảnh đã được định nghĩa rõ ràng.Tôi có thể lấy ví dụ hết sức cụ thể cho cái định nghĩa này đó là món quàPEG GAME của Phó giáo sư, Tiến sĩ khoa học Nguyễn Xuân Huy đã đăng trên số8-2000, bài Lập trình theo thời gian thực và theo sự kiện của Nguyễn HiếuCường cũng là một trường hợp khá tiêu biểu.Mô hình chung của loại toánnày là cho một đối tượng ở trong một môi trường đượcđịnh nghĩa sẵn, cho biết phản ứng của đối tượng trước những hoàn cảnh nhấtđịnh. Hãy tìm hiểu về đặc tính hành động của đối tượng trong môi trường đó ởmột thời điểm xác định hoặc xác định trạng thái cuối hoặc mô tả trạng thái theothời gian . Đối với loại toán này đaphần là không khó, thiết nghĩ cũng không nên trình bày dài dòng, sau đây lànhững ví dụ nhằm minh hoạ cho những điều nói trênBài thứ nhất:Mickey là tên của con chuộtmáy tính do một nhóm thành viên của câu lạc bộ Tuổi trẻ sáng tạo làm ra. Mickeycó thể đi vòng quanh mê cung trong hình vẽ 1. Khi đi đến vị trí đánh dấu bớicon số nó sẽ phải lựa chọn một trong các hướng dịch chuyển. Hành vi của conchuột khá là kì quặc, và điều đó gây ấn tượng rất lớn cho mọi người.Các vị trí đánh đấu bởi consố của mê cung được gọi là nút. Mickey chứa một số nguyên X trong bộ nhớ của nóvà có thể thực hiện tính toán với số này. Tại mỗi nút (Ngoại trừ nút 1) Mickeysẽ chọn hướng dịch chuyển tương ứng với số X giảm X đi 1 và dịch chuyển đến nútđược chọn. Hướng dịch chuyển sẽ được lựa chọn theo quy tắc sau:Nút 2:Tính X mod 3. Nếu kết quả là 0,1,2 Mickey di chuyển đến nút 7,1,4 tương ứng.Nút 4: Gọi Y là số thu được từ X bằng cách viết các chữ số (trong hệ đếm thậpphân) của X theo thứ tự ngược lại. Nếu Y>X thì dịch chuyển đến nút 6, tráilại đến nút 2.Nút 6:Tính số lượng chữ số của X (trong hệ đếm thập phân). Nếu kết quả là số chẵn thìđi đến nút 4 trái lại đi đến nút 7.Nút 7:Tính (X*X) mod 7. Nếu kết quả là 0,1,2,4 Mickey di chuyển đến 2,6,8,0 tươngứng.Nút 8:Tính X mod 5. Nếu kết quả là 2 hoặc 3 thì đến nút 7 ngược lại đến nút 9. Nút 9:Nếu vừa đến nút này tử nút 8 thì đến nút 0. Nếu vừa đến nút này từ nút 0 thì sẽđến nút 8.Nút 0:Gọi Y là chữ số thứ ba tính từ hàng đơn vị trong các chữ số viết trong hệ đếmthập phân (nếu X < 100 thì Y = 0) Nếu Y ≤ 7 thì đến nút 7 trái lại đến nút9.Trước khi làm thí nghiệmngười ta đặt chuột tại nút 0 và nói cho nó số X. Con chuột bắt đầu di chuyển.Mickey sẽ hiển thị số X lên màn hình thông báo của nó. Thí nghiệm kết thúc khichuột di chuyển đến nút 1 và số trên màn hình thông báo của nó sẽ là kết quảcủa thực nghiệm. Nếu chuột chưa đến nút 1 mà giá trị của X đã giảm đến 0 thìthực nghiệm bị lỗi và kết quả của thực nghiệm được nghi nhận là -1.Yêu cầu: Cho biết số nguyên dương X được nói cho Mickey khi bắt đầu thực nghiệm,hãy xác định kết quả thực nghiệm.Dữ liệu: Vào từ file văn bản Mickey.inp chứa số nguyên dương X (X < 106)được nói cho Mickey khi bắt đầu thực nghiệm.Kết quả: Ghi ra file văn bản Mickey.out kết quả thực nghiệm.Đây chính là bài thi tin họcquốc gia bảng B năm 1999-2000.Bài toán này tuy dễ nhưnglại là một đặc trưng cho việc xử lí sự kiện.Có thể giải bằng hai cách tiêu biểu đó là cách lặp và cách hướng đối tượng.Theo tôi nghĩ bài toán này nên làm theo cách lặp. Vì nó cũng không đến nỗi phứctạp lắm. Sẽ có một bài toán mà chúng ta sẽ dễ dàng hơn nếu giải bằng hướng đốitượng.Vì đây là bài khá đặc trưngnên tôi sẽ trình bày chi tiết cách giải và qua đó các bạn có thể nêu lên đượcmột phương pháp chung nhất cho mọi bài toán dạng này.1. Xác định các đối tượng cần mô tả, quản lý và môi trường của đối tượng.Cụ thể trong bài toán nàyđối tượng cần mô tả, quản lí là con chuột. Môi trường là các nút trên bản đồ.Môi trường đó được định nghĩa là gồm có 8 nút và mang tên là 0,1,2,4,6,7,8,9.2. Xác định tập các quy tắc tương tác, các hành động trong các hoàn cảnhcụ thể. Theo đề ra các quy tắctương tác chính là các quy tắc di chuyển của con chuột.3. Xác lập các vòng lặp và điều kiện dừng.Trong bước này bạn cần xácđịnh rõ đâu là những điều kiện tương tác luôn luôn có thể lặp lại trong suốtthời gian đối tượng tồn tại. Trong ví dụ trên chính là các quy tắc di chuyển.Đưa tất cả những cái đó vào trong vòng lặp gọi là vòng lặp sự kiện. Thường thìnhững quy tắc tương tác chính là những gì cần phải đưa vào vòng lặp sự kiện. Vàđồng thời bạn cần phải xác định rõ trong những điều kiện nào thì kết thúc vònglặp. Trong bài trên chính là khi nó về tới 1 hoặc chưa về tới 1 mà X đã giảmđến 0.4. Viết đoạn mã tương ứng với từng quy tắc đã định nghĩa.Với con chuột trên tôi cóthể viết mã như sau:Nút 0:temp:=x mod 1000; {temp là mộtbiến phụ được khai báo cùng kiểu với X}temp:=temp div100; {lấy chữ số thứ 3 temp chính làY}if temp <=7 then{nếu Y<=7 thì}nut:=7 {đến nút 7}else {nếu không }beginnut:=9; {đến nút 9}E:=false; {ghi lại rằng đến nút 9 từ nút 0}end;Nút 2:Temp := x mod 3;case temp of0: nut := 7; {nếu là 0thì đến nút 7}1: nut := 1; {nếu là 1thì đến nút 1}2: nut := 4; {nếu là 2thì đến nút 4} end; .5. Đặt các đoạn mã đã viết vào vòng lặp và cho ra Output theo yêu cầu đềbài.Khi một sự kiện xảy ra chúngta kiểm tra xem một trong các hoàn cảnh đã được định nghĩa rõ ràng có thoảmãn thoả mãn không, nếu có thì đoạn mã tương ứng đã viết được khởi động. Ví dụnhư trong bài toán trên khi con chuột bắt đầu đến một nút nào đó - giả sử lànút 2 - thì đó là một sự kiện. Và sự kiện đó được kiểm tra xem là thuộc vào sựkiện đã được định nghĩa nào. Tất nhiên chương trình của chúng ta sẽ hiểu là conchuột đang đứng ở nút 2 và khởi động đoạn mã đã viết cho nút 2. Khi đến một nútkhác từ nút 2 thì một sự kiện khác được phát sinh .Đến khi có một sự kiện thoả mãn việc kết thúc vòng lặp thìchúng ta Output theo đúng yêu cầu đề bài.6. Khởi động đối tượng và cho chạy chương trình.Một bước quan trọng đó làkhởi động cho đối tượng trước khi đi vào vòng lặp sự kiện. Các bạn đặt giá trịkhởi tạo cho các biến quản lí con chuột.Qua ví dụ trên các bạn cóthể tự mình rút ra được một cách làm chung nhất cho các bài toán xử lí sự kiện.Nhưng có bài không làm như thế được hay nói đúng hơn làm như thế thì quản límọi việc rất khó, tôi có thể nêu ví dụ như sau:Bài thứ hai: (Đề thi Olympic Tin họcsinh viên 26/4/1998)Hãy lập trình:a. TạoN = 10 quả bóng có bán kính R nằm trong khoảng 10 đến 50, có màu ngẫu nhiênchuyển động thẳng trên màn hình theo các hướng ngẫu nhiên. Mỗi khi gặp mép mànhình, các quả bóng phản xạ theo nguyên tắc góc tới bằng góc phản xạ.b. Tạora sự va đập giữa các quả bóng theo nguyên tắc phản xạ.Bài toánnày nếu viết như trên quả là rất khó quản lí. Nếu lập trình bằng hướng đốitượng bạn sẽ thấy nó đơn giản hơn nhiều. Tuy nhiên xin cho phép tôi được trìnhbày chuyên đề hướng đối tượng vào một dịp khác. Có một bài toán nữa có thể làmbằng cả hai cách: hướng đối tượng và cách nêu trên đó chính là bài 2 thi30/4/1999 lớp 10: Snake - Đường đi của con rắn. Đây là một bài toán không có gìkhó khăn tôi chắc chắn các bạn tự mình giải quyết được. Các bạn có thể áp dụng kĩ thuật này để giải một số bài toán trong mục Đề ra kỳ này và Olympiad trong các số báo trước . Kĩ thuật lập trình xử lý sự kiệnNguyễn Xuân TàiLập trình xử lí sự kiệnnghĩa là như thế nào Nghĩa là tạo ramột. trong bài toán trên khi con chuột bắt đầu đến một nút nào đó - giả sử lànút 2 - thì đó là một sự kiện. Và sự kiện đó được kiểm tra xem là thuộc vào s kiện đã