Nội dung:
I. Giới thiệu . 3
1. Mục tiêu đồ án 3
2. Giới thiệu công cụ thực hiện đồ án: Visual Basic 6.0 3
3 Giới thiệu về Cơ sở dữ liệu 5
4. Lý thuyết các phép toán Đại số quan hệ 5
a.Phép giao .
b.Phép hợp .
c.Phép trừ
d.Phép chọn .
e.Phép kết nối .
II.Nội dung 10
1. Ý tưởng giải quyết thuật toán . 11
2. Sơ đồ khối 13
3. Thiết kế giao diện . 17
4. Viết Code . 18
5. Kiểm thử . 25
III. Kết quả đạt được . 26
4.1. Kết quả kiểm thử . 26
4.2. Danh sách lỗi tìm được .26
IV. Nhận xét, đánh giá và đề xuất .27
29 trang |
Chia sẻ: netpro | Lượt xem: 1739 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Đồ án Xây dựng chương trình mô phỏng các phép toán đại số quan hệ bằng VB 6.0, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nội dung:
Báo cáo đồ án cơ sở
Các từ viết tắt:
CSDL: Cơ sở dữ liệu
VB: Visual Basic.
I.Giới thiệu
1.Mục tiêu đồ án
Giới thiệu sơ lược về đồ án.
Xây dựng chương trình mô phỏng các phép toán đại số quan hệ: Phép hợp, phép giao, phép trừ, phép kết nối, phép chiếu.
Yêu cầu:
Tóm lược lý thuyết phần Đại số quan hệ
Trình bày ý tưởng thuật toán để giải quyết cho từng phép toán
Vẽ sơ đồ khối hoặc mã giả cho các thuật toán trên
Viết chương trình bằng ngôn ngữ VB
Nhập vào 02 quan hệ (lưu vào file text dạng ma trận)
Chọn 02 quan hệ và chọn phép toán để thực hiện
In kết quả ra màn hình (dạng bảng) và lưu kết quả xuống file
Mục tiêu:
-Tìm hiểu kĩ lý thuyết về CSDL ,các phép toán đại số quan hệ như phép giao, phép hợp, phép trừ…
-Tìm hiểu kĩ hơn về cách sử dụng ngôn ngử VB, sử dụng thành thạo ngôn ngữ VB cho việc lập trình.
-Rèn luyện kĩ năng làm việc độc lập
-
2.Giới thiệu công cụ thực hiện : Visual Basic 6.0
Dùng VB6 là cách nhanh và tốt nhất để lập trình cho Microsoft Windows. Cho dù ta là chuyên nghiệp hay mới mẻ đối với chương trình Windows, VB6 sẽ cung cấp cho ta một bộ công cụ hoàn chỉnh để đơn giản hóa việc triển khai lập trình ứng dụng cho MSWindows.
Visual Basic là gì?
Phần "Visual" đề cập đến phương phàp được sử dụng để tạo giao diện đồ họa người dùng (Graphical User Interface hay viết tắc là GUI) . Có sẵn những bộ phận hình ảnh, gọi là controls, ta tha hồ sắp đặt vị trí và quyết định các đặc tính của chúng trên một khung màn hình, gọi là form. Nếu ta đã từng sử dụng chương trình vẽ chẳng hạn như Paint, ta đã có sẵn các kỹ năng cần thiết để tạo một GUI cho VB6.
Phần "Basic" đề cập đến ngôn ngữ BASIC (Beginners All-Purpose Symbolic Instruction Code), một ngôn ngữ lập trình đơn giản, dễ học, được chế ra cho các khoa học gia (những người không có thì giờ để học lập trình điện toán) dùng.
Visual Basic đã được ra từ MSBasic, do Bill Gates viết từ thời dùng cho máy tính 8 bits 8080 hay Z80. Hiện nay nó chứa đến hàng trăm câu lệnh (commands), hàm (functions) và từ khóa (keywords). Rất nhiều commands, functions liên hệ trực tiếp đến MSWindows GUI. Những người mới bắt đầu có thể viết chương trình bằng cách học chỉ một vài commands, functions và keywords. Khả năng của ngôn ngữ này cho phép những người chuyên nghiệp hoàn thành bất kỳ điều gì nhờ sử dụng ngôn ngữ lập trình MSWindows nào khác.
Người mang lại phần "Visual" cho VB là ông Alan Cooper. Ông đã gói môi trường hoạt động của Basic trong một phạm vi dễ hiểu, dễ dùng, không cần phải chú ý đến sự tinh xảo của MSWindows, nhưng vẫn dùng các chức năng của MSWindows một cách hiệu quả. Do đó, nhiều người xem ông Alan Cooper là cha già của Visual Basic.
Visual Basic còn có hai dạng khác: Visual Basic for Application (VBA) và VBScript. VBA là ngôn ngữ nằm phía sau các chương trình Word, Excel, MSAccess, MSProject, .v.v.. còn gọi là Macros. Dùng VBA trong MSOffice, ta có thể làm tăng chức năng bằng cách tự động hóa các chương trình.VBScript được dùng cho Internet và chính Operating System.
Dù cho mục đích của bạn là tạo một tiện ích nhỏ cho riêng bạn, trong một nhóm làm việc của bạn, trong một công ty lớn, hay cần phân bố chương trình ứng dụng rộng rãi trên thế giới qua Internet, VB6 cũng sẽ có các công cụ lập trình mà bạn cần thiết.
Các ấn bản Visual Basic 6
Có ba ấn bản VB6: Learning, Professional và Enterprise. Chúng ta hãy gát qua ấn bản Learning. Bạn có thể dùng ấn bản Professional hay Enterprise.
Ấn bản Professional cung cấp đầy đủ những gì bạn cần để học và triển khai một chương trình VB6, nhất là các control ActiveX, những bộ phận lập trình tiền chế và rất hữu dụng cho các chương trình ứng dụng (application programs) của bạn trong tương lai. Ngoài đĩa compact chính cho VB6, tài liệu đính kèm gồm có sách Visual Studio Professional Features và hai đĩa CD Microsoft Developer Network (MSDN).
Ấn bản Enterprise là ấn bản Professional cộng thêm các công cụ Back Office chẳng hạn như SQL Server, Microsoft Transaction Server, Internet Information Server.
3.Giới thiệu về CSDL
Cơ sở dữ liệu (CSDL) là một hệ thống các thông tin có cấu trúc được lưu trữ trên các thiết bị băng từ, đĩa từ… để có thể làm thỏa mản yêu cầu khai thác đồng thời của nhiều người sữ dụng.
CSDL gắng liền với Đại số ,logic toán và một số vấn đề khác.
* Ưu điểm của cơ sở dữ liệu
-Giảm sự trùng lắp thông tin xuống mức thấp nhất và do đó bảo đảm
được tính nhất quán và toàn vẹn dữ liệu.
-Đảm bảo dữ liệu có thể truy xuất theo nhiều cách khác nhau.
-Khả năng chia sẻ thông tin cho nhiều người sử dụng
4.Lý thuyết các phép toán Đại số quan hệ
Các phép toán chia làm 2 nhóm:
Các phép toán tập hợp (hội, giao, trừ, …)
Các phép toán quan hệ (chiếu, chọn, kết nối, …)
( Trong phần này ta chỉ trình bày các phép toán tập hơp như Phép hợp, phép giao, phép trừ, phép kết nối, phép chiếu.)
Khả hợp: (Union compatibility)
Hai lược đồ quan hệ R(A1, A2, …, An) và S(B1, B2, …, Bn) là khả hợp nếu cùng bậc n (cùng số thuộc tính) và có DOM(Ai) = DOM(Bi), với 1£ i £ n.
VD:
SINHVIEN
HOSV
GIANGVIEN
HOGV
TENGV
Nguyen
Trang
Bui Hong
Minh
TENSV
Tran
An
Nguyen
Trang
Le Van
Phong
Cho 2 quan hệ R, S khả hợp:
a.Phép hợp (union)
Phép hợp của R và S, ký hiệu là R È S, là một quan hệ gồm các bộ thuộc R hoặc thuộc S, hoặc cả hai. Các bộ trùng lắp sẽ bị lược bớt và chỉ giữ lại 1 bộ đại diện.
Biểu diển: RÈS=(t/ t Є R hoặc tЄ S hoặc t Є R và S}
VD: R SINHVIEN
HOSV
S GIANGVIEN
HOGV
TENGV
Nguyen
Trang
Bui Hong
Minh
TENSV
Tran
An
Nguyen
Trang
Le Van
Phong
t = RÈS =( SINHVIEN È GIANGVIEN )
HOSV
TENSV
Tran
An
Le Van
Phong
Nguyen
Trang
Bui Hong
Minh
b.Phép giao(intersect)
Phép giao của R và S, ký hiệu là R Ç S, là một quan hệ gồm các bộ thuộc R đồng thời thuộc S.
Biểu diển: RÇS=(t/ t Є R và tЄ S }
t= RÇS SINHVIEN Ç GIANGVIEN
HOSV
TENSV
Nguyen
Trang
Ví dụ với 2 quan hệ ở trên , giao của chúng là:
c.Phép trừ (minus)
Phép trừ của R và S, ký hiệu R – S, là một quan hệ gồm các bộ thuộc R và không thuộc S.
Biểu diển: RÇS=(t/ t Є R và tЄ S }
Ví dụ với 2 quan hệ ở trên , giao của chúng là:
t= R-S= SINHVIEN - GIANGVIEN
HOSV
TENSV
Tran
An
Le Van
Phong
Bui Hong
Minh
Các tính chất:
Giao hoán: R È S = S È R, R Ç S = S Ç R
Kết hợp: R Ç (S Ç T) = (R Ç S) Ç T,
R È (S È T) = (R È S) È T
d. Phép chọn(selection)
Cho một quan hệ r với lược đồ quan hệ R(A1,A2,A3,..,An)
Phép chọn trên r là phép xác định một tập con các bộ các bộ quan hệ thỏa mãn 1 điều kiện cho trước
Tức là :
s()
(Phép chọn được hiểu: sF (r)={t Єr/F(t)=đúng})
s: ký hiệu phép chọn.
: chỉ quan hệ được chọn.
Kết quả thu được từ phép chọn là một quan hệ, có cùng danh sách thuộc tính được chỉ ra trong
Điều kiện chọn được hình thành từ các mệnh đề có dạng:
là tên thuộc tính của , phép so sánh thường là: =, ¹, >, ³, <, £.
Các mệnh đề có thể được nối lại nhờ vào các phép Ø, Ù, Ú
Phép chọn có tính giao hoán:
s(đk1)(s(đk2)R) = s(đk2)(s(đk1)R) = s(đk1 Ù đk2) R
VD: Tìm các nhân viên có mức lương trên 25.000 ở phòng 4 hoặc các nhân viên có mức lương trên 30.000 ở phòng 5.
s(PHG = 4 Ù LUONG > 25000) Ú (PHG = 5 Ù LUONG > 30000)(NHANVIEN)
e.Phép kết nối (join)
Phép kết nối, ký hiệu là |X|, dùng để tổ hợp 2 bộ có liên quan từ 2 quan hệ thành 1 bộ.
VD: Tìm tên các trưởng phòng ban:
TR_PHG ¬ PHONGBAN |x| TRHG = MANV NHANVIEN
KETQUA ¬ pTENPHG, HONV, TENNV(TR_PHG)
Dạng tổng quát của phép kết nối 2 lược đồ quan hệ R(A1, A2, …, An), và S(B1, B2, …, Bm) là:
R xS
Kết quả của phép kết nối là một lược đồ quan hệ Q có n+m thuộc tính.
Q(A1, A2, …, An, B1, B2, …, Bm)
Mỗi bộ của Q là một tổ hợp của 2 bộ trong R và S thoả mãn .
có dạng:
Ù Ù … Ù
mỗi có dạng Ai q Bi, với Ai là một thuộc tính của R, Bj là một thuộc tính của S, Ai và Bj có cùng miền và q là một trong những phép so sánh {=, ¹, >, ³, <, £}
Phép kết nối với điều kiện kết nối tổng quát gọi là q kết nối.
Các bộ có giá trị rỗng tại thuộc tính kết nối không xuất hiện trong kết quả của phép kết.
Nếu q là phép so sánh bằng (=), phép kết được gọi là phép kết bằng (equi-join).
Kết quả của phép kết nối bằng có 2 cột giống nhau à có cột thừa à nếu bỏ bớt cột thứ 2 thì thành phép kết tự nhiên, ký hiệu là dấu sao (*).
VD: DA_PHG ¬ DEAN * PHONG=MAPHG PHONGBAN
Cách viết gọn: DA_PHG ¬ DEAN * (PHONG, MAPHG) PHONGBAN
Tổng quát, phép kết nối tự nhiên có dạng:
Q ¬ R (, )*S
Trong đó, là các thuộc tính của R và là các thuộc tính của S. Chỉ có các thuộc tính tương ứng trong là được giữ lại trong kết quả.
Nếu và giống nhau về tên è bỏ luôn.
PHG_DD ¬ PHONGBAN * DIADIEM_PHG
II Nội dung
1/ Trình bày ý tưởng thuật toán giải quyết bài toán.
Để giải quyết bài toán ta thực hiện như sau”
-Nhập tên, số trường và dữ liệu cho các quan hệ
-Lưu dữ liệu vào file text
-Chọn 2 quan hệ cần tính toán
-Chọn phép toán thực hiện
-Thực hiện tính toán
-Hiển thị kết quả lên màn hình
Trong đó với các phép toán ta thực hiện như sau
1.Phép hợp (union)
-Load quan hệ 1 từ file vào A
-Kiểm tra sự trùng lặp của các hàng A
-Đưa vào kết quả
- Load quan hệ 2 từ file vào B
-So sánh ma trận B với ma trận A , nếu các hàng trong B không trùng lặp với kết quả thì ta đưa B vào kết quả.
-Lưu kết quả ra file text và hiển thị lên màn hình.
2.Phép giao (intersect)
-Load 2 quan hệ1 và 2 vào A và B
-Kiểm tra sự trùng lặp các hàng của A và B, nếu trùng thì ta sẽ đưa nó vào kết quả
-Lưu kết quả ra file text và hiển thị lên màn hình
3.Phép trừ (minus)
-Load 2 quan hệ 1 và 2 vào A và B
-So sánh các hàng của A với B, nếu không trùng thì ta sẽ đưa hàng đó vào kết quả
-Lưu kết quả ra file text và hiển thị lên màn hình
4.Phép chiếu (projection)
-Load quan hệ cần tính vào A
-Nhập các cột cần chiếu
-Đưa vào kết quả các cột của A tương ứng với các cột cần tính
-Loại bỏ các hàng trùng lặp trong kết quả
-Lưu kết quả ra file text và hiển thị lên màn hình
5.Phép kết nối (join)
-Load 2 quan hệ 1 và 2 vào A và B
-Nhập vào điều kiện cần kết nối
-Kiểm tra các hàng của A và B theo điều kiện cần kết nối
-Đưa vào kết quả các hàng thỏa mản với các hàng của B nối tiếp sau A
-Lưu kết quả ra file text và hiển thị lên màn hình
2/ Vẻ sơ đồ khối hoặc mả giả cho các thuật toán nói trên
Begin
a/Phép hợp
Sơ đồ khối
Gọi quan hệ 1
Ktra sự trùng lặp các hàng
Loại bỏ
Trùng lặp
Không trùng lặp
Lưu vào file kết quả
Gọi quan hệ 2
Kiểm tra sự trừng lặp bộ 2 với bộ kết quả
Loại bỏ
Trùng lặp
Không trùng lặp
Thêm vào File kết quả
Xuất ra màn hình File kết quả
End
Begin
b.Phép giao
Sơ đồ khối
Gọi 2 quan hệ
Kiểm tra các hàng trong mỗi quan hệ
Loại bỏ
Trùng lặp
Không trùng lặp
So sánh các hàng 2 quan hệ với nhau
Loại bỏ
Không trùng lặp
Lưu vào File kết quả
Trùng lặp
Xuất ra màn hình File kết quả
End
c.Phép trừ
Begin
Sơ đồ khối
Gọi quan hệ 1
Lưu vào File kết quả
Gọi quan hệ 2
So sánh các hàng của kết quả với quan hệ 2
Không trùng lặp
Trùng lặp
Loại bỏ hàng đó khỏi File kết quả
Xuất ra màn hình
End
Begin
d/Phép chiếu
Sơ đồ khối
Gọi quan hê
Nhập các trường cần chiếu
Lược bỏ các trường được chiếu trong quan hệ
Kiểm tra các hàng của các trường con lại
Loại bỏ
Trùng lặp
Không trùng lặp
Lưu vào File kết quả
Xuất ra màn hình File kết quả
End
e/Phép kết nối
Begin
Sơ đồ khối
Gọi 2 quan hệ
Nhập điều kiện
Kiểm tra điều kiện lần lượt từng hàng của qhệ 2 với qhệ1
Bỏ qua
Không thỏa mản
Thỏa mản
Hàng của kết quả = hàng quan hệ 1 nối tiếp hàng quan hệ 2
Lưu vào file kết quả
Xuất ra màn hình File kết quả
End
3/Thiết kế giao diện
a.Giao diện tổng quát
b.Giao diện khi chạy chương trình
4.Viết CODE cho chương trình
a.Việc nhập quan hệ và lưu xuống file Text
*Code cho nút lệnh Add:
Private Sub Command1_Click()
Dim i, filename, FileNumber, anItem
filename = App.Path 'chi duong dan hien tai
If Right(filename, 1) "\" Then filename = filename & "\"
'neu ben phai duong dan con co cac duong dan khac thi duong dan se duoc them dau \
filename = filename & Text1.Text & ".txt" 'tao file
If Dir(filename) "" Then 'duong dan da ton tai
Open filename For Append As #2 'ghi de len
Else
Open filename For Output As #2 'tao moi
End If
Print #2, Text2 & " " & Text3 & " " & Text4 & " " & Text5
' Viet vao cong so 2: Noi dung trong text 2345 cach nhau boi dau cach
Close #2 ' Dong cong so 2
Text2.Text = " "
Text3.Text = " "
Text4.Text = " "
Text5.Text = " "
'dua ket qua len file Listbox
End Sub
b.Chọn 2 quan hệ và thực hiện tính toán.
Code:
Private Sub Dir1_Change()
File1.Path = Dir1.Path ‘Khi duong dan dir1 thay doi thi File 1 se thay doi theo
End Sub
Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive ‘khi duong dan Drive1 thay doi thi dir1 cung thay doi theo
End Sub
*Để hiển thị nội dung các File mình đã chọn lên Listbox ta sử dụng code cho việc click vào File đó.
Private Sub File1_Click()
Dim i, filename, FileNumber, anItem
filename = App.Path
If Right(filename, 1) "\" Then filename = filename & "\"
filename = filename & File1.filename ‘Lay duong dan hien tai
FileNumber = FreeFile
Open filename For Input As FileNumber
List1.Clear ' Xoa listbox truoc
Do While Not EOF(FileNumber)
Line Input #FileNumber, anItem
List1.AddItem anItem
Loop
Close FileNumber
Call getFileName ‘Goi ham hien thi File
End Sub
C.Phép toán và các nút lệnh
*Chọn phép toán
Lưu ý là khi chọn các phép chiếu và phép kết nối thì sẽ có các text box hiện ra cho ta nhập dữ liệu vào.
*Nút lệnh tính toán.
-Đọc file dạng text vào mảng 2 chiều
Dim m As String
Open filName For Input As #3
Dim h1 As Integer
Dim ms() As String
Line Input #3, m
h1 = CInt(Val(Left(m, 1)))
ReDim matranA(h1, 3) As Integer
For k = 1 To h1
Line Input #3, m
ms = Split(m, " ")
For l = 0 To 3
matranA(k, l) = CInt(Val(ms(l)))
Next
Next
Close #3
-Hàm chèn
Public Function insert(a() As Integer, c() As Integer)
dung = True
l = 0
For k = 0 To 3
If c(l, k) = "" Then
c(l, k) = a(l + 1, k)
Else
If c(l, 1) = a(l + 1, 1) Then
Exit For
Else
l = l + 1
End If
End If
Next
-Phép giao
For I = 1 To h1
dung = True
For k = 1 To h2
If matranA(I, 0) = matranB(k, 0) And dung Then
Call insert(matranA(), matranC())
Else: k = k + 1
End If
Next
Next
-PHEP HOP
'Dua ma tran A vao mang C
For I = 1 To h1
For j = 0 To 3
Call insert(matranA(), matranC())
Next
Next
'Dua ma tran B vao mang C
For I = 1 To h2
For j = 0 To 3
Call insert(matranB(), matranC())
Next
Next
-Phép trừ
For j = 1 To h1
dung = True
For k = 1 To h2
If matranA(j, 0) = matranB(k, 0) And dung Then
dung = True
Else
Call insert(matranA(), matranC())
End If
Next
Next
-Phép chiếu
a = Val(Text9.Text)
b = Val(Text8.Text)
For j = 1 To h1
For I = 0 To 3
If a = I Or b = I Then
matranC(j, 0) = matranA(j, a)
matranC(j, 1) = matranA(j, b)
End If
Next
Next
-Lưu kết quả tính toán dưới dạng file Ketqua.txt
Open App.Path & "Ketqua.txt" For Output As filenum
Print #filenum, h1; ""; c1
For f = 1 To h1
m = ""
For g = 1 To c1
m = m & matranA(f - 1, g - 1) & " "
Next
Print #filenum, m
Next
Close #filenum
*/Nút lệnh hiển thị kết quả
Private Sub Command4_Click()
Dim i, filename, FileNumber, anItem
filename = App.Path
If Right(filename, 1) "\" Then filename = filename & "\"
filename = filename & "ketqua.txt"
FileNumber = FreeFile
Open filename For Input As FileNumber
List1.Clear ' Xoa listbox truoc
Do While Not EOF(FileNumber)
Line Input #FileNumber, anItem
List1.AddItem anItem
Loop
Close FileNumber
End Sub
5.Kiểm thử
-Việc nhập dữ liệu vào File text thành công.
Khi nhấn nút lệnh refresh thì file ta nhập sẽ hiện ra.
Khi ta chọn File đó thì kết quả sẽ được hiển thị trên List1 (Hiển thị)
-Sau khi chọn 2 file muốn tính toán. Ta click vào phép toán để chọn phép toán cần tính toán. Nhấn vào Button Tính toán và tiếp đó nhấn nút Kết quả để có thể xem được kết quả mà ta vừa tính ở trên. Dưới đây là kết quả thu được.
Ngoài ra việc hiển thị trên Menu cũng được coi trọng
*Khi click vao menu Hướng dẫn thì sẽ xuất hiện 1 Form hướng dẫn cách thực hiện.
Để hiển thị nội dung lên hướng dẫn ta có đoạn Code sau:
Private Sub Form_Load()
Dim I, filename, FileNumber, anItem
filename = App.Path
If Right(filename, 1) "\" Then filename = filename & "\"
filename = filename & "huongdan.txt"
FileNumber = FreeFile
Open filename For Input As FileNumber
List1.Clear ' Xoa listbox truoc
Do While Not EOF(FileNumber)
Line Input #FileNumber, anItem
List1.AddItem anItem
Loop
Close FileNumber
End Sub
*Đồng thời khi click vào About me sẽ hiển thị 1 Form nói về tác giả
Đây là giao diện nên ta không cần Code phức tạp.
III/Kết quả đạt được.
1.Kết quả kiểm thử
Hầu như việc nhập và tính toán đều thành công. Các phép toán thực hiện tốt và cho kết quả như mong muốn.
2.Các lỗi phát sinh
-Muốn thực hiện tính toán mà chưa chọn các File để tính toán cũng gây ra lỗi.
-Việc nhập dữ liệu không cẩn thận cũng phát sinh ra lỗi do việc đưa File text vào mảng 2 chiều không đạt đúng yêu cầu. File text ko có hình dạng ma trận đúng kiểu.
IV/Nhận xét, đánh giá, đề xuất
1.Nhận xét:Nhìn chung đồ án chạy tốt, cho ra kết quả đúng như mong muốn.
Tuy nhiên còn một số lỗi phát sinh trong quá trình thực hiện như trên phần kiểm lỗi.
2.Đề xuất
Do thời gian còn hạn chế và việc nghiên cứu chưa thật sâu nên còn có nhiều sai sót.
Em mong rằng có thêm thời gian để chỉnh sửa lại thêm phần kiểm lỗi để có thể hoàn thiện chương trình hơn.
Em xin cảm ơn thầy giáo hướng dẫn là thầy Nguyễn Đức Mận đã nhiệt tình giúp đỡ em hoàn thành đồ án này.
Xin chân thành cảm ơn thầy cô và các bạn đã tạo điều kiện cho em thực hiện tốt đồ án.