Top Banner
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
79

Bao cao Project JKFF - AVL

Jun 13, 2015

Download

Documents

api-19708920
Welcome message from author
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
Page 1: Bao cao Project JKFF - AVL

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

Page 2: Bao cao Project JKFF - AVL

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

Page 3: Bao cao Project JKFF - AVL

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

Page 4: Bao cao Project JKFF - AVL

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

Page 5: Bao cao Project JKFF - AVL

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

Page 6: Bao cao Project JKFF - AVL

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

Page 7: Bao cao Project JKFF - AVL

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

Trang 7

Page 8: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

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

Page 9: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

Hình 1.10 Sơ đồ giải thuật

Trang 9

Page 10: Bao cao Project JKFF - AVL

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

Page 11: Bao cao Project JKFF - AVL

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

Page 12: Bao cao Project JKFF - AVL

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

Page 13: Bao cao Project JKFF - AVL

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ình 1.13 Cài đặt Framework 3.5

Trang 13

Page 14: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

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

Page 15: Bao cao Project JKFF - AVL

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

Page 16: Bao cao Project JKFF - AVL

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

Page 17: Bao cao Project JKFF - AVL

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

Page 18: Bao cao Project JKFF - AVL

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

Page 19: Bao cao Project JKFF - AVL

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

Page 20: Bao cao Project JKFF - AVL

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);

}private void textBox_Validated(object sender, System.EventArgs e)

Trang 20

Page 21: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

{if (Text.Trim().Length == 0){

Text = "";}

}public void LoadTime(){

Text = "0";}protected override void

OnKeyPress(System.Windows.Forms.KeyPressEventArgs e){

// chỉ cho phép nhập 10 ký tự 0 hoặc 1if (char.IsDigit(e.KeyChar)) //nếu là chữ số thì {

if (int.Parse(e.KeyChar.ToString())== 0 || int.Parse(e.KeyChar.ToString())== 1) //nếu chữa số nhập và là 0 hoặc 1

{if (this.Text.Length> 10) // nếu độ dài lớp hơn 10{

e.KeyChar = null; // hủy ký tự nhập vào}

}Else //nếu ký tự nhập vào không phải là 0 hoặc 1 thì{

if (this.Text.Length== 10) // nếu độ dài là 10{

e.KeyChar = null; // hủy ký tự nhập vào}Else // đưa ra cảnh báo và hủy ký tự nhập vào{

frm.ShowDialog(); //thông báo lỗie.KeyChar = null;

}}

}else{

if (this.Text.Length== 9){

Trang 21

Page 22: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

e.KeyChar = null;}

}base.OnKeyPress(e);

}}

1.6.4 Xây dựng Control kế thừa tự TextBox cho phép nhập số từ 0 đến 99

public class txtNumb{

public class txtNumb_Renamed : TextBox{

public txtNumb{

this.Text = "";this.MaxLength = 3;this.TextAlign = HorizontalAlignment.Left;Validated += new

System.EventHandler(textBox_Validated);}private void textBox_Validated(object sender,

System.EventArgs e){

if (Text.Trim().Length == 0){

Text = "";}

}public void LoadTime(){

Text = "0";}protected override void

OnKeyPress(System.Windows.Forms.KeyPressEventArgs e){

if (char.IsDigit(e.KeyChar)){

if (this.Text.Length>= 2){

frm.ShowDialog();e.KeyChar = null;

Trang 22

Page 23: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

}}else{

if (e.KeyChar == '\r') // neu la Enter{

// Me.Text = ""e.KeyChar = null;

}else{

if (e.KeyChar == '\b'){

//neu la Back}else{

frm1.ShowDialog();e.KeyChar = null;

}}

}base.OnKeyPress(e);

}}

}

1.6.5 Module nhận tín hiệu đầu vào và hiển thị lên đồ thị

private void InputJK(){this.timer1.Interval = Convert.ToInt32(this.txtDelay.Text);

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

Page 24: Bao cao Project JKFF - AVL

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);

this.ChartK.ChartGroups[0].ChartData.SeriesList[0].X.Add(x - 1); this.ChartK.ChartGroups[0].ChartData.SeriesList[0].Y.Add(y); }

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

Page 25: Bao cao Project JKFF - AVL

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); //=================== }

Trang 25

Page 26: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

1.6.7 Module là thực hiện Reset chương trình

