Project 1 Nhóm ĐT1 – K50 CHƯƠNG I MÔ PHỎNG HOẠT ĐỘNG MẠCH ĐIỆN JKFF 1.1 YÊU CẦU BÀI TOÁN...................................4 1.2 PHÂN TÍCH BÀI TOÁN.................................5 1.2.1 Phân tích về yêu cầu giải thuật................5 1.2.2 Phân tích về yêu cầu giao diện.................5 a) Đầu vào dữ liệu..................................5 b) Chức năng điều khiển :..........................6 c) Đầu ra của chương trình:........................6 1.2.3 Lựa chọn công nghệ :............................7 Với Visual C++...................................... 7 Với Visual C#....................................... 8 1.3 THIẾT KẾ............................................ 8 1.3.1 Thiết kế về giải thuật.........................8 1.3.2 Thiết kế về giao diện.........................10 a) Sơ đồ chức năng.................................10 b) Giao diện của chương trình :...................12 1.4 HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG....................13 1.4.1 Yêu cầu cài đặt................................13 1.4.2 Từng bước cài đặt, hướng dẫn sử dụng.........13 a) Từng bước cài đặt :............................13 b) Hướng dẫn sử dụng :............................14 1.5 KẾT LUẬN........................................... 18 a) Ưu điểm :....................................... 18 b) Nhược điểm :.................................... 18 c) Hướng phát triển :.............................18 1.6 PHỤ LỤC........................................... 18 1.6.1 Tạo đối tượng JKFF.............................18 1.6.2 Lớp thực hiện giải thuật của chương trình....19 1.6.3 Xây dựng Control kế thừa từ TextBox cho phép nhập 10 ký tự 0 hoặc 1...............................20 1.6.4 Xây dựng Control kế thừa tự TextBox cho phép nhập số từ 0 đến 99..................................22 1.6.5 Module nhận tín hiệu đầu vào và hiển thị lên đồ thị................................................ 23 Trang 1
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Project 1 Nhóm ĐT1 – K50
CHƯƠNG I
MÔ PHỎNG HOẠT ĐỘNG MẠCH ĐIỆN JKFF
1.1 YÊU CẦU BÀI TOÁN.........................................................................................41.2 PHÂN TÍCH BÀI TOÁN...................................................................................5
1.2.1 Phân tích về yêu cầu giải thuật........................................................................51.2.2 Phân tích về yêu cầu giao diện........................................................................5
a) Đầu vào dữ liệu.................................................................................................5b) Chức năng điều khiển :....................................................................................6c) Đầu ra của chương trình:.................................................................................6
1.2.3 Lựa chọn công nghệ :.......................................................................................7Với Visual C++.....................................................................................................7Với Visual C#........................................................................................................8
1.3 THIẾT KẾ...............................................................................................................81.3.1 Thiết kế về giải thuật........................................................................................81.3.2 Thiết kế về giao diện......................................................................................10
a) Sơ đồ chức năng.............................................................................................10b) Giao diện của chương trình :........................................................................12
1.4 HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG....................................................131.4.1 Yêu cầu cài đặt................................................................................................131.4.2 Từng bước cài đặt, hướng dẫn sử dụng........................................................13
a) Từng bước cài đặt :........................................................................................13b) Hướng dẫn sử dụng :......................................................................................14
1.5 KẾT LUẬN............................................................................................................18a) Ưu điểm :.........................................................................................................18b) Nhược điểm :..................................................................................................18c) Hướng phát triển :..........................................................................................18
1.6 PHỤ LỤC..............................................................................................................181.6.1 Tạo đối tượng JKFF........................................................................................181.6.2 Lớp thực hiện giải thuật của chương trình...................................................191.6.3 Xây dựng Control kế thừa từ TextBox cho phép nhập 10 ký tự 0 hoặc 1.....................................................................................................................................201.6.4 Xây dựng Control kế thừa tự TextBox cho phép nhập số từ 0 đến 99.....221.6.5 Module nhận tín hiệu đầu vào và hiển thị lên đồ thị..................................231.6.6 Module tín hiệu đầu ra và hiển thị lên đồ thị...............................................241.6.7 Module là thực hiện Reset chương trình......................................................261.6.8 Module chạy chương trình.............................................................................261.6.9 Module tạm dừng chương trình.....................................................................271.6.10 Module kích hoạt chương trình bắt đầu chạy............................................27
Trang 1
Project 1 Nhóm ĐT1 – K50
CHƯƠNG II
DUYỆT CÂY CÂN BẰNG AVL
2.1 YÊU CẦU BÀI TOÁN.......................................................................................29a) Giới thiệu về cây cân bằng :..........................................................................29b) Yêu cầu bài toán :...........................................................................................30
2.2 PHÂN TÍCH BÀI TOÁN.................................................................................302.2.1 Phân tích về yêu cầu giải thuật :....................................................................302.2.2 Phân tích về yêu cầu giao diện :....................................................................30
a) Đầu vào dữ liệu...............................................................................................30b) Chức năng điều khiểu....................................................................................31c) Đầu ra của chương trình................................................................................32
2.2.3 Lựa chọn công nghệ :.....................................................................................33Với Visual C++...................................................................................................33Với Visual C#......................................................................................................34
2.3 THIẾT KẾ.............................................................................................................342.3.1 Thiết kế về giải thuật :....................................................................................34
a) Thêm Node mới vào cây :.............................................................................35b) Xóa Node của cây :........................................................................................37c) Duyệt cây tìm Node :.....................................................................................39d) Xây dựng cây :................................................................................................41e) Xóa cây :..........................................................................................................42
2.3.2 Thiết kế về giao diện :....................................................................................43a) Sơ đồ chức năng :...........................................................................................43b) Giao diện của chương trình :........................................................................44
2.4 HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG....................................................452.4.1 Yêu cầu cài đặt................................................................................................452.4.2 Từng bước cài đặt, hướng dẫn sử dụng........................................................45
a) Từng bước cài đặt :........................................................................................45b) Hướng dẫn sử dụng :......................................................................................46
2.5 KẾT LUẬN............................................................................................................53a) Ưu điểm :.........................................................................................................53b) Nhược điểm :..................................................................................................53c) Hướng phát triển :..........................................................................................53
2.6 PHỤ LỤC...............................................................................................................532.6.1 Tạo đối tượng TreeNode................................................................................532.6.2 Chức năng thực hiện quay cây......................................................................542.6.3 Chức năng thêm Node mới vào cây :...........................................................552.6.4 Chức năng thực hiện xóa Node.....................................................................582.6.5 Tìm kiếm Node trên đồ thị :..........................................................................602.6.6 Tìm Node có giá trị lớn nhất :.......................................................................612.6.7 Tìm Node có giá trị nhỏ nhất :......................................................................612.6.8 Tạo đối tượng Node........................................................................................62
Trang 2
Project 1 Nhóm ĐT1 – K50
2.6.9 Thủ tục tạo cây mới :......................................................................................632.6.10 Lưu sơ đồ của cây trước và sau khi thêm hoặc xóa Node.......................64
TÀI LIỆU THAM KHẢO.......................................................................................65
Trang 3
Project 1 Nhóm ĐT1 – K50
CHƯƠNG I
MÔ PHỎNG HOẠT ĐỘNG MẠCH ĐIỆN JKFF
1.1 YÊU CẦU BÀI TOÁN :Viết chương trình mô phỏng quá trình hoạt động của mạch JKFF (JK – Flip
Flop đồng bộ dùng NAND)
Hình 1.1 Sơ đồ mạch mô phỏng
Hình 1.2 Bảng tín hiệu đầu vào và ra
Các tín hiệu điều khiển J, K chỉ tác động đến mạng khi Ck ở mức logic cao “H”, 2 tín hiệu xóa (Clear) và thiết lập (Preset) là những tín hiệu không đồng bộ, mức tích cực thập “L”. Sự hồi tiếp từ đầu ra về đầu vào sẽ làm cho mạch dao động khi xung đồng bộ Ck là các tín hiệu điều khiển J, K ở mức cao “H”. Hiện tượng này gọi là hiện tượng đua vòng và có thể gây ra nên chuyển biến sai nhầm của mạch.
Vẽ mạch và biểu đồ thời gian. Tín hiệu đầu vào là xung nhị phân ngẫu nhiên (0, 1) có độ dài 10 ký tự. Trời gian trễ của các mạch có thể thay đổi được. Tín hiệu đầu vào và ra được thể hiện bằng các màu:
- Đỏ cho tín hiệu 1
Trang 4
Project 1 Nhóm ĐT1 – K50
- Vàng cho tín hiệu 0.
1.2 PHÂN TÍCH BÀI TOÁN
1.2.1 Phân tích về yêu cầu giải thuật
Bài toán yêu cầu mô phỏng quá trình làm việc của mạch JKFF để người dùng có thể hình dung một cách trực quan về mạch JKFF.Bài toán yêu cầu :
- Hai tín hiệu đầu vào là J và K là hai chuỗi tính hiệu nhị phân 0 và 1 và có độ dài nhỏ hơn 10 bit.
- Có hai tín hiệu đầu ra Q và .- Độ trễ của mạch do người dùng nhập vào
Giải thuật của bài toán: Nếu J = 0
o Nếu K = 0
Nếu Q = 0 thì Q’ = 0 Nếu Q = 1 thì Q’ = 1
o Nếu K = 1
Nếu Q = 0 thì Q’ = 0 Nếu Q = 1 thì Q’ = 0
Nếu J = 1o Nếu K = 0
Nếu Q = 0 thì Q’ = 1 Nếu Q = 1 thì Q’ = 1
o Nếu K = 1
Nếu Q = 0 thì Q’ = 1 Nếu Q = 1 thì Q’ = 0
= NOT (Q’)(trong đó J và K là hai tín hiệu đầu vào, Q và Q’ là trang thái hiện tại và trạng thái kế tiếp cuả mạch, là trạng thái phủ định của Q’)
1.2.2 Phân tích về yêu cầu giao diện
a) Đầu vào dữ liệu
o Có hai ô Text cho phép người dùng nhập dẫy bit 1, 0 cho hai đầu
vào là J và K
Hình 1.3 Mô phỏng việc nhập tín hiệu đầu vào
Trang 5
Project 1 Nhóm ĐT1 – K50
Nếu việc nhập tín hiệu đầu vào vượt quá 10 ký tự hoặc ký tự nhập vào không phải là ký tự 1 và 0 thì đưa ra cảnh báo
Hình 1.4 Mô phỏng việc đưa ra cảnh báo nhập dữ liệu không đúng
o Một ô Text để nhập độ trê của mạch ( tính theo mini giây)
Hình 1.5 Mô phỏng việc nhập đỗ trễ cho mạch
b) Chức năng điều khiển :
o Các nút điều khiểu chương trình
Hình 1.9 Dạng tín hiệu đầu rao Nút Run để bắt đầu chạy chương trìnho Nút Clear sẽ xóa sách các ô Text chứa tín hiệu đầu vào, ra và độ
trễ của mạcho Nút Reset thiết lập lại trạng thái của mạch về 0 (Q=0)o Nút Help chứa thông tin về hướng dẫn sử dụng, nhóm phát triển
chương trìnho Nút Exit kết thúc chương trình
c) Đầu ra của chương trình:
o Hai ô Text hiển thị tín hiệu đầu ra của Q và
Hình 1.6 Mô phỏng tín hiệu đầu ra của mạch
o Dạng đồ thị hiển tịn tín hiệu đầu vào
Trang 6
Project 1 Nhóm ĐT1 – K50
Hình 1.7 Dạng tín hiệu đầu vào
o Dạng đồ thị hiển thị tín hiệu đầu ra
Hình 1.8 Dạng tín hiệu đầu ra
1.2.3 Lựa chọn công nghệ :
Dựa trên yêu cầu bài toán, chúng em lựa chọn công cụ phát triển là Visual C# và Visual C++Với Visual C++ :
Các chức năng của Visual C++ như tô sáng cú pháp, IntelliSense (chức năng về tự động hoàn thành việc viết mã) và các chức năng gỡ lỗi tiên tiến. Nó cho phép gỡ lỗi từ xa sử dụng một máy tính khác và cho phép gỡ lỗi bằng cách duyệt qua từng dòng lệnh tại một thời điểm. Chức năng "biên tập và tiếp tục" cho phép thay đổi mã nguồn và dịch lại chương trình trong quá trình gỡ lỗi, mà không cần phải khởi động lại chương trình đang được gỡ lỗi.
Đặc trưng biên dịch và xây dựng hệ thống, tính năng tiền biên dịch các tập tin đầu đề (header files) và liên kết tịnh tiến (incremental link) - chỉ liên kết những phần bị thay đổi trong quá trình xây dựng phần mềm mà không làm lại từ đầu. Những đặc trưng về tính năng này thuyên giảm
tổng thời gian biên tập, biên dịch và liên kết chương trình phần mềm, đặc biệt đối với những đề án phần mềm lớn.
Với Visual C# :
C#, theo một hướng nào đó, là ngôn ngữ lập trình phản ánh trực tiếp nhất đến .NET Framework mà tất cả các chương trình .NET chạy, và nó phụ thuộc mạnh mẽ vào Framework này. Mọi dữ liệu cơ sở đều là đối tượng, được cấp phát và hủy bỏ bởi trình dọn rác Garbage-Collector (GC), và nhiều kiểu trừu tượng khác chẳng hạn như class, delegate, interface, exception, v.v, phản ánh rõ ràng những đặc trưng của .NET runtime.So sánh với C và C++, ngôn ngữ này bị giới hạn và được nâng cao ở một vài đặc điểm nào đó, nhưng không bao gồm các giới hạn sau đây:
o Các con trỏ chỉ có thể được sử dụng trong chế độ không an
toàn. Hầu hết các đối tượng được tham chiếu an toàn, và các phép tính đều được kiểm tra tràn bộ đệm. Các con trỏ chỉ được sử dụng để gọi các loại kiểu giá trị; còn những đối tượng thuộc bộ thu rác (garbage-collector) thì chỉ được gọi bằng cách tham chiếu.
o Các đối tượng không thể được giải phóng tường minh.o Chỉ có đơn kế thừa, nhưng có thể cài đặt nhiều interface trừu
tượng (abstract interfaces). Chức năng này làm đơn giản hóa sự thực thi của thời gian thực thi.
o C# thì an-toàn-kiểu (typesafe) hơn C++.o Cú pháp khai báo mảng khác nhau("int[] a = new int[5]" thay
vì "int a[5]").o Kiểu thứ tự được thay thế bằng tên miền không gian
(namespace).o C# không có tiêu bản.o Có thêm Properties, các phương pháp có thể gọi các Properties
để truy cập dữ liệu.o Có reflection.
Dựa trên việc phân tích và nhận định về tính ưu điểm và nhược điểm của từng ngôn ngữ chúng em chọn công cụ phát triển làVisual C# 2008
1.3 THIẾT KẾ
1.3.1 Thiết kế về giải thuật
Trang 8
Project 1 Nhóm ĐT1 – K50
Hình 1.10 Sơ đồ giải thuật
Trang 9
Project 1 Nhóm ĐT1 – K50
Diễn giải sơ đồ thuật toán :
N = J.Length();i = 0;Q = Q’ = 0; = 1Loop
i = i +1; Nếu i <= n thì
chJ = J.subString(i,1);chK = K.subString(i,1);
Nếu chJ = 0 thìo Nếu chK = 0 thì
Nếu Q = 0 thì Q’ = 0 Ngược lại thì Q’ = 1
o Ngược lại thì Q’ = 0
Ngược lại o Nếu chK = 0 thì Q’ = 1o Ngược lại
Nếu Q = 0 thì Q’ = 1 Ngược lại thì Q’ = 0
Ngược lại thì thoát khỏi vòng lặpEnd loop
1.3.2 Thiết kế về giao diện
a) Sơ đồ chức năng
1.11 Sơ đồ chức năng của chương trình
Trang 10
Project 1 Nhóm ĐT1 – K50
Giải thích sơ đồ chức năng: Nhập dữ liệu đầu vào : Chức năng này thực hiện việc nhập dữ
liệu đầu vào cho J, K và thời gian trễ của mạch .o Các tín hiệu đầu vào của J và K là các tín hiệu 0 và 1, có độ
dài 10 ký tự.o Nếu ký tự nhập vào không phải là số hoặc là số nhưng
không phải là các ký tụ 0 hoặc 1 thì đưa ra cảnh báo cho người dùng biết.
o Nếu người dùng nhập đầu vào cho J và K mà có độ dài
khác nhau thì cũng đưa ra cảnh báo yêu cầu nhập độ dài của hai tín hiệu này phải bằng nhau.
o Sau khi người dùng nhập đúng 10 ký tự, nếu người dùng có
nhập bất kỳ ký tự nào khác thì chương trình sẽ không hiện ký tự đó lên.
o Đối với độ trễ của mạch (mặc định là mini giây), yêu cầu
người dùng phải phập đúng là số nguyên nằm trong khoảng từ 0 đến 99. Nếu người dùng nhập quá giới hạn đó thì ký tự đó sẽ không được hiện lên.
Chạy/Tạm dừng : Sau khi người dùng đã nhập đậy đủ các thông tin đầu vào và thực hiện việc mô phòng mạch. Chức năng này sẽ thực hiện việc truyền các tín hiệu đầu vào và thời gian trễ của mạch vào các module chương trình để thực hiện mô phỏng mạch chạy.
o Trước khi Click chức năng này thì chức năng có tên là
Chạy.o Sau khi Click chức năng này thì nó có tên là Tạm dừng.o Nếu trong quá trình mạch đang chạy, nếu người dùng có
nhu cầu tạm dừng chương trình thì chỉ việc Click vào chức năng tạm dừng thì chương trình sẽ tạm dừng và người dùng có thể sửa chữa các thông tin đầu vào như tín hiệu đầu vào ở J và K, thờii gian trễ của mạch.
Reset : Chức năng này thực hiện việc xóa toàn bộ trạng thái thiện thời của mạch, thiết lập lại trạng thái của mạch như lúc chưa có tín hiệu vào.
o Xóa trạng thái hiện thời của mạch.o Thiết lập trạng thái của mạch về ban đầu.o Dừng chương trình để chờ người dùng kích hoạt.o Xóa trắng các tín hiệu đầu vào và xóa trắng thời gian trễ
của mạch. Clear :
o Tạm dừng chương trình
Trang 11
Project 1 Nhóm ĐT1 – K50
o Giữ nguyên trạng thái hiện thời của mạch.o Xóa trắng các tín hiệu đầu vào và xóa trắng thời gian trễ
của mạch. Exit :
o Dừng chương trìnho Xóa trắng các tín hiệu đầu vào và xóa trắng thời gian trễ
của mạcho Thoát khỏi chương trình
JKFF Help : Hường dẫn sử dụng chương trình About : thông tin về đề tài và nhóm phát triển
b) Giao diện của chương trình :
Hình 1.12 Giao diện của chương trìnhGiao diện của chương trình được chia làm bốn vùng, mỗi vùng sẽ làm nhiệm vụ nhất định.
o Vùng 1: chứa tiêu đề của chương trìnho Vùng 2: chứa sơ đồ mạch điện, trên đó các linh kiện được bố trí
giống như yêu cầu bài toán đã choo Vùng 3 : khu vực điều khiển chương trình, khu vực này gồm có các
nút điều khiển các chức năng của chương trình
Trang 12
Project 1 Nhóm ĐT1 – K50
o Vùng 4 : vẽ tín hiệu vào, tín hiệu vào được vẽ là các xung vuôngo Vùng 5 : vẽ tín hiệu ra, tín hiệu được vẽ trong khu vực này là các
xung vuông giựa trên độ trễ của mạch điện và trạng thái trong trước của mạch để có tín hiệu ra hợp lý
1.4 HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG
1.4.1 Yêu cầu cài đặt
Yêu cầu về phần cứng : Máy vi tính : P4 2.2 GHz, RAM 512, độ phân giải 1152 x
864 Yêu cầu về phần mềm :
Hệ điều hành: Windows XP. Windows Vista Framework 3.5 VisualBasicPowerPacks3
1.4.2 Từng bước cài đặt, hướng dẫn sử dụng
a) Từng bước cài đặt :
Cài dặt Frameword 3.5 :(nếu chưa có bạn có thể vào www.microsoft.com để download về)
Hướng dẫn cài đặt được chương trình hướng dẫn chi tiết, bạn chỉ việc đọc và làm theo. VisualBasicPowerPacks3
Hình 1.14 Cài đặt VisualBasicPowerPacks3
b) Hướng dẫn sử dụng :
Cài đặt chương trình
Trang 14
Project 1 Nhóm ĐT1 – K50
Hình 1.15 Cài đặt chương trình bước 1
Hình 1.16 Cài đặt chương trình bước 2
Trang 15
Project 1 Nhóm ĐT1 – K50
Hình 1.16 Cài đặt chương trình bước 2
Sử dụng chương trình
Hình 1.17 Giao diện chính của chương trìnho Tab Parameter : chứa các chức năng điều khiển chương trìnho Tab Univerral truth : chứa bảng trạng thái của mạch
Hình 1.18 Bảng tín hiệu đầu vào và ra
Trang 16
Project 1 Nhóm ĐT1 – K50
o Nhập các tín hiệu 0, 1 vào hai ô Text (Signal J, Signal J), mỗi ô Text
không được nhập quá 10 ký tự 0 hoặc 1Nếu nhập không đúng yêu cầu thì một thong báo hiện lên cảnh báo người dung
Hình 1.19 Cảnh báo yêu cầu chỉ nhập 0 hoặc 1
o Nhập độ trên cho mạch vào ô Delay, thời gian trễ tính bằng mini giây
Nếu người dung nhập không đúng yêu cầu thì sẽ được cảnh báo
Hình 1.20 Cảnh báo chỉ được nhập giá trị từ 0 đến 99
o Sau khi nhập đúng các giữ liệu đầu vào, người dùng thực hiện chạy
chương trình bằng cách Click vào nút Run
Hình 1.21 Cảnh báo chỉ được nhập giá trị từ 0 đến 99
Trước khi Click vào nút Run thì nó có nhãn là Run nhưng khi Click vào nó chương trình sẽ bắt đầu chạy và nhãn của nó sẽ là Pause. Nếu người dung Click them vào nó thì chương trình sẽ tạm dừng và nhãn của nó sẽ trở lạilà Run.
o Nút Clear sẽ thực hiện việc xóa sạch các ô Text nhập liệu nhưng vẫn
giữ nguyên trạng thái của mạch.o Nút Reset sẽ thực hiện việc xóa sạch các ô Text nhập liệu và thiết lập
trạng thái cảu mạch về ban đầu khi chưa có tín hiệu vào.
Trang 17
Project 1 Nhóm ĐT1 – K50
o Nút Help sẽ mở ra một file hướng đẫn sử dụng chương trình và thông
tin về nhóm phát triển chương trình.o Nút Exit sẽ thực hiện việc thoát khỏi chương trình.
1.5 KẾT LUẬN
a) Ưu điểm :
Giao diện trực quan, thiết kế giao diện nhanh nhờ các công cụ kéo thả có sẵn.
Mã chương trình được viết bằng C# lên rõ ràng, dễ hiểu Sử dụng công cụ hõ trợ là ComponentOne.Net mà cụ thể là
C1Chart lên tạo đồ thị nhanh chóng.
b) Nhược điểm :
Do chương trình được viết trên nền C# lên còn phụ thuộc vào nền phát triển và Framework.
Chưa tự lập trình vẽ đồ thị mà phải phụ thuộc vào công cụ bên ngoài.
c) Hướng phát triển :
Ứng dụng các giải thuật của vài này để lập trình cho các mạch mô phỏng tương tự.
Tín hiệu đầu vào chỉ có 10 ký tự, nếu số lượng tín hiệu vào lớn hơn thì sẽ phải có cơ chế co ngắn độ rộng của từng xung tín hiệu đầu ra cho hợp lý.
1.6 PHỤ LỤC
1.6.1 Tạo đối tượng JKFF
class clsJKQ1Q2 { private String _J; private String _K; private String _Q1; private String _Q2; //khai báo thuộc tính public String J { get { return _J; } set { _J = value; } }
Trang 18
Project 1 Nhóm ĐT1 – K50
public String K { get { return _K; } set { _K = value; } } public String Q1 { get { return _Q1; } set { _Q1 = value; } } public String Q2 { get { return _Q2; } set { _Q2 = value; } } }
1.6.2 Lớp thực hiện giải thuật của chương trình
class clsActive { Public clsJKQ1Q2 CP(clsJKQ1Q2 cls) { if (cls.J == "0") //khi cls.J=0 { if (cls.K == "0") //khi ca cls.J=0 va cls.K=0 {
if (cls.Q1 == "0") //khi ca cls.J=0 , cls.K=0, cls.Q1=0 { cls.Q1 = "0";
} else //khi ca cls.J=0 , cls.K=0, cls.Q1=1 {
cls.Q1 = "1"; }
} else //khi ca cls.J=0 va cls.K=1 { cls.Q1 = "0"; } } else //khi cls.J=1
Trang 19
Project 1 Nhóm ĐT1 – K50
{ if (cls.K == "0") //khi ca cls.J=1 va cls.K=0 { cls.Q1 = "1"; } else //khi ca cls.J=1 va cls.K=1 { if (cls.Q1 == "0") //khi ca cls.J=1 , cls.K=1, cls.Q1=0 { cls.Q1 = "1"; } else //khi ca cls.J=1 , cls.K=1, cls.Q1=1 { cls.Q1 = "0"; } } } if (cls.Q1 == "0") { cls.Q2 = "1"; } else { cls.Q2 = "0"; } return cls; } }
1.6.3 Xây dựng Control kế thừa từ TextBox cho phép nhập 10 ký tự 0 hoặc 1
public class txtDigital : TextBox{
public txtDigital(){
this.Text = ""; //khởi tạo ban đầu là khoẳng trốngthis.MaxLength = 10; //chỉ cho phép nhập tối đa 10 ký tựthis.TextAlign = HorizontalAlignment.Left; //căn bên tráiValidated += new System.EventHandler(textBox_Validated);
this.timer2.Interval = 2 * Convert.ToInt32(this.txtDelay.Text);this.ChartJ.ChartArea.AxisX.Text = "Time t x " +
Convert.ToString(this.txtDelay.Text) + " (ms)"; this.ChartK.ChartArea.AxisX.Text = "Time t x " +
Convert.ToString(this.txtDelay.Text) + " (ms)"; this.ChartQ1.ChartArea.AxisX.Text = "Time t x " +
Convert.ToString(this.txtDelay.Text) + " (ms)"; this.ChartQ2.ChartArea.AxisX.Text = "Time t x " +
Convert.ToString(this.txtDelay.Text) + " (ms)";
Trang 23
Project 1 Nhóm ĐT1 – K50
j = j + 1; //biến duyệt độ dài của ô txtJ và txtK // lay 2 bit tin hieu o dau J va K t2.J = Strings.Mid(this.txtJ.Text, j, 1); t2.K = Strings.Mid(this.txtK.Text, j, 1); if (t2.J == "1") //nếu tín hiệu vào đầu J là 1
{ this.c01.FillColor = Color.Red;
} Else //ngược lại
{ this.c01.FillColor = Color.Yellow;
} //-- Xet tin hieu vao o dau K
if (t2.K == "1") //nếu tín hiệu vào đầu K là 1 {
this.c02.FillColor = Color.Red; }
else {
this.c02.FillColor = Color.Yellow; }
//ve do thi tren JK int x, y;
x = y = 0; //vẽ tín hiệu đầu vào x = Convert.ToInt32(j);
y = Convert.ToInt32(t2.J); this.ChartJ.ChartGroups[0].ChartData.SeriesList[0].X.Add(x - 1);
this.ChartJ.ChartGroups[0].ChartData.SeriesList[0].Y.Add(y); y = Convert.ToInt32(t2.K);
1.6.6 Module tín hiệu đầu ra và hiển thị lên đồ thị
private void OutputQ1Q2() { t2 = Choose.CP(t2); // sau buoc so sanh CP (Compare) thi t2 chinh la trang thai thoa ma yeu cau
Trang 24
Project 1 Nhóm ĐT1 – K50
// Sau khi tin duoc trang thai ke tiep phu hop voi trang thai ngay sau no thi hien mau // mau RED cho trang thai co tin hieu // mau YELLOW cho trang thai khong co tin hieu //================================== //-- Xet tin hieu ra o dau Q' if (t2.Q1 == "1") { this.c3.FillColor = Color.Red; } else { this.c3.FillColor = Color.Yellow; } //-- Xet tin hieu ra o dau Q if (t2.Q2 == "1") { this.c4.FillColor = Color.Red; } else { this.c4.FillColor = Color.Yellow; } //=============================== // hien tin hieu dau ra this.txtQ2.Text = this.txtQ2.Text + t2.Q2; this.txtQ1.Text = this.txtQ1.Text + t2.Q1; // hien lan luot tung doan xung int x, y; x = y = 0; //ve tin hieu dau ra x = 1 + Convert.ToInt32(j); y = Convert.ToInt32(t2.Q1); this.ChartQ1.ChartGroups[0].ChartData.SeriesList[0].X.Add(x); this.ChartQ1.ChartGroups[0].ChartData.SeriesList[0].Y.Add(y); y = Convert.ToInt32(t2.Q2); this.ChartQ2.ChartGroups[0].ChartData.SeriesList[0].X.Add(x); this.ChartQ2.ChartGroups[0].ChartData.SeriesList[0].Y.Add(y); //=================== }
private void Run() { // Timer1 la de khoi dong chuong trinh chay // Timer1 láy ra từng bít tín hiệu đầu vào
// Timer1 nhạn tín hiệu đầu vào và hiệu lên mầu đầu vào // RED - 1/YELLOW - 0
// Timer1 vẽ đồ thị tín hiệu vào // Timer2 nhận tín hiệu ra và vẽ lên đồ thị RED - 1/YELLOW - 0 // Timer2 vẽ tín hiệu ra // Timer3 tạo độ trể khi đồ thị đã được vẽ xong // Timer3 có đỗ trễ 3 giây if (this.txtJ.Text.Length != this.txtK.Text.Length) {
//nếu độ dài của txtJ khác txtK thì hiện thông báo lỗi yêu cầu
Trang 26
Project 1 Nhóm ĐT1 – K50
// nhập lại frmLength frm = new frmLength(); frm.ShowDialog(); return; } if (this.txtDelay.Text != "") //nếu txtDelay khác 0 { // gán thời gian Delay cho Timer this.timer2.Enabled = false; this.timer1.Enabled = false; this.timer3.Enabled = true; } Else //nếu thời gian trễ chưa nhập vào thì hiện lên thông báo lỗi { this.timer2.Enabled = false; this.timer1.Enabled = false; this.timer3.Enabled = false; frmLength frm = new frmLength(); frm.ShowDialog(); return; } }
//biến ji kiểm tra xem chương trình đang chạy hay tạm dừng ij=ij+1; if (ij==1) //nếu ị=1 nghĩa là chương trình đang chạy { Run(); this.timer1.Enabled = true;
Trang 27
Project 1 Nhóm ĐT1 – K50
this.butOK.Text = "Pause"; } Else // ngược lại nghĩa là chương trình đang tạm dừng { Pause(); ij=0; this.butOK.Text = "Run"; } }
Trang 28
Project 1 Nhóm ĐT1 – K50
CHƯƠNG II
DUYỆT CÂY CÂN BẰNG AVL
2.1 YÊU CẦU BÀI TOÁN :
a) Giới thiệu về cây cân bằng :
Cậy nhị phân tìm kiếm ứng với n khóa k1,k2,k3…kn là cây nhị phân mà mỗi nút của nó đều được định danh bới 1 khóa nào đó trong các khóa đã cho và đối với mọi nút trên cây tính chất sau đây luôn được thỏa mãn:
Mọi khóa thuộc cây con trái của nút đó đều nhỏ hơn khóa ứng với nút đó. Mọi khóa thuộc cây con phải của nút đó đều nhỏ hơn khóa ứng với nút đó Cây nhị phân gọi là cây cân đối AVL (Adelson Velskii và Landis) nếu như
đối với mọi nút của nó,chiều cao của 2 cây con tương ứng chỉ chênh nhau một đơn vị.Ví dụĐây là cây nhị phân cân đối AVL nhưng không phải là cây nhị phân hoàn chỉnh
Hình 2.1 Cây nhị phân cân đối AVL nhưng không hoàn chỉnh
Hình 2.2 Cây nhị nhập hoàn chỉnh và là cây nhị nhâp cân đối AVL
Trang 29
Project 1 Nhóm ĐT1 – K50
b) Yêu cầu bài toán :
Xây dựng cây nhị phân cân đối AVL ứng với n khóa k1,k2,k3…,kn với n nhập từ bàn phím sau đó hiện lên màn hình cây vừa được xây dựng
Tìm xem khóa X nào đó được nhập từ bàn phím có trên cây nhị phân cân đối AVL đã xây dựng không ?
Loại bỏ một khóa X nào đó (sau đó cây này vẫn phải đảm bảo là cây nhị phân cân đối AVL) sau đó hiện lên màn hình cây có khóa bị loại .
Chèn thêm một khóa X nào đó được nhập từ bàn phím vào cây nhị phân cân đối AVL đã xây dựng sau đó hiện lên màn hình hình ảnh cây có khóa vừa được chèn thêm vào.
2.2 PHÂN TÍCH BÀI TOÁN
2.2.1 Phân tích về yêu cầu giải thuật :
Bài toán yêu cầu xây dựng mô phỏng một cây cân bằng AVL để người dùng có thể hình dung một cách trực quan về cây cân bằng AVL thông qua các Node của cây.Bài toán yêu cầu :
- Khởi tạo cân cân bằng AVL ban đầu..- Tìm kiếm xem một Node do người dùng nhập vào có nằm trên. Cậy
hay không, nếu có thì hiện nó lên, nếu không có thì đưa ra cảnh báo.- Thêm một Node mới vào cây và xắp xếp lại để cây vẫn cân bằng.- Loại bỏ một Node khỏi cây và xắp xếp lại để cây vẫn cân bằng.- Sau khi loại bỏ một Node của cây, phải hiện lên được sự thay đổi trên
cây mới so với cây ban đầu.
2.2.2 Phân tích về yêu cầu giao diện :
a) Đầu vào dữ liệu
Khởi tạo số liệu ban đầu
Trang 30
Project 1 Nhóm ĐT1 – K50
Hình 2.3 Mô phỏng khởi tạo số lượng Node ban đầu
Đầu tiên người dùng sẽ nhập số lượng Node cần tạo, sau đó sẽ nhập giá trị cho từng Node.Sau khi nhập xong, Click vào chức năng tạo cây để thực hiện quá trình tạo cây cân bằng AVL
b) Chức năng điều khiểu
Hình 2.4 Mô phỏng các chức năng điều khiển chương trình
Chức năng Tạo cây sẽ thự hiện việc xóa trằng sơ đồ cậy trên màn hình và hiện lên chức năng tạo cây mới .
Chức năng Thêm node sẽ hiện lên một điều khiển cho phép người dùng nhập thêm một Node và giá trị của Node đó, sau đó chương trình sẽ tự tính giá trị của Node mới và vẽ lên một cây AVL mới trên cơ sở cây AVL ban đầu đã được thêm Node mới.
Chức năng Xóa node sẽ hiện lên một điều khiển cho phép người dùng nhập giá trị của Node muỗn xóa, sau đó chương trình sẽ tự tính giá trị của Node bị xóa và vẽ lên một cây AVL mới trên cơ sở cây AVL ban đầu đã được xóa Node.
Trang 31
Project 1 Nhóm ĐT1 – K50
Chức năng Xóa tất cả sẽ thực hiện việc xóa trắng toàn bộ sơ đồ cây vừa được vẽ và toàn bộ dữ liệu trong chương trình.
Chức năng Tìm node sẽ hiện lên một điều khiển cho phép người dùng nhập giá trị của Node muốn tìm kiếm, sau đó chương trình sẽ tự tìm giá trị của Node đó trên cây và hiện lên thông báo kết quả tìm kiếm được.
Chức năng Max node : chương trình sẽ tự động tìm kiếm giá trị lớn nhất có trong các Node và hiện kết quả tìm được trên cây.
Chức năng Min node : chương trình sẽ tự động tìm kiếm giá trị lớn nhất có trong các Node và hiện kết quả tìm được trên cây
Chức năng Max node : chương trình sẽ tự động tìm kiếm giá trị nhỏ nhất có trong các Node và hiện kết quả tìm được trên cây.
Chức năng About sẽ hiện lên thông báo về thông tin của chương trình và nhóm phát triển.
Chức năng Help sẽ hiện lên file hướng dẫn sử dụng chương trình.
c) Đầu ra của chương trình
Hình 2.5 Mô phỏng kêt quả đầu ra của cây AVL Mục Node nhập : là danh sách các Node theo đúng chình tự nhận
vào. Mục Xắp xếp : sẽ hiện lên danh sách giá trí các Node xắp xếp theo
thứ tự tăng dần. Mục Đường dẫn : là sanh sách duyệt và xắp xếp các Node để cây
vẽ lên là cây AVL cân bằng.
Trang 32
Project 1 Nhóm ĐT1 – K50
Hình 2.6 Mô phỏng kêt quả của chương trình chạy
2.2.3 Lựa chọn công nghệ :
Dựa trên yêu cầu bài toán, chúng em lựa chọn công cụ phát triển là Visual C# và Visual C++Với Visual C++ :
Các chức năng của Visual C++ như tô sáng cú pháp, IntelliSense (chức năng về tự động hoàn thành việc viết mã) và các chức năng gỡ lỗi tiên tiến. Nó cho phép gỡ lỗi từ xa sử dụng một máy tính khác và cho phép gỡ lỗi bằng cách duyệt qua từng dòng lệnh tại một thời điểm. Chức năng "biên tập và tiếp tục" cho phép thay đổi mã nguồn và dịch lại chương trình trong quá trình gỡ lỗi, mà không cần phải khởi động lại chương trình đang được gỡ lỗi.
Đặc trưng biên dịch và xây dựng hệ thống, tính năng tiền biên dịch các tập tin đầu đề (header files) và liên kết tịnh tiến (incremental link) - chỉ liên kết những phần bị thay đổi trong quá trình xây dựng phần mềm mà không làm lại từ đầu. Những đặc trưng về tính năng này thuyên giảm tổng thời gian biên tập, biên dịch và liên kết chương trình phần mềm, đặc biệt đối với những đề án phần mềm lớn.
C#, theo một hướng nào đó, là ngôn ngữ lập trình phản ánh trực tiếp nhất đến .NET Framework mà tất cả các chương trình .NET chạy, và nó phụ thuộc mạnh mẽ vào Framework này. Mọi dữ liệu cơ sở đều là đối tượng, được cấp phát và hủy bỏ bởi trình dọn rác Garbage-Collector (GC), và nhiều kiểu trừu tượng khác chẳng hạn như class, delegate, interface, exception, v.v, phản ánh rõ ràng những đặc trưng của .NET runtime.So sánh với C và C++, ngôn ngữ này bị giới hạn và được nâng cao ở một vài đặc điểm nào đó, nhưng không bao gồm các giới hạn sau đây:
o Các con trỏ chỉ có thể được sử dụng trong chế độ không an
toàn. Hầu hết các đối tượng được tham chiếu an toàn, và các phép tính đều được kiểm tra tràn bộ đệm. Các con trỏ chỉ được sử dụng để gọi các loại kiểu giá trị; còn những đối tượng thuộc bộ thu rác (garbage-collector) thì chỉ được gọi bằng cách tham chiếu.
o Các đối tượng không thể được giải phóng tường minh.o Chỉ có đơn kế thừa, nhưng có thể cài đặt nhiều interface trừu
tượng (abstract interfaces). Chức năng này làm đơn giản hóa sự thực thi của thời gian thực thi.
o C# thì an-toàn-kiểu (typesafe) hơn C++.o Cú pháp khai báo mảng khác nhau("int[] a = new int[5]" thay
vì "int a[5]").o Kiểu thứ tự được thay thế bằng tên miền không gian
(namespace).o C# không có tiêu bản.o Có thêm Properties, các phương pháp có thể gọi các Properties
để truy cập dữ liệu.o Có reflection.
Dựa trên việc phân tích và nhận định về tính ưu điểm và nhược điểm của từng ngôn ngữ chúng em chọn công cụ phát triển làVisual C# 2008
2.3 THIẾT KẾ
2.3.1 Thiết kế về giải thuật :
Trang 34
Project 1 Nhóm ĐT1 – K50
Hình 2.7 Sơ đồ giải thuậtCác thao tác với cây:
Xây dựng cây Thêm Node mới vào cây Xóa Node của cây Duyệt cây tìm Node Xóa cây
a) Thêm Node mới vào cây :
Trang 35
Project 1 Nhóm ĐT1 – K50
Hình 2.8 Sơ đồ thêm Node mới vào câyDiển giải sơ đồ :Đầu tiên, giá trị của Node mới được đưa vào chương trình.
Kiểm tra xem Node mới đã tồn tại ở trên cây chưa, nếu có rồi thì thoát khởi chương trình.
Nếu Node mới này có giá trị bằng đúng giá trị của Node gốc thì Node mới này sẽ không được thêm vào danh sách các Node của cây.
Nếu giá trị của Node mới không có trong danh sách của cây thì chương trình sẽ kiểm tra xem Node mới này sẽ được đưa vào bên phái hay bên trái của cây.
o Nếu giá trị của Node mới lớn hơn giá trị gốc của cây thì
chương trình sẽ đưa Node đó sang bên phải (cây con bên phải).
o Ngược lại thì Node đó sẽ được đưa sang bên trái của cây (cây
con bên trái).o Đối với các cây con bên phải hay bên trái thì quá trình kiểm
tra cũng giống như trên.
Trang 36
Project 1 Nhóm ĐT1 – K50
o Nêu cây con bên phải hay bên trái là trống thì Node mới sẽ
được thêm đúng vào vị trí đó.
Hình 2.9 Ví dụ thêm Node mới vào cây – trước khi thêm
Hình 2.10 Sau khi thêm Node mới
b) Xóa Node của cây :
Trang 37
Project 1 Nhóm ĐT1 – K50
Hình 2.11 Sơ đồ xóa Node khỏi cây
Diển giải sơ đồ :Đầu tiên, giá trị của Node cần xóa được đưa vào chương trình
Nếu Node muốn xóa không có trên cây thì thoát Nếu Node cần xóa này có giá trị bằng đúng giá trị của Node gốc thì
chương trình sẽ xóa Node đó ra khởi danh sách các Node của cây. Nếu giá trị của Node xóa lớn hơn giá trị gốc của cây thì chương
trình sẽ tìm kiếm và xóa Node ở cây con bên phải. Ngược lại sẽ tìm kiếm và xóa Node ở cây con bên trái. Đối với các cây con bên phải hay bên trái thì quá trình kiểm tra cũng
giống như trên.
Trang 38
Project 1 Nhóm ĐT1 – K50
Hình 2.12 Ví dụ về xóa Node 65 của cây AVL – trước khi xóa
Hình 2.13 Sau khi xóa Node
c) Duyệt cây tìm Node :
Trang 39
Project 1 Nhóm ĐT1 – K50
Hình 2.14 Sơ đồ tìm Node trên câyDiển giải sơ đồ :Đầu tiên, giá trị của Node muốn tìm được đưa vào chương trình
Nếu Node muốn tìm không có trên cây thì thoát Nếu Node muốn tìm này có giá trị bằng đúng giá trị của Node gốc
thì chương trình sẽ in ra Node đó. Nếu giá trị của Node muốn tìm lớn hơn giá trị gốc của cây thì
chương trình sẽ tìm kiếm ở cây con bên phải. Ngược lại sẽ tìm kiếm ở cây con bên trái. Đối với các cây con bên phải hay bên trái thì quá trình kiểm tra cũng
giống như trên.
Trang 40
Project 1 Nhóm ĐT1 – K50
Hình 2.15 Ví dụ về duyệt cây tìm Node
d) Xây dựng cây :
Hình 2.16 Sơ đồ xây dựng cây
Diển giải sơ đồ :Ở đây ta dùng thuật toán đệ quy với tham số đầu vào là TreeRoot và Key
Nếu TreeRoot = NULL thì thuật toán sẽ kết thúc. Ngược lại, ta sẽ so sánh Key với TreeRoot.Key để xem xét việc
duyệt cây bên phải hay bên trái của Node có giá trị là Key
Trang 41
Project 1 Nhóm ĐT1 – K50
Sau mỗi bược quay phải hay quay trái ta lưu lại vết thực hiện bằng cách dùng biến NodePath để lưu
Như vậy, sau mỗi bước đệ quy ta có được dánh sách các Node ngọn tận cùng của cây.
Hình 2.7 Ví dụ về thứ tự quay để xây dựng lên cây AVL
Ở ví dụ trên ta thấy Node có giá trị là 23 là Node gốc, theo thứ tự trình duyệt quay phải (“>”) hay quay trái (“<”) mà ta có thể vẽ lên được cây AVL một cách dễ dàng.
e) Xóa cây :
Hình 2.18 Sơ đồ xóa câyDiển giải sơ đồ :Duyệt danh sách tất cả các Node của cây, qua mỗi Node thực hiện chức năng xóa Node cho đến khi hết Node trong dang sách thì thoát.
Trang 42
Project 1 Nhóm ĐT1 – K50
2.3.2 Thiết kế về giao diện :
a) Sơ đồ chức năng :
Hình 2.19 Sơ đồ chức năng
Giải thích sơ đồ chức năng: Chức năng Khởi tạo cây :
o Nhập số lượng Node : nhập số lượng Node của cây cần khởi
tạo.o Nhấp giá trị cho từng Node : sau khi khởi tao số lượng Node
cần nhập, chương trình sẽ duyệt qua từng Node và người dùng sẽ nhập giá trị cho từng Node đó.
o Tạo cây : sau khi đa hoàt tất hai bước trên, chuắng năng này sẽ
thực hiện việc đưa toàn bộ danh sách các Node vào chương trình và xắp xếp chúng theo một trật tự nhất định rồi căn cú vào đó để vẽ cậy AVL
Chức năng Điều khiểno Thêm Node mới : sau khi cây AVL được vẽ, người dùng có
nhu cầu thêm Node mới vào cây, chức năng này sẽ hiện lên một điều khiển cho phép nhập thêm Node mới. Giá trị của Node mới sẽ được bổ xung vào dữ liệu của chương trình và cây AVL sẽ được tính toán và vẽ lại cho hợp lý.
o Tìm kiếm Node : khi cây AVL được vẽ rồi, để kiểm tra một
Node nào đó có thuộc cậy hay không hoặc tìm kiếm vị trí của một Node nào đó, người dùng sẽ phải chọn chức năng này. Chức năng này sẽ hiện lên một điều khiển cho phép người
Trang 43
Project 1 Nhóm ĐT1 – K50
dùng nhập giá trị của Node muốn tìm sau đó nó sẽ hiển thị kế quả tìm kiếm cũng như vị trí của Node tìm được.
o Xóa Node : sau khi cây AVL được vẽ, nếu người dùng muốn
xóa một Node nào đó, chức năng này sẽ hiệu lên một điều khiển để người dùng nhập giá trị của Node muốn xóa. Sauk hi xóa xong nó sẽ tính toán lại toàn bộ dữ liệu của chương trình và vẽ lại cậy AVL.
o Max/Min Node : tìm kiếm giá trị cùng vị trí của Node có giá trị
lớn nhất hoặc nhỏ nhất.o Xóa cây : chức năng này sẽ xóa toàn bộ dữ liệu trong chương
trình cũng như toàn bộ cây AVL đã được vẽ . Chức năng Help :
o AVL Help : chứa thông tin về hướng dẫn sử dụng chương trìnho About : chứa thông tin về nhóm phát triển
b) Giao diện của chương trình :
Hình 2.20 Giao diện chính của chương trình
o Vùng 1: chứa tiêu đề của chương trình.o Vùng 2: vẽ cây cân bằng AVL.o Vùng 3 : khu vực điều khiển chương trình, khu vực này gồm có các
nút điều khiển các chức năng của chương trình.
Trang 44
Project 1 Nhóm ĐT1 – K50
o Vùng 4 : danh sách các Node và thứ tự duyệt cây.
2.4 HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG
2.4.1 Yêu cầu cài đặt
Yêu cầu về phần cứng : Máy vi tính : P4 2.2 GHz, RAM 512, độ phân giải 1152 x
864 Yêu cầu về phần mềm :
Hệ điều hành: Windows XP. Windows Vista Framework 3.5 VisualBasicPowerPacks3
2.4.2 Từng bước cài đặt, hướng dẫn sử dụng
a) Từng bước cài đặt :
Cài dặt Frameword 3.5 :(nếu chưa có bạn có thể vào www.microsoft.com để download về)
Hình 2.21 Cài đặt Framework 3.5Hướng dẫn cài đặt được chương trình hướng dẫn chi tiết, bạn chỉ việc đọc và làm theo. VisualBasicPowerPacks3
Sử dụng chương trình :Khi bắt đầu chạy chương trình, toàn bộ màn hình sẽ là mâu trắng và chỉ có một nút điều khiểu Tạo cây là nổi lên để người dùng bắt đầu nhập dữ liệu.
Hình 2.26 Bắt đầu chương trình
o Khi người dùng Click vào nút Tạo cậy thì một chức nằng điều khiển
sẽ hiều ra để người dùng nhập số liệu
Trang 48
Project 1 Nhóm ĐT1 – K50
Hình 2.27 Khởi tạo số liệu Node ban đầu
Trong mục nhập số lương Node, người dùng chỉ được nhập số lượng Node không quá 31. Nếu giá trị nhập vào quá 31 hoặc không phải là số nguyên thì một thông báo sẽ hiện lên yêu cầu người dùng nhập lại.
Hình 2.28 Nhập số lượng Node
Hình 2.29 Thông báo nhập sai dữ liệu
Sau khi người dùng nhập số lượng Node, nếu muốn nhập lại chỉ cần Click vào nút Nhập lại.Sau khi nhập số lượng Node, người dùng sẽ nhập giá trị cho từng Node đó.
Trang 49
Project 1 Nhóm ĐT1 – K50
Hình 2.30 Nhập giá trị cho từng Node
Giá trị của các Node chỉ năng trong khoảng từ 0 đến 999, nếu nằm ngoài khoảng này hoặc ký tự nhập vào không phải là số nguyên thì có một cảnh bảo hiện lên
Hình 2.31 Thông báo nhập sai dữ liệu
Hoặc nếu giá trị của Node đã có trong danh sách mà người dùng vẫn cố nhập vào thì cũng có một cảnh báo hiện lên
Hình 2.32 Thông báo nhập sai dữ liệu
Nếu giá trị của các Node nhập chưa hết mà người dùng đã Click vào nut Tạo cậy thì một cảnh báo sẽ hiện lên yêu cầu người dùng nhải nhập đủ.
Trang 50
Project 1 Nhóm ĐT1 – K50
Hình 2.33 Thông báo nhập chư đủ dữ liệu
Sau khi đã nhập đủ dữ liệu, người dùng Click vào nút Tạo cây để chương trình sẽ thực hiện việc vẽ cậy cân bằng AVL, hoặc nếu không người dùng có thể Click vào nút Bỏ qua để bỏ qua việc vẽ cây.
o Thêm Node :
Hình 2.34 Thêm Node mới
Giá trị của Node mới nằm trong khoảng từ 0 đến 999, sau khi nhập xong người dùng Click vào nút Thêm nút thì Node mới sẽ được thêm vào, chương trình sẽ tự động tính toán lại để vẽ cây AVL mới.Nếu không muốn thêm Node mới, người dùng Click vào Node Thoát
o Xóa Node :
Trang 51
Project 1 Nhóm ĐT1 – K50
Hình 2.35 Xóa Node mớiNhập giá trị của Node cần xóa, sau khi nhập xong người dùng Click vào nút Xóa nút thì chương trình sẽ tự động xóa Node đó và sẽ tự động tính toán lại để vẽ cây AVL mới.Nếu không muốn xóa Node, người dùng Click vào Node Thoát.
o Xóa tất cả : khi Click vào xóa tất cả chuwong trình sẽ hỏi bạn xem
có muốn xóa không
Hình 2.36 Xóa tất cảNếu muốn xóa, người dùng Click vào nút Xóa tất cả thì chương trình sẽ xóa toàn bộ dữ liệu và cả cây AVL trên màn hình.Nếu không muốn xóa, người dùng Click vào Node Thoát.
o Tìm Node :
Hình 2.37 Tìm NodeNhập giá trị của Node cần tìm, sau khi nhập xong người dùng Click vào nút Tìm kiếm thì chương trình sẽ tự động tìm kiếm Node đó và hiện kết quả tìm kiếm trên cây.Nếu không muốn tìm kiếm Node, người dùng Click vào Node Thoát.
o Max/Min Node : khi người dùng Click vào nut này, chức năng tìm
kiếm giá trị lớn nhất và nhỏ nhất của tất cả các Node sẽ tự động tìm kiếm và hiện kết quả tìm kiếm trên cây.
Trang 52
Project 1 Nhóm ĐT1 – K50
o About : chức năng này sẽ hiện lên thông tin về chương trình và
nhóm phát triển.o Help: chức năng này sẽ hiện lên thông tin hướng dẫn sử dụng
chương trình.o Exit : chức năng này sẽ thoat khỏi chương trình.
2.5 KẾT LUẬN
a) Ưu điểm :
Giao diện trực quan, thiết kế giao diện nhanh nhờ các công cụ kéo thả có sẵn.
Mã chương trình được viết bằng C# lên rõ ràng, dễ hiểu. Sử dụng công cụ hõ trợ là VisualBasicPowerPacks để vẽ các
Control nhanh chóng.
b) Nhược điểm :
Do chương trình được viết trên nền C# lên còn phụ thuộc vào nền phát triển và Framework.
Chưa tự lập trình các Conttrol mà phải phụ thuộc vào công cụ bên ngoài.
Số lượng Node trên cây còn hạn chế ở mức 31 Node Chuqa mở rộng được vùng giá trị của Node, mới chỉ nằm trong
khoảng từ 0 đến 999
c) Hướng phát triển :
Qua đây, chúng em học hỏi thêm được nhiều điền về cách duyệt cây, xắp xếp, tổ chức lưu trữ dữ liệu cây.Dựa trên cách thức tạo đối tượng, xắp xếp và tìm kiếm thì chúng em có thể viết thuật toán duyệt cây Đỏ - Đen, cây 1 - 2 – 3.
2.6 PHỤ LỤC
2.6.1 Tạo đối tượng TreeNode
public class treeNode{
public int Key;public string data;public treeNode leftChild; //cây con tráipublic treeNode rightChild; //cây con phảipublic AVLTree.balanceFactor BF;public int ParentKey;public int LChildK;
{ bool returnValue; bool returnValue_1 = false; treeNode child; // Ready to do the insertion if (parent == null) { parent = insertedNode; parent.BF = balanceFactor.equalHeight; taller = true; returnValue = true; //If NotRecursed Then // NodePath = " " //End If return returnValue; }
// Di chuyển tới cây con trái và chèn TreeNode vào đó if (insertedNode.Key < parent.Key) { child = parent.leftChild; returnValue_1 = insertNode(ref child, ref insertedNode, ref taller); parent.leftChild = child; if (!(taller)) { returnValue = returnValue_1; return returnValue; }
switch (parent.BF) { case balanceFactor.leftTall: rebalanceLeftSubtreeTaller(ref parent); taller = false; break; case balanceFactor.rightTall: parent.BF = balanceFactor.equalHeight; taller = false; break; case balanceFactor.equalHeight:
// Di chuyển tới cây con phải và chèn TreeNode vào đó } else if (insertedNode.Key > parent.Key) { child = parent.rightChild; returnValue_1 = insertNode(ref child, ref insertedNode, ref taller); parent.rightChild = child; if (!(taller)) { returnValue = returnValue_1; return returnValue; }
switch (parent.BF) { case balanceFactor.rightTall: rebalanceRightSubtreeTaller(ref parent); taller = false; break; case balanceFactor.leftTall: parent.BF = balanceFactor.equalHeight; taller = false; break; case balanceFactor.equalHeight: parent.BF = balanceFactor.rightTall; break; } //Is > parent.key } // hai Node cung giá trị thì không được chèn vào else if (insertedNode.Key == parent.Key) { returnValue_1 = false; }
public bool findKey(ref int Key) { bool returnValue; bool Found = false; findKeyPrivate(root, ref Key, ref Found); returnValue = Found; return returnValue; }
private bool findKeyPrivate(treeNode root, ref int Key, ref bool Found) { if (root == null) { return false; } if (Key > root.Key) //nếu giá trị cần tìm lớn hơn giá trị gốc thì tìm bên phải { findKeyPrivate(root.rightChild, ref Key, ref Found); } else if (Key < root.Key) //ngược lại thì tìm bên trái { findKeyPrivate(root.leftChild, ref Key, ref Found); } else if (Key == root.Key) //nếu giá trị cần tìm là chính Node gốc thì OK { Found = true; }
Trang 60
Project 1 Nhóm ĐT1 – K50
return false; }
2.6.6 Tìm Node có giá trị lớn nhất :
public int findMaxKey() { int returnValue; MaxKey = 0; MaxHeight = 0; findMaxKeyPrivate(root); returnValue = MaxKey; return returnValue; }
2.6.8 Tạo đối tượng Nodepublic partial class rect : UserControl { public rect() { InitializeComponent(); // giao diện } public void setText(string text) { this.value.Text = text; //gán giá trị cho Node } public string getText() { return this.value.Text; //lay giá trị của Node } public void SetColor() //màu của Node khi được tìm thấy { this.ovalShape1.FillColor = Color.Red; this.value.BackColor = Color.Red; } public void SetColor2() { this.ovalShape1.FillColor = Color.Wheat; this.value.BackColor = Color.Wheat; } public void SetColorSearch() //mầu của Node khi NodePath { this.ovalShape1.FillColor = Color.GreenYellow;
Trang 62
Project 1 Nhóm ĐT1 – K50
this.value.BackColor = Color.GreenYellow; } public void BColor() //mầu nền của Node { this.ovalShape1.FillColor = Color.LightSkyBlue; this.value.BackColor = Color.LightSkyBlue; } public void AddColor() //màu của Node được thêm mới { this.ovalShape1.FillColor = Color.LightSalmon; this.value.BackColor = Color.LightSalmon; } }
2.6.9 Thủ tục tạo cây mới :private void butCreateNew_Click(object sender, EventArgs e)
{ frmContructor frm = new frmContructor(); frm.ShowDialog(); if (frm.DialogResult == DialogResult.OK) { // ve lai cay DataTable tbl = new DataTable(); tbl = clsAc.ReturnData("tblValue1"); list1.Items.Clear(); list2.Items.Clear(); list3.Items.Clear(); this.lstSortInsert.Items.Clear(); this.lstNodePath.Items.Clear(); this.lstInsert.Items.Clear(); this.listBox1.Items.Clear(); test.deleteAll(); foreach (DataRow row in tbl.Rows) { test.add(Convert.ToInt32(row["Value"]),
2.6.10 Lưu sơ đồ của cây trước và sau khi thêm hoặc xóa Node
Để thực hiện được việc lưu sơ đồ của cây trức và sau khi xóa Node ta chỉ cần lưu Node nào, giá trị của Node đó là bao nhiêu. Ở đây ta dùng đến cơ sở dữ liệu Microsoft Access để lưu các thông tin đó của cây.
//thủ tục đảm nhiệm Insert dữ liệu vào một bảngpublic void Insert(String field, String table, String value) { DeleteAll(table); if (conn.State == ConnectionState.Closed) { conn.Open(); } SQL = "INSERT INTO " + table + "(" + field + ")" + " VALUES('"
+ value + "')"; comm = new OleDbCommand(SQL, conn); comm.ExecuteNonQuery(); conn.Close(); }private void butYes_Click(object sender, EventArgs e) { if (Count == 0) //nếu danh sách không có Node nào { frmErrorAdd frm = new frmErrorAdd(); frm.ShowDialog(); // thông báo lỗi return; //yêu cầu nhập lại }
//nếu danh sách Node chưa bằng số lượng Node khởi tạo
Trang 64
Project 1 Nhóm ĐT1 – K50
if (Convert.ToInt32(this.lblCount.Text) != Count) { frmErrorAdd3 frm = new frmErrorAdd3(); frm.ShowDialog(); //thông báo lỗi return; //yêu cầu nhập thêm } int i = -1;
//số lượng Node clsAc.Insert("Node", "tblNode", Convert.ToString(Count));
// đưa toàn bộ danh sách Node vào DataBase for (i = 0; i <= this.listValue.Items.Count - 1; i++) { this.listValue.SelectedIndex = i; clsAc.Insert1("[Value]", "tblValue1",
http://www.codeproject.com/http://www.freevbcode.com/Wrox Press - Professional C#, 3rd EditionApress Expert C Sharp 2005 Business Objects 2nd Edition Mar 2006