private void ClearGraph() { this.ChartJ.ChartGroups[0].ChartData.SeriesList[0].X.Clear(); this.ChartJ.ChartGroups[0].ChartData.SeriesList[0].Y.Clear();

this.ChartK.ChartGroups[0].ChartData.SeriesList[0].X.Clear(); this.ChartK.ChartGroups[0].ChartData.SeriesList[0].Y.Clear();

this.ChartQ1.ChartGroups[0].ChartData.SeriesList[0].X.Clear(); this.ChartQ1.ChartGroups[0].ChartData.SeriesList[0].Y.Clear();

this.ChartQ2.ChartGroups[0].ChartData.SeriesList[0].X.Clear(); this.ChartQ2.ChartGroups[0].ChartData.SeriesList[0].Y.Clear(); this.ChartJ.ChartGroups[0].ChartData.SeriesList[0].X.Add(0); this.ChartJ.ChartGroups[0].ChartData.SeriesList[0].Y.Add(0); this.ChartK.ChartGroups[0].ChartData.SeriesList[0].X.Add(0); this.ChartK.ChartGroups[0].ChartData.SeriesList[0].Y.Add(0);

this.ChartQ1.ChartGroups[0].ChartData.SeriesList[0].X.Add(2); this.ChartQ1.ChartGroups[0].ChartData.SeriesList[0].Y.Add(0); this.ChartQ2.ChartGroups[0].ChartData.SeriesList[0].X.Add(2); this.ChartQ2.ChartGroups[0].ChartData.SeriesList[0].Y.Add(0); }

1.6.8 Module chạy chương trình

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

Page 27: Bao cao Project JKFF - AVL

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; } }

1.6.9 Module tạm dừng chương trình

private void Pause() { this.timer2.Enabled = false; this.timer1.Enabled = false; this.timer3.Enabled = false; this.butOK.Enabled = true; }

1.6.10 Module kích hoạt chương trình bắt đầu chạy

private void butOK_Click(object sender, EventArgs e) {

//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

Page 28: Bao cao Project JKFF - AVL

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

Page 29: Bao cao Project JKFF - AVL

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

Page 30: Bao cao Project JKFF - AVL

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

Page 31: Bao cao Project JKFF - AVL

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

Page 32: Bao cao Project JKFF - AVL

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

Page 33: Bao cao Project JKFF - AVL

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.

Trang 33

Page 34: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

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

2.3 THIẾT KẾ

2.3.1 Thiết kế về giải thuật :

Trang 34

Page 35: Bao cao Project JKFF - AVL

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

Page 36: Bao cao Project JKFF - AVL

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

Page 37: Bao cao Project JKFF - AVL

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

Page 38: Bao cao Project JKFF - AVL

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

Page 39: Bao cao Project JKFF - AVL

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

Page 40: Bao cao Project JKFF - AVL

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

Page 41: Bao cao Project JKFF - AVL

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

Page 42: Bao cao Project JKFF - AVL

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

Page 43: Bao cao Project JKFF - AVL

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

Page 44: Bao cao Project JKFF - AVL

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

Page 45: Bao cao Project JKFF - AVL

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

Trang 45

Page 46: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

Hình 2.22 Cài đặt VisualBasicPowerPacks3

b) Hướng dẫn sử dụng :

Cài đặt chương trình

Hình 2.23 Cài đặt chương trình bước 1

Trang 46

Page 47: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

Hình 2.24 Cài đặt chương trình bước 2

Hình 2.25 Cài đặt chương trình bước 2

Trang 47

Page 48: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

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

Page 49: Bao cao Project JKFF - AVL

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

Page 50: Bao cao Project JKFF - AVL

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

Page 51: Bao cao Project JKFF - AVL

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

Page 52: Bao cao Project JKFF - AVL

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

Page 53: Bao cao Project JKFF - AVL

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;

Trang 53

Page 54: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

public int RChildK;public int Height;

}

2.6.2 Chức năng thực hiện quay cây

public string showNodePath(ref int Key) { string returnValue; NodePath = ""; showNodePathPrivate(root, ref Key); returnValue = NodePath; return returnValue; }private void showNodePathPrivate(treeNode root, ref int Key) { if (root == null) { return; } if (Key > root.Key) { showNodePathPrivate((root.rightChild), ref Key); if (NodePath == "") { NodePath = root.Key.ToString(); } else { NodePath = root.Key + ">" + NodePath; //rẽ phải } } else if (Key < root.Key) { showNodePathPrivate((root.leftChild), ref Key); if (NodePath == "") { NodePath = root.Key.ToString(); } else { NodePath = root.Key + "<" + NodePath; //rẽ trái

Trang 54

Page 55: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

} } else if (Key == root.Key) { if (NodePath == "") { NodePath = root.Key.ToString(); } else { NodePath = NodePath + "=" + root.Key; } } }

2.6.3 Chức năng thêm Node mới vào cây :

public bool add(int Key, string data) { bool returnValue = false; NodePath = ""; MyHeight = 0;

NodeToBeInserted = new treeNode(); NodeToBeInserted.Key = Key; NodeToBeInserted.data = data; bool temp_bool = false; if (insertNode(ref root, ref NodeToBeInserted, ref temp_bool)) //, True) { returnValue = true; AddedNode = NodeToBeInserted; } else { AddedNode = null; } return returnValue; }

private bool insertNode(ref treeNode parent, ref treeNode insertedNode, ref bool taller)

Trang 55

Page 56: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

{ 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:

Trang 56

Page 57: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

parent.BF = balanceFactor.leftTall; break; } //Is < parent.key

// 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; }

returnValue = returnValue_1; return returnValue; }

Trang 57

Page 58: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

2.6.4 Chức năng thực hiện xóa Node

public bool delete(int Key) { bool returnValue; MyHeight = 0; NodePath = ""; bool temp_bool = false; returnValue = deleteNode(ref root, ref temp_bool, ref Key); return returnValue; }

private bool deleteNode(ref treeNode root, ref bool smaller, ref int Key) { bool returnValue; treeNode child; treeNode tempRoot;

// Key is not found – return false if (root == null) { smaller = false; returnValue = false; return returnValue; }

// Delete from the left subtree if (Key < root.Key) { child = root.leftChild; if (!(deleteNode(ref child, ref smaller, ref Key))) { returnValue = false; return returnValue; } root.leftChild = child; if (smaller) { rebalanceLeftSubtreeSmaller(ref root, ref smaller); }

Trang 58

Page 59: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

// Delete from the right subtree } else if (Key > root.Key) { child = root.rightChild; if (!(deleteNode(ref child, ref smaller, ref Key))) { returnValue = false; return returnValue; }

root.rightChild = child; if (smaller) { rebalanceRightSubtreeSmaller(ref root, ref smaller); }

// The treeNode is found, delete this treeNode } else if (Key == root.Key) { // None or one child if (root.leftChild == null) { root = root.rightChild; smaller = true; // One child } else if (root.rightChild == null) { root = root.leftChild; smaller = true; // Two children } else { child = root.leftChild; tempRoot = root; removeSearchTree(ref tempRoot, ref child, ref smaller); root.leftChild = child; if (smaller)

Trang 59

Page 60: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

{ rebalanceLeftSubtreeSmaller(ref root, ref smaller); } } } returnValue = true; return returnValue; }

2.6.5 Tìm kiếm Node trên đồ thị :

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

Page 61: Bao cao Project JKFF - AVL

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; }

private bool findMaxKeyPrivate(treeNode root) { if (root == null) { return false; } if (root.rightChild == null) { MaxKey = root.Key; return false; } MaxHeight++; findMaxKeyPrivate(root.rightChild); return false; }

2.6.7 Tìm Node có giá trị nhỏ nhất :

public int findMinKey() { int returnValue; MinKey = 0; MinHeight = 0; findMinKeyPrivate(root); returnValue = MinKey; return returnValue; }

Trang 61

Page 62: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

private bool findMinKeyPrivate(treeNode root) { if (root == null) { return false; } if (root.leftChild == null) { MinKey = root.Key; return false; } MinHeight++; findMinKeyPrivate(root.leftChild); return false; }

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

Page 63: Bao cao Project JKFF - AVL

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"]),

Convert.ToString(row["Value"])); lstInsert.Items.Add(Convert.ToString(row["Value"]));

this.listBox1.Items.Add(Convert.ToString(row["Value"])); test.listTree(ref this.lstSortInsert); test.listPath(ref this.lstNodePath); test.listPath(ref this.list3); this.label3.Text =

Convert.ToString(this.lstInsert.Items.Count); this.label4.Text =

Convert.ToString(this.lstSortInsert.Items.Count);

Trang 63

Page 64: Bao cao Project JKFF - AVL

Project 1 Nhóm ĐT1 – K50

} LoadTree(); clsAc.DeleteAll("tblrect2"); clsAc.DeleteAll("tblrect1"); SetStateItem(); this.lblActive.Text = "Tạo cây mới"; this.butAddNode.Enabled = true; this.butDeleteAll.Enabled = true; this.butDeleteNode.Enabled = true; this.butMaxNode.Enabled = true; this.butMinNode.Enabled = true; this.butSearchNode.Enabled = true; this.butCreateNew.Enabled = false; } }

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

Page 65: Bao cao Project JKFF - AVL

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));

clsAc.DeleteAll("tblvalue1"); clsAc.DeleteAll("tblvalue2");

// đư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",

Convert.ToString(this.listValue.SelectedItem)); clsAc.Insert1("[Value]", "tblValue2",

Convert.ToString(this.listValue.SelectedItem)); } this.DialogResult = DialogResult.OK; //OK this.Close();

}

TÀI LIỆU THAM KHẢO

http://www.codeproject.com/http://www.freevbcode.com/Wrox Press - Professional C#, 3rd EditionApress Expert C Sharp 2005 Business Objects 2nd Edition Mar 2006

Trang 